Redis

Redis

Spring data Redis

yml文件

1
2
3
4
5
6
7
8
9
10
redis:
host: 82.157.245.249
port: 6379
password: root
lettuce:
pool:
max-active: 10
max-idle: 10
min-idle: 1
time-between-eviction-runs: 10s

RedisTemplate

修改序列化器,防止出现一些问题

image-20230525100038187

使用Json序列化器,会将类的全限定名写进redis

image-20230525155846580

​ 为了节省空间,我们并不会使用JSON序列化器来处理value,二十使用统一的String序列化器,要求只能存储String类型的Key和Value。当需要存储java对象时,手动完成对象序列化和反序列化

StringRedisTemplate

使用StringRedisTemplate,它的Key和Value序列化方式默认使用String序列化器

缓存更新策略

  1. 低一致性需求:使用Redis自带的内存淘汰策略

  2. 高一致性需求:主动更新,并以超时剔除作为兜底方案

    • 读操作:

      缓存命中直接返回

      缓存未命中,查询数据库,并且设置超时时间

    • 写操作:

      先写数据库,然后删除缓存

      要确保数据库与缓存操作的原子性

缓存穿透

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求全会打到数据库上。

image-20230525202150598

常见的解决方案由两种:

  • 缓存空对象:
    • 优点:实现简单,方便维护
    • 缺点:
      • 额外的内存消耗
      • 可能造成短时间的不一致
  • 布隆过滤
    • 优点:内存占用少,没有多余key
    • 缺点:
      • 实现起来复杂
      • 存在误判可能

缓存雪崩

缓存雪崩是指在同一段时间大量的Key同时失效或者Redis服务宕机,导致大量请求到达数据库,给数据库带来大量压力

image-20230525204103808

解决方案:

  • 给不同Key的TTL添加随机值
  • 利用redis集群提高服务可用性
  • 给缓存业务添加降级限流策略
  • 给业务添加多级缓存

缓存击穿

缓存击穿问题也叫做热点Key问题,就是一个高并发访问缓存重建业务比较复杂的Key突然失效了,无数的请求访问到数据库,给数据库带来巨大的压力

image-20230525205134061

解决方案:

  • 互斥锁
    • 优点
      • 没有额外内存消耗
      • 保持一致性
      • 实现简单
    • 缺点
      • 线程等待,性能降低
      • 可能有死锁风险
  • 逻辑过期
    • 优点:线程无需等待,性能较好
    • 缺点
      • 不保证一致性
      • 有额外内存消耗
      • 实现复杂
image-20230525205757501