1.批量处理
因为redis数据的网络传输是redis性能的瓶颈之一,所以我们希望一次性能传输多条命令,这样一般会比一条一条传输执行的效率更高。目前批量处理redis命令有三种方法。
- 原生的批量处理的redis命令,这种方法能够保证多条命令的原子执行,但是只能发送同类型的命令。
- pipeline,类似一个缓冲区,只有缓冲区积累了一定量的命令才能发送,但是不保证多条命令的原子性,可以发送不同类型命令。
- lua脚本,lua脚本能够原子性得执行多条命令,但是要保证lua脚本内的命令不能出错,也不能回滚。
如果上述三个方法处理的数据在不同的哈希槽,那么原子性也无法保证。
2.减少大key
big key就是某个key的value特别大,比如超过1MB。
big key 危害:
- big key查询,删除,可能会导致redis阻塞。因为big key的数据量很大,如果进行O(n)量级的查询对于客户端来说可能阻塞了,另外传输这种大数据的时候,对网络负担也比较大;删除big key的时候会释放大量内存,操作系统需要把释放掉的内存块插入一个空闲内存块的链表,以便后续进行管理和再分配。这个过程本身需要一定时间,而且会阻塞工作线程。
如何发现big key:redis-cli -p 6379 --bigkeys -i 3
如何处理big key:进行拆分,选用合适的数据结构。
3.合理处理hotkey
如何找到hotkey :hotkeys 参数,该参数能够返回所有 key 的被访问次数
如何处理:使用redis集群进行读写分离。
4.管理内存碎片
5.慢查询问题
使用 slow log-log-slower-than 参数设置耗时命令的阈值,并使用 slowlog-max-len 参数设置耗时命令的最大记录条数。SLOWLOG GET获取慢查询日志的内容