Redis
Redis
MR.XSSRedis
Spring data Redis
yml文件
1 | redis: |
RedisTemplate
修改序列化器,防止出现一些问题
使用Json序列化器,会将类的全限定名写进redis
为了节省空间,我们并不会使用JSON序列化器来处理value,二十使用统一的String序列化器,要求只能存储String类型的Key和Value。当需要存储java对象时,手动完成对象序列化和反序列化
StringRedisTemplate
使用StringRedisTemplate,它的Key和Value序列化方式默认使用String序列化器
缓存更新策略
低一致性需求:使用Redis自带的内存淘汰策略
高一致性需求:主动更新,并以超时剔除作为兜底方案
读操作:
缓存命中直接返回
缓存未命中,查询数据库,并且设置超时时间
写操作:
先写数据库,然后删除缓存
要确保数据库与缓存操作的原子性
缓存穿透
缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求全会打到数据库上。
常见的解决方案由两种:
- 缓存空对象:
- 优点:实现简单,方便维护
- 缺点:
- 额外的内存消耗
- 可能造成短时间的不一致
- 布隆过滤
- 优点:内存占用少,没有多余key
- 缺点:
- 实现起来复杂
- 存在误判可能
缓存雪崩
缓存雪崩是指在同一段时间大量的Key同时失效或者Redis服务宕机,导致大量请求到达数据库,给数据库带来大量压力
解决方案:
- 给不同Key的TTL添加随机值
- 利用redis集群提高服务可用性
- 给缓存业务添加降级限流策略
- 给业务添加多级缓存
缓存击穿
缓存击穿问题也叫做热点Key问题,就是一个高并发访问且缓存重建业务比较复杂的Key突然失效了,无数的请求访问到数据库,给数据库带来巨大的压力
解决方案:
- 互斥锁
- 优点
- 没有额外内存消耗
- 保持一致性
- 实现简单
- 缺点
- 线程等待,性能降低
- 可能有死锁风险
- 优点
- 逻辑过期
- 优点:线程无需等待,性能较好
- 缺点
- 不保证一致性
- 有额外内存消耗
- 实现复杂
Comment
匿名评论隐私政策