redis

头像
mouse
    阅读 1 分钟
    数据结构
    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. 不淘汰,写入直接返回错误

    备份

    1. aof 和rdb

    mouse
    1 声望1 粉丝