乐趣区

关于redis:redis

数据结构
  1. 字符串
    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. 哈希

      1. 先计算哈希值
      2. 计算索引值,而后放到 hash 表上
  2. 列表

    type listNode struct {
     next *listNode
     pre  *listNode
     val 
    }
    
    redis 链表是一个双向的
  3. 汇合

    汇合的中的元素无无序的,所以不能依据下标返回,只能返回所有
    汇合能够计算并集,交加,差集,判断元素是否属于汇合,随机返回一个汇合或者多个汇合
    实现形式:intset
    typedef struct intset {
    uint32_t encoding;
    uint32_t length;
    int8_t contents[];} intset;
    intset 数据是有序的,从小到大排序,能够进行二分查找
  4. 有序汇合
    1. 压缩列表
    2. 跳表

redis 过期策略和内存淘汰策略
过期策略:

  1. 定期删除策略:每隔一段时间从过期的 key 中,随机筛选一部分 key 进行删除(100ms 运行一次)
  2. 惰性删除策略:当拜访过期 key 的时候进行删除。
  3. 定时删除:在设置过期的键的同时,发明一个定时器,等到过期的到来时,立即删除(对 cpu 不敌对)

redis 采纳惰性删除,和定期删除策略

惰性删除可能保障获取曾经过期的 key 必定会删除,不会影响业务,
定期删除的话,必定有些 key’ 没有被删除掉,且不会拜访,就会始终留在内存外面,
这样的话就会有内存淘汰策略

  1. 从所有的 key,设置过期工夫的 key,采纳 lru 算法
  2. 从所有的 key,设置过期工夫的 key,采纳随机淘汰的算法
  3. 从设置了过期工夫的 key,看那个最先过期,就淘汰那个
  4. 不淘汰,写入间接返回谬误
退出移动版