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. 不淘汰,写入直接返回错误

你可能感兴趣的:(redis)