年薪50W-Redis系列-第二篇缓存设计与性能优化
发布于 2022-06-04 08:34
缓存穿透
查询一个根本不存在的数据。
解决:将同样找不到的id以value为null放到缓存,还可以用布隆过滤器
缓存失效
同一时间大批缓存数据失效,导致系统新能压力过高
解决:缓存失效时间错开,失效时间设定:int expireTime = new Random().nextInt(300) + 300;
缓存雪崩
缓存层支撑不住或者宕掉后,流量会像奔跑的野牛一样打向后端。
预防和解决:
1)保证缓存层服务高可用。比如使用集群
2)依赖隔离组件为后端限流并降级。比如使用Hystrx限流降级
3)提前演练。在演练时发现问题做一些预案
热点缓存key重建优化
使用redis的情况下利用锁机制,只让第一件去查询后端,其他的让其sleep,然后从缓存取。
开发规范和性能优化
一 键值设计
1.key名设计
1)以业务名或者数据库名字为前缀,用冒号分隔。
trade:order:1
2)简洁
保证语义前提下控制key长度,当key较多时,内存占用
user:{uid}:friends:messages:{mid} 简化为 u:{uid}:fr:m:{mid}
3)强制:不要包含特殊字符
反例:空格 换行 当双引号以及其他转义字符
2.value设计
1)强制:拒绝bigkey
redis中一个字符串最大512mb,字符串类型:一般认为超过10KB就是bigkey。非字符串:哈希 列表 集合 有序集合 他们的big体现在元素个数太多
一般来说,string类型控制在10KB以内,hash list set zset 元素个数不要超过5000.
非字符串的bigkey,不要使用del删除,使用hscan sscan zsan方式徐徐删除,同时要防止bigkey过期时间自动删除问题
优化思想
1.分拆
2.选择适合的数据类型
3.使用批量操作命令
4.使用管道pipeline
三 客户端使用
连接池参数含义
连接池使用
1,maxtotal:最大的连接数
2,maxidle:
3,minidle:
Redis缓存中首先减到maxidle 然后保留minidle,连接池一开始没有任何的连接;
连接池预热:启动时放一些连接到连接池中比如使用jedis.ping()
Redis对于过期键有三种清除策略
被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过 期key 主动删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰 一批已过期的key 当前已用内存超过maxmemory限定时,触发主动清理策略
本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。
相关素材