String(字符串)
- 简介:String 是 Redis 最基础的数据结构类型,它是二进制安全的,可以存储图片
- 或者序列化的对象,值最大存储为 512M
- 简单使用举例: set key value、get key等
- 应用场景:共享 session、分布式锁,计数器、限流。
- 内部编码有 3 种,int(8字节长整型)/embstr(小于等于 39字节字符串)/ raw(大于 39个字节字符串)
C 语言的字符串是 char[]实现的,而 Redis 使用 SDS(simple dynamic
string) 封装,sds 源码如下:
struct sdshdr{
unsigned int len; // 标记buf的长度
unsigned int free; // 标记buf中未使用的元素个数
char buf[]; // 存放元素的数组
}
Redis 为什么选择 SDS 结构,而 C 语言原生的 char[]不香吗?
举例其中一点,SDS 中,O(1)时间复杂度,就可以获取字符串长度;而 C 字符串,需要遍历整个字符串,时间复杂度为 O(n)
Hash(哈希)
- 简介:在 Redis 中,哈希类型是指 v(值)本身又是一个键值对(k-v)结构
- 简单使用举例:hset key field value、hget key field
- 内部编码:ziplist(压缩列表) 、hashtable(哈希表)
- 应用场景:缓存用户信息等。
- 注意点:如果开发使用 hgetall,哈希元素比较多✁话,可能导致 Redis 阻塞, 可以使用 hscan。而如果只是获取部分 field,✁议使用 hmget。
List(列表)
- 简介:列表(list)类型是用来存储多个有序✁字符串,一个列表最多可以存储
- 2^32-1 个元素。
- 简单实用举例: lpush key value [value ...] 、lrange key start end
- 内部编码:ziplist(压缩列表)、linkedlist(链表)
- 应用场景: 消息队列,文章列表,
list 应用场景参考以下:
lpush + lpop = Stack(栈)
lpush + rpop = Queue(队列)
lpush + ltrim = Capped Collection(有限集合)
lpush + brpop = MQ(消息队列)
Set(集合)
- 简介:集合(set)类型也是用来保存多个✁字符串元素,但是不允许重复元素
- 简单使用举例:sadd key element [element ...]、smembers key
- 内部编码:intset(整数集合)、hashtable(哈希表)
- 注意点:smembers 和 lrange、hgetall 都属于比较重的命令,如果元素过多存 在阻塞Redis的可能性,可以使用 sscan 来完成。
- 应用场景: 用户标签,生成随机数抽奖、社交需求。
有序集合(zset)
- 简介:已排序的字符串集合,同时元素不能重复
- 简单格式举例:zadd key score member [score member ...],zrank key member
- 底层内部编码:ziplist(压缩列表)、skiplist(跳跃表)
- 应用场景:排行榜,社交需求(如用户点赞)。