redis ,基于key-value的数据存储系统,存储在内存中,读取速度快,支持持久化。
基本数据类型
- String (字符串)
- Hash(哈希)
- List(列表)
- Set(集合)
- Sorted-Set(有序集合)
数据结构
不同的数据类型在redis当中有着不同的存储方式:
String
使用int/SDS进行存储,整数类型的数据使用int进行存储,复杂类型(字节类型,字符类型,浮点类型)使用SDS(simple dynamic string)进行存储。
当字符串长度小于1M时,每次扩容时加倍现有的空间,如果超过1M,每次扩容只会多扩容1M的空间,最大512M,
字符串最大长度512M
list
redis3.2之前使用linklist和ziplist进行存储,3.2之后采用quicklist(linklist+quicklist,由ziplist组成的双向链表,每个节点都是一个ziplist)进行存储。
应用场景:消息队列(lpush+brpop)、栈(lpush+lpop)
hash
数据结构:dict
Rehash:在dict内部,维护了两张哈希表,一张表时旧表,一张表时新表,当hashtable的大小需要动态变化时,旧表中的数据迁移到新表中,下一次变化,当前的新表又变成旧表。
渐进式rehash:为了避变rehash对服务器性能造成影响,服务器不是一次性将ht[0]中的所有键值对全部rehash到ht[1]中的,而是分多次、渐进式的:
- 为ht[1]分配空间,让dict同时有ht[0]和ht[1]两个哈希表;
- 在字典中维护一个索引计数器变量rehashidx,并将它的值设置为0;
- 在rehash进行时,每次对字典执行添加、删除、查找或更新操作时,程序除了执行指定的操作以外,还会顺带将ht[0]在rehashidx索引上 所有键值对rehash到ht[1],当rehash工作完成后,程序将rehash属性的值增1;
- 随着dict字典操作的不断执行,最终在某个时间点,ht[0]上的键值对都会被rehash到ht[1]上,此时rehashidx的值变为-1,rehash过程结束。
使用场景:存储key-value格式的对象信息
set
数据结构:intset/hashtable(使用hashtable时,仅用key,value为null)。
使用场景:共同好友列表
sorted set
数据结构:ziplist/skiplist+hashtable
使用场景:带有权重的元素列表,排行榜。
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!