redis数据结构
String(字符串)
它是二进制安全的,可以存储图片或者序列化的对象,值最大存储为512M
底层实现
-
内部编码:
- int(8字节长整型)
- embstr(小于等于39字节字符串)
- raw(大于39个字节字符串)
-
SDS(字符串数据结构)
struct SDS<T> { T capacity; // 数组容量 T len; // 数组长度 byte flags; // 特殊标识位,不理睬它 byte[] content; // 数组内容 }
常用命令
set key expire value
setnx key value
incr key #key的值加1
incyby key num key的值加num
get key
del key
mset key1 value1 key2 value2
mget key1 key2
应用场景
共享session、分布式锁,计数器、限流
List(链表)
列表(list)类型是用来存储多个有序的字符串,一个列表最多可以存储2^32-1个元素。
底层实现
-
内部编码:
- ziplist(压缩列表)
- linkedlist(链表)串)
常用命令
- lpush+lpop=Stack(栈)
- lpush+rpop=Queue(队列)
- lpsh+ltrim=Capped Collection(有限集合)
- lpush+brpop=Message Queue(消息队列)
- lindex 相当于 Java 链表的 get(int index)方法
- ltrim start_index end_index 截取start到end区间的值 负数表示倒数例如-2表示倒数第二个数
应用场景
实现数据结构:栈、队列 有序集合 、消息队列
Hash(字典)
与java中的HashMap相似,无序字典,不同的是该结构只能存储字符串,以及在发生hash碰撞时进行rehash方式不同,redis采用渐进式rehash。
渐进式 rehash 会在 rehash 的同时,保留新旧两个 hash 结构,查询时会同时查询两个 hash 结构,然后在后续的定时任务中以及 hash 的子指令中,循序渐进地将旧 hash 的内容 一点点迁移到新的 hash 结构中。
set
Redis 的集合相当于 Java 语言里面的 HashSet,它内部的键值对是无序的唯一的
底层实现:
- intset(整数集合)
- hashtable(哈希表)
应用场景:
用户标签,生成随机数抽奖、社交需求。
set 结构可以用来存储活动中奖的用户 ID,因为有去重功能,可以保证同一个用户不会中奖两次
zset
已排序的字符串集合,同时元素不能重复
底层实现
- ziplist(压缩列表)
- skiplist(跳跃表)
应用场景:
排行榜,社交需求(如用户点赞)。
zset 可以用来存粉丝列表, value 值是粉丝的用户 ID, score 是关注时间
zset 还可以用来存储学生的成绩, value 值是学生的 ID, score 是他的考试成绩 获取排名