数据结构
- 字符串
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 链表是一个双向的
-
汇合
汇合的中的元素无无序的,所以不能依据下标返回,只能返回所有 汇合能够计算并集,交加,差集,判断元素是否属于汇合,随机返回一个汇合或者多个汇合 实现形式:intset typedef 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,看那个最先过期,就淘汰那个
- 不淘汰,写入间接返回谬误