redis扩容
redis支持的数据结构:Strig字符串字由于C的char类型(字符串)结尾需要有\0标记字符串的结束,所以redis的字符串类型不能保存带有空格的信息
数据结构: 对于存储长度
sdshdr5 2^5-1
sdshdr8 2^8-1
sdshdr16 2^16-1
sdshdr32 2^32-1
sdshdr64 2^64-1
使用场景
1.服务器session序列化之后存入redis缓存
2.ip限制incr短信认证
namespace:命名Key的冲突
redis支持的数据结构:列表类型List
使用双向链表实现
可以存储有序的字符串列表
可以向两边添加值
是key-value的结构形式
单key可以对应多个value
3.2版本之前对象使用linkedlist(双向链表:元素个数较多,或者单个元素字符较长)(内存开销大,两端插入或者删除较快)和
ziplist(压缩链表:元素个数较少,或者单个元素字符较短)(内存消耗小,插入删除需要频繁申请和释放内存,效率较低);
3.2之后使用quicklist(双向链表:基于ziplist的一个linkedlist,linkedlist的每一个元素都是ziplist)quicklistLZF
list的使用场景
消息队列:生产者-redis-消费者
lpush(左边存数据)-redis-brpop(右边取数据) b(阻塞)
栈:后进先出
lpush-redis-lpop
队列:先进先出
lpush-redis-rpop(右边取数据)
hash类型(散列,哈希表)两种结构hash/ziplist(数据量小)
key-table((filed-value)(filed-value)。。。)结构不能嵌套
hash的数据结构:
dictEntry(buckets)
dictht(用户存放dictEntry的地址)
dict(hash的核心用于计算rehashidx的,hash扩容)包括2个dictEntry,分别为dictht[0],dictht[1]
在扩容的时候将dictht[0]中的buckets复制到dictht[1]中并且是扩容后的buckets,然后重新通过
计算murmur(key)%(bucket的数量)计算新的hash值,dictht[0]中的需要扩容的dictEntry重新插入
dictht[1]对应dictEntry的相应位置
使用场景
用于存储一些对象
集合类型set(无序不能重复)
数据结构 intset(当只包含整数类型时)(数组) hashtable(key-value(设置为空null))与java的set相同
使用场景
标签,去重,diff并集,交集等做一些共同好友之类的
有序集合sorted-set
key-(score(等级/分数)用于排序-value)
数据结构ziplist或者skiplist(跳跃表)+hashtable
skiplist-有序的链表:(变种的二分法)首先是一个随机算法计算出一个level(层级)
在插入数据的时候会先用计算出的层数去和现有的最高层的第一个数
进行对比,如果小则寻找下一层(level不一定是连续的)的第一个数值再次
进行对比,直到找到相应的位置,如果大于则跟最高层的第二个数进行比较,直到找到相应的位置
热门文章或者新闻的排序