① 利用jemalloc特性进行优化
大键值对,延长写入和读取耗时、延长持久化需要时间,延长网络传输时间,并且占用内存多,更容易触发内存淘汰机制.尽量缩短存储长度,必要时进行压缩和序列化
Redis的serverCron函数定期清除过期键,节约内存占用,避免键值对过多堆积,频繁触发内存淘汰机制
LRU(Least Recently Used,最近最少使用)原理:使用链表保存缓存数据,越靠近表头,存放的数据访问时间越近.当有新数据时插入表头,当有缓存命中时,将数据移至表头,当内存不足时,丢弃表尾数据
缺点是类似全表扫描时,会将链表数据污染
LFU(Least Frequently Used,最不经常使用策略)原理:记录内存块的使用次数,回收时,按照访问次数排序,当缓存不足时,将使用频率最低的内存释放.
缺点是短时间内大量访问的数据很难删除
①?Redis缓存淘汰策略noeviction:不淘汰任何数据,当内存不足时,新增操作会报错,Redis 默认内存淘汰策略;
allkeys-lru:淘汰整个键值中最久未使用的键值;
allkeys-random:随机淘汰任意键值;
volatile-lru:淘汰所有设置了过期时间的键值中最久未使用的键值;
volatile-random:随机淘汰设置了过期时间的任意键值;
volatile-ttl:优先淘汰更早过期的键值;
volatile-lfu:淘汰所有设置了过期时间的键值中,最少使用的键值;
allkeys-lfu:淘汰整个键值中最少使用的键值;
删除大键值对比较耗时,造成主线程的阻塞,为此将删除的操作放在子线程中.共有四项配置:
lazyfree-lazy-eviction:当Redis运行内存超过最大内存,是否启用lazy free
lazyfree-lazy-expire:当设置了过期键,在键过期之后,是否启用lazy free
lazyfree-lazy-server-del:有些命令会隐式删除键,比如rename命令,对这些命令执行时是否启用lazy free
slave-lazy-flush:从节点加载主节点的RDB文件前,会运行flushall清理原有数据,此时是否启用lazy free
Redis大部分的读写命令的时间复杂度在O(1)到O(N)之间.对于O(N)的命令,需要谨慎使用,如果执行时间过长,将会阻塞Redis
禁用Keys
避免一次查询所有键,使用scan命令进行分批遍历
控制Hash、Set、Sorted Set结构的数据大小
使用slowlog命令找出高耗时的Redis命令.慢查询的配置项:
slowlog-log-slower-than:慢查询评定的时间阈值,单位微妙
slowlog-max-len:配置慢查询日志的最大记录数
在设置过期时间时,加入随机数.
RDB持久化,可能存在一定时间内的数据丢失.AOF持久化,文件较大时执行较慢,影响启动速度.在非必须持久化操作时,可以关闭持久化,避免间歇性的卡顿(serverCron函数周期性执行持久化操作)
使用Redis连接池,减少网络传输次数和非必要调用指令.
import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig;
Redis分布式架构有:
主从同步:读写分离
哨兵:自动容灾
Redis Cluster集群:多读多写,高扩展(集群可添加节点)高可用(某主节点无从节点自动将其他主节点多余的从节点转移),自动容灾
使用物理机非虚拟机.虚拟机和物理机共享物理网口,并且一台物理机可能有多个虚拟机运行,在内存占用和网络延迟上性能较差
解决方案:过期时间设置加入随机数
缓存中没有(过期),但数据库中存在数据.此时大量并发请求访问这部分数据,数据库压力陡增.缓存雪崩是大量的缓存击穿.
解决方案:
①设置热点数据永不过期
public String getData(String key) throws Exception{ String data = redis.get(key); if(data == null){ if(lock.tryLock()){ data = redis.get(key); if(data == null){ //查询数据库 data = mysql.select(); redis.set(key,data); }else{ return data; } }else{ Thread.sleep(1000); return getData(key); } } return data; }
缓存和数据库中都没有某数据,但有大量的并发请求查询这些数据.导致数据库宕机,主要考虑是漏洞攻击
① 接口层加校验,譬如用户鉴权
以上就是土嘎嘎小编为大家整理的Redis性能调优相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!