目录
- 1、 String(字符串)
- 2、 Hash(哈希)
- 3、 List(列表)
- 4、 Set(集合)
- 5、 sorted set(有序集合ZSet)
字符串(String)、哈希表(hash)、列表(list)、集合(set)、有序集合(sorted set),Bitmap(位图),HyperLogLogs(基数统计)、geospatial (地理位置)、Stream(消息队列)
1、 String(字符串)
- String类型是redis的最基础的数据结构,也是最经常使用到的类型。
String 类型的值最大能存储 512MB
,String类型是二进制安全的,意思是 redis 的 String 可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。
使用命令
命令 | 简述 | 使用 |
---|---|---|
GET | 获取存储在给定键中的值 | GET key |
SET | 设置存储在给定键中的值 | SET key value |
MSET | 批量添加多个String类型的键值对 | MSET key1 value1 key2 value2 |
MGET | 根据多个key获取多个String类型的value | MGET key1 key2 |
DEL | 删除存储在给定键中的值 | DEL key |
INCR | 将键存储的值加1 | INCR key |
DECR | 将键存储的值减1 | DECR key |
INCRBY | 将键存储的值加上整数 | INCRBY key amount |
DECRBY | 将键存储的值减去整数 | DECRBY key amount |
SETNX | 添加一个String类型的键值对,前提是这个key不存在,否则不执行 | SETNX key value |
SETEX | 添加一个String类型的键值对,并且指定有效期 | SETEX key timeout value |
应用场景
缓存功能
:经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力。计数器
:许多系统都会使用redis作为系统的实时计数器,可以快速实现计数和查询的功能。而且最终的数据结果可以按照特定的时间落地到数据库或者其它存储介质当中进行永久保存。统计多单位的数量
:eg,uid:gongming count:0 根据不同的uid更新count数量。共享用户session
:用户重新刷新一次界面,可能需要访问一下数据进行重新登录,或者访问页面缓存cookie,这两种方式做有一定弊端,1)每次都重新登录效率低下 2)cookie保存在客户端,有安全隐患。这时可以利用redis将用户的session集中管理,在这种模式只需要保证redis的高可用,每次用户session的更新和获取都可以快速完成。
2、 Hash(哈希)
- Redis hash数据结构 是一个键值对(key-value)集合,它是一个 string 类型的 field 和 value 的映射表,redis本身就是一个key-value型数据库,因此hash数据结构相当于在value中又套了一层key-value型数据。所以redis中
Hash数据结构特别适合存储关系型对象
。
命令使用
命令 | 简述 | 使用 |
---|---|---|
HSET | 添加键值对 | HSET hash-key sub-key1 value1 |
HGET | 获取指定散列键的值 | HGET hash-key key1 |
HGETALL | 获取散列中包含的所有键值对 | HGETALL hash-key |
HDEL | 如果给定键存在于散列中,那么就移除这个键 | HDEL hash-key sub-key1 |
应用场景
- 由于hash数据类型的key-value的特性,用来
存储关系型数据库中表记录
,是redis中哈希类型最常用的场景。一条记录作为一个key-value,把每列属性值对应成field-value存储在哈希表当中,然后通过key值来区分表当中的主键。 - 经常被用来
存储用户相关信息
。优化用户信息的获取,不需要重复从数据库当中读取,提高系统性能。
3、 List(列表)
- list类型是用来
存储多个有序的字符串
,列表当中的每一个字符看做一个元素 - 一个列表当中可以存储有一个或者多个元素,redis的
list支持存储2^32次方-1个元素
。 - redis可以从列表的两端进行插入(push)和弹出(pop)元素,支持读取指定范围的元素集,或者读取指定下标的元素等操作。redis列表是一种比较灵活的链表数据结构,它可以充当队列或者栈的角色。
- redis列表是链表型的数据结构,所以它的
元素是有序的
,而且列表内的元素是可以重复的
。意味着它可以根据链表的下标获取指定的元素和某个范围内的元素集。
命令使用
命令 | 简述 | 使用 |
---|---|---|
RPUSH | 将给定值推入到列表右端 | RPUSH key value |
LPUSH | 将给定值推入到列表左端 | LPUSH key value |
RPOP | 从列表的右端弹出一个值,并返回被弹出的值 | RPOP key |
LPOP | 从列表的左端弹出一个值,并返回被弹出的值 | LPOP key |
LRANGE | 获取列表在给定范围上的所有值 | LRANGE key 0 -1 |
LINDEX | 通过索引获取列表中的元素。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。 | LINDEX key index |
使用列表的技巧
- lpush+lpop=Stack(栈)
- lpush+rpop=Queue(队列)
- lpush+ltrim=Capped Collection(有限集合)
- lpush+brpop=Message Queue(消息队列)
应用场景
消息队列
:reids的链表结构,可以轻松实现阻塞队列,可以使用左进右出的命令组成来完成队列的设计。比如:数据的生产者可以通过Lpush命令从左边插入数据,多个数据消费者,可以使用BRpop命令阻塞的“抢”列表尾部的数据。文章列表
或者数据分页展示
的应用。比如,我们常用的博客网站的文章列表,当用户量越来越多时,而且每一个用户都有自己的文章列表,而且当文章多时,都需要分页展示,这时可以考虑使用redis的列表,列表不但有序同时还支持按照范围内获取元素,可以完美解决分页查询功能。
4、 Set(集合)
- redis集合(set)类型和list(列表)类型类似,都可以用来存储多个字符串元素的集合。
set集合中元素不重复
、set集合中元素无序,不存在元素下标
。- redis的set类型是使用哈希表构造的,因此复杂度是O(1),它支持集合内的增删改查,并且
支持多个集合间的交集、并集、差集操作
。可以利用这些集合操作,解决程序开发过程当中很多数据集合间的问题。
- 命令使用
命令 | 简述 | 使用 |
---|---|---|
SADD | 向集合添加一个或多个元素 | SADD key value |
SREM | 移除set中的指定元素 | SREM key member |
SCARD | 返回set中元素的个数 | SCARD key |
SMEMBERS | 获取set中的所有元素 | SMEMBERS key member |
SISMEMBER | 判断一个元素是否存在于set中 | SISMEMBER key member |
SINTER | 求key1与key2的交集 | SINTER key1 key2 |
SDIFF | 求key1与key2的差集 | SDIFF key1 key2 |
SUNION | 求key1和key2的并集 | SUNION key1 key2 |
应用场景
标签
:给用户添加标签,或者用户给消息添加标签,这样有同一标签或者类似标签的可以给推荐关注的事或者关注的人。共同好友功能
,共同喜好,或者可以引申到二度好友之类的扩展应用。统计网站的独立IP
。利用set集合当中元素不唯一性,可以快速实时统计访问网站的独立IP。点赞、收藏
5、 sorted set(有序集合ZSet)
Redis的SortedSet是一个可排序的set集合,所以它保留了集合中元素不能重复的特性
,但是不同的是,有序集合给每个元素多设置了一个分数,利用该分数作为排序的依据
,有序查询速度快,有序集合的成员是唯一的, 但分数(score)却可以重复
。
有序集合是通过两种数据结构实现:
- 压缩列表(ziplist): ziplist是为了提高存储效率而设计的一种特殊编码的双向链表。它可以存储字符串或者整数,存储整数时是采用整数的二进制而不是字符串形式存储。它能在O(1)的时间复杂度下完成list两端的push和pop操作。但是因为每次操作都需要重新分配ziplist的内存,所以实际复杂度和ziplist的内存使用量相关
- 跳跃表(zSkiplist): 跳跃表的性能可以保证在查找,删除,添加等操作的时候在对数期望时间内完成,这个性能是可以和平衡树来相比较的,而且在实现方面比平衡树要优雅,这是采用跳跃表的主要原因。跳跃表的复杂度是O(log(n))。
命令使用
命令 | 简述 | 使用 |
---|---|---|
ZADD | 将一个带有给定分值的成员添加到有序集合里面 | ZADD zset-key 178 member1 |
ZRANGE | 根据元素在有序集合中所处的位置,从有序集合中获取多个元素 | ZRANGE zset-key 0-1 withccores |
ZREM | 如果给定元素成员存在于有序集合中,那么就移除这个元素 | ZREM zset-key member1 |
应用场景
排行榜
:有序集合经典使用场景。例如视频网站需要对用户上传的视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行。用Sorted Sets来做带权重的队列
,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。