年薪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 我们将第一时间删除。

相关素材