数据结构
- 字符串
getset:返回旧值,设置新值
setnx key value 如果key不存在的话设置,没有工夫参数
setex key 60 value,key存在的时候设置,并且有工夫参数
// sds数据结构type sds struct { free int len int buffers []int}1. sds 和c比拟 1. 获取长度O(1),c是O(N) 2. 杜绝了缓冲区的溢出,因为c不查看字符串的长度,很容易笼罩到其余字符串 3. 内存重调配次数,C操作的字符串数组,每次减少或者删除,都要进行内存调配操作,遗记开释内存,会导致内存泄露,减少不查看,会导致缓冲区溢出,内存重调配可能会进行零碎调用,影响性能 4. redis 采纳空间预调配,和惰性开释,保障字符串的扩大和缩容高效。 5. 二进制平安2. 编码方式 1. int编码,如果整数能用long示意的 2. embstr编码:redis对象和sds在空间是上间断的,调配一次内存 小于44字节 3. raw:redis对象和sds对象不在一起,内存调配两次
哈希
1. 先计算哈希值 2. 计算索引值,而后放到hash表上
列表
type listNode struct { next *listNode pre *listNode val }redis 链表是一个双向的
汇合
汇合的中的元素无无序的,所以不能依据下标返回,只能返回所有汇合能够计算并集,交加,差集,判断元素是否属于汇合,随机返回一个汇合或者多个汇合实现形式:intsettypedef struct intset {uint32_t encoding;uint32_t length;int8_t contents[];} intset;intset 数据是有序的,从小到大排序,能够进行二分查找
- 有序汇合
1.压缩列表
2.跳表
redis 过期策略和内存淘汰策略
过期策略:
- 定期删除策略:每隔一段时间从过期的key中,随机筛选一部分key进行删除(100ms运行一次)
- 惰性删除策略:当拜访过期key的时候进行删除。
- 定时删除: 在设置过期的键的同时,发明一个定时器,等到过期的到来时,立即删除(对cpu不敌对)
redis采纳惰性删除,和定期删除策略
惰性删除可能保障获取曾经过期的key必定会删除,不会影响业务,
定期删除的话,必定有些key'没有被删除掉,且不会拜访,就会始终留在内存外面,
这样的话就会有内存淘汰策略
- 从所有的key,设置过期工夫的key,采纳lru算法
- 从所有的key,设置过期工夫的key,采纳随机淘汰的算法
- 从设置了过期工夫的key,看那个最先过期,就淘汰那个
- 不淘汰,写入间接返回谬误