0、参考
1、 Redis 单线程的理解
为什么单线程:CPU不是性能瓶颈(内存和网络),单线程能够达到业务要求
网络IO和键值对读写都是由一个线程完成的
2、 Redis 多线程的理解
持久化(aof、rdb)、异步删除(big key)、数据复制(主从、哨兵、集群)采用多线程
3、 单线程IO的挑战:big key问题
正常情况下使用 del 指令可以很快的删除数据,而当被删除的 key 是一个非常大的对象时,例如时包含了成千上万个元素的 hash 集合时,那么 del 指令就会造成 Redis 主线程卡顿
Big Key问题本质是Big Value问题
3.0 模拟插入100w数据
for((i=1;i<=100*10000;i++)); do echo "set k$i v$1" >> /tmp/redisText.txt ;done;
cat /tmp/redisTest.txt | reids-cli -h 127.0.0.1 -p 6379 -a 111111 --pipe
3.1 big key 排查
每种数据类型最大的 key,会扫描整个数据库,建议在从节点执行
redis-cli --bigkeys
查看某个key的详细信息
debug object key
返回key的value实际使用内存估算值
memory usage key
redis-rdb-tools 工具
3.2 big key 删除
unlink key
flushall async
flushdb async
3.3 big key 优化
分割 big key
对象压缩
直接删除
4、 Redis 为什么快
IO多路复用(epoll实现):一个线程处理所有socket连接,避免上下文切换、多线程竞争
非阻塞IO:避免了IO 阻塞
基于内存操作:内存操作数据快
强大的数据结构:数据结构优化,时间复杂度低