Redis数据类型
KV形式存储,KEY是String,最大容量512M,V有以下几种类型:
- String:命令set,get;字符串,底层数据结构就是SDS
- Hash:命令hset,hget;entry数量少的时候用ziplist(节省空间,实际上不是链表,放在连续的空间里,性能比哈希差一点,取头尾元素是常数时间),高的时候用hashtable。哈希表
- List:命令lpush,lpop;底层用quicklist,双向链表,节点上是ziplist;有序集合,可以从左边加也可以从右边加
- Set:命令:sadd,spop;无序集合;假如全是整数,用intset,非正数用hashtable,当整数超过512个时也会用hashtable(存key)
- ZSet:命令:zadd,zrem;有序集合,基于score排序;元素个数低于128个且元素值小于64字节用ziplist存储;跳表+字典;跳表:利用level,给某些节点(随机生成)定义多层链表,越高层数量越小,从上往下查找,提高查询效率。
这些类型底层都是一个redisObject
SDS
redis用c语言实现的simple dynamice string,可实现动态字符串,还存储了len长度,低于44个字节的时候是embstr(内存空间连续),大于44会变成raw(分配2次内存空间),对embstr的字符进行修改也会直接变成raw。
Redis适用场景
- 缓存
- 分布式Session
- 分布式锁
- incr全局id
- incr计数器
- incr限流
- 位操作