SDS
SDS是Redis里的动态字符串表示方式,但是,查看Redis6.0.5源码SDS定义:
1 | typedef char *sds; |
what?这不就是简单的字符串指针吗?怎么就动态了?且慢,往后看。
Redis里面定义五种类型的SDS,他们的区别是header大小不一样,字符串指针sds始终指向buf的位置,然后通过指针移位来操作header里的字段。这里有个gcc c语言的属性__attribute__ ((__packed__))
设置,表示结构体内存布局紧凑排列,按1字节对齐,以节省内存。
1 | /* Note: sdshdr5 is never used, we just access the flags byte directly. |
Redis里面的sds始终指向动态字符串buf位置,在创建字符串类型的redisObject时,会分配实际buf长度的内存加上sds header的内存和一个字符串结束符位置的内存。然后在创建redisObject之前会根据实际字符串大小来选择需要添加的sds header
1 | // 根据字符串大小,选择sds类型(区别在header大小不一样) |
以类型SDS_TYPE_8为例,将为这种字符串类型的redisObject分配sizeof(redisObject) + sdshdr8 + len +1大小的内存,并设置sds的header指针位置,然后设置header属性,设置buf的值,最后添加字符串结束符’\0’
1 | /* Create a string object with encoding OBJ_ENCODING_EMBSTR, that is |
Redis数据类型
字符串String
Hash表
List列表:
LPUSH + BRPOP 实现消息队列,支持消息持久化,保证消息顺序性;不足的地方:不支持消息的消费确认,不能做广播模式,不能重复消费,不支持分组消费
LPUSH + LPOP 实现栈,先进后出
LPUSH + RPOP 实现队列,先进先出
LPUSH + LTRIM 实现有限队列
Set集合:
数据去重,交集、并集操作,实现共同关注等功能
Sorted Set有序集合:
各类排行榜,范围查找
HyperLogLog:
不精确(0.81%的错误率)的去重统计,比如:网站UV数、访问IP数等
Geo:
Stream:用于实现消息队列(支持消息ID自动生成,消息遍历,消息的阻塞和非阻塞读取,消息的分组消费,消息的消费确认,未完成消息的处理,消息队列监控)参考 http://www.hellokang.net/redis/stream.html#_10-%E5%91%BD%E4%BB%A4%E4%B8%80%E8%A7%88
Stream底层数据结构Radix树(基数树),可以看作是Trie树(字典树)的变种
基数树(长整型到对象的映射)
字典树(字符串到对象的映射)
PUB/SUB 订阅/发布 (用作消息队列,支持广播模式,支持消息即时推送,支持消费者同时订阅多个信道从而接受多类消息,不足的地方:不支持消息的消费确认,不能重复消费)
Redis每种数组类型在底层都是动态编码的,比如默认zset是以ziplist编码的,当zset个数超过128时,zset转换编码为skiplist。但是这种编码转换是不可逆的。比如再将zset元素减少到小于128时,zset编码依然是skiplist
Redis查看帮助
命令行下输入help @,再按tab键会提示可以查看help的数据类型
1 | 127.0.0.1:6379> help @string |
Redis配置信息内存占用查看
1 | INFO |