0%

Redis数据结构

使用redis很长时间了,常用的功能就是缓存以及分布式锁,记录redis一些数据结构,对redis相关的知识进行巩固,随着时间的推移,redis也从单线程进化为多线程处理网络IO提升性能。其实从redis 4.0的版本开始,redis就不再是单纯的单线程,而是增加了后台线程处理耗时任务,提升性能,后面通过redis的数据结构总结一些redis的使用方法。

数据结构

数据结构浅析

常用的数据结构有String,hash,set,list,zset(有序集合)。特殊的数据结构有bitmap,hyperLog,bloomFilter,GeoHash。通过这些结构我们可以做缓存,消息队列,二值统计,基数统计,布隆过滤器,附近的人等等。

String底层数据结构
  1. String

如果一个字符串对象保存的是整数值, 并且这个整数值可以用 long 类型来表示, 那么字符串对象会将整数值保存在字符串对象结构的 ptr 属性里面(将 void* 转换成 long ), 并将字符串对象的编码设置为 int 。
如果字符串对象保存的是一个字符串值, 并且这个字符串值的长度大于 39 字节, 那么字符串对象将使用一个简单动态字符串(SDS)来保存这个字符串值, 并将对象的编码设置为 raw。
如果字符串对象保存的是一个字符串值, 并且这个字符串值的长度小于等于 39 字节, 那么字符串对象将使用 embstr 编码的方式来保存这个字符串值。
2. List

列表对象的编码可以是 ziplist 或者 linkedlist 。
列表对象保存的所有字符串元素的长度都小于 64 字节并且保存的元素数量小于 512 个,使用 ziplist 编码;否则使用 linkedlist;
3. Hash

哈希对象的编码可以是 ziplist 或者 hashtable 。
哈希对象保存的所有键值对的键和值的字符串长度都小于 64 字节并且保存的键值对数量小于 512 个,使用ziplist 编码;否则使用hashtable;
4. Set

集合对象的编码可以是 intset 或者 hashtable 。
集合对象保存的所有元素都是整数值并且保存的元素数量不超过 512 个,使用intset 编码;否则使用hashtable;
5. Sorted Set

有序集合的编码可以是 ziplist 或者 skiplist
有序集合保存的元素数量小于 128 个并且保存的所有元素成员的长度都小于 64 字节。使用 ziplist 编码;否则使用skiplist;
接下来分别说说这些底层数据结构。