redis调优
总体思路:配置相关的参数(使用内存、key回收策略、持久化)+ 代码的书写应该不使用慢命令。
进过一段时间后查看相关参数进行调优。
数据量很大的时候采用集群。
-
内存使用率 used_memory
要避免发生内存交换。
内存交换发生的条件:当redis占用的内存超过了redis.conf中的maxmemory的值时,就会触发内存交换,会将redis内存中的数据写入到磁盘,腾出内存给新的活动页使用。
如何避免:
1、要分析系统中使用到的redis中key过期策略,如果集中数据设置了过期时间,则采用volatile-ttl,没有设置采用allkeys-lru,这样当超过内存时会触发策略。
2、持久化策略,如果是rdb,则需要限制最大使用内存为系统最大可用内存的45%。 -
尽可能的使用hash,因为Redis在储存小于100个字段的Hash结构上,其存储效率是非常高的。
-
redis数据持久化的两种方式和优劣
aof(apend only file:记录操作命令,用来恢复重启服务故障等导致的问题)
开启方式:appendonly yes
同步策略:每秒同步appendfsync everysec,效率和安全性兼顾的方案。
rdb :快照功能(redis datebase: 记录结果数据集)
一般是对于恢复数据比较多并且对于数据完整性要求不高的,可以用这种方式。 -
key回收策略
maxmemory-policy:一般都是选择1,2,4。
1、volatile-lru:使用LRU算法从已设置过期时间的数据集合中淘汰数据。
2、volatile-ttl:从已设置过期时间的数据集合中挑选即将过期的数据淘汰。
3、volatile-random:从已设置过期时间的数据集合中随机挑选数据淘汰。
4、allkeys-lru:使用LRU算法从所有数据集合中淘汰数据。
5、allkeys-random:从数据集合中任意选择数据淘汰
6、no-enviction:禁止淘汰数据。 -
缓存命中率低的原因:key生成后直到过期也没有被使用。
误区: 这个想象在并发情况下会提高。所以并不是说一定要优化。 -
redis慢指令优化
单线程,所以尽可能不要使用慢命令
参考这篇文章:慢指令总结
代码中少用慢指令,通过优化代码实现 -
延迟慢命令捕捉
配置文件中slowlog-log-slower-than 5000 表示捕获超过5毫秒的命令
slowlog get 10 获取10条慢命令数据 -
监控客户端连接数
-
redis内存碎片率
产生的原因:redis自己实现了内存管理,redis是根据数据的大小分配指定大小的内存,当数据大小改变时会导致部分内存没有回收,内存碎片率在1~1.5是正常。
计算公式:向os申请的内存大小 / redis使用的内存
解决办法:重启redis.
- redis集群的两种方式
多服务器的集群需要考虑hash一致性的问题:
一致性hash算法 php
这个当做了解。
单服务器多实例的集群
好处:读写分离,类似于mysql,理论上对于单线程的redis提升很大。
客户端连接一般的框架也支持。
还有一个好处是服务的可靠性。
方式:一是单纯的主从(一主多从)和 哨兵模式的主从(服务故障自动转移)
一般都是选择哨兵模式。看这个连接