读《Redis深度历险记》

数据结构

string

list

set

有序 set

hash

设计

内存回收机制

redis不会实时回收内存;
它的key是分页存放的,当一个页的所有key都被删除后,才会统一回收该页的内存;
虽然没有立即回收内存,但是不用的内存还是可以分配给新的key使用;
手动执行flushdb,可以立即回收内存。

过期机制

主节点

  • 懒汉式删除
  • 定时删除
    • 每10s一次
    • 从过期字典中随机抽取20个,删除当中已过期的key
    • 如果上一步中,已过期的key占20个的1/4以上,重复上一步
    • 为避免阻塞时间过长,整个循环不超过25ms

      从节点

      仅依靠主节点发送del指令

可能出现的问题

如果有大量key同时过期,此时客户端请求,服务端正好处于过期扫描中,那么至少要等待25ms(另外可能存在多个内存页的回收耗时)

建议

避免大量key同时过期,timeout += random(second)

原理

管道

pipeline的本质和单次发送命令差不多,只是变成了连续发送命令到服务端,省去多次等待IO的时间

避免大key

指的是大的value,以下情况容易造成卡顿:

  • 迁移
  • 扩容时申请内存

用scan扫描出大key,-i 每 scan 100条 sleep 0.1s

1
redis-cli --bigkeys -i 0.1

应用场景

分布式锁

限流

附近的人(坐标,两点间距离)

运维

客户端连接数

复制积压缓存区

安全

改写/禁用危险指令

改写 keys 为 rename_keys

1
rename-command keys rename_keys

禁用

1
rename-command keys ''

不用6379,加密码,走内网,非root启动red is

SSL代理-spiped

实在要走外网时

坚持原创技术分享,您的支持将鼓励我继续创作!