Redis

是什么:基于内存key-value结构的数据库

特点:

  • 基于内存存储,读写性能高
  • 适合存储热点数据(热点商品、资讯、新闻)

官网:https://redis.io/

中文网:https://www.redis.net.cn/

数据类型

image-20250313121938596

常用命令:

字符串:

  • set key value—设置指定key的值
  • get key—获取指定key的值
  • setex key seconds value—设置指定key的值,并在seconds后过期(常用于验证码)
  • setnx key value—只有在key不存在时设置key的值

哈希:

  • hset key field value—设置指定key的字段和值
  • hget key field—获取指定key的字段的值
  • hdel key field—删除指定key的字段
  • hkeys key—显示所有字段
  • hvals key—显示所有值

列表:

image-20250313125814412

集合:

image-20250316132341779

有序集合:

image-20250316133144948

通用命令:

image-20250316134410583

Java中操作Redis

image-20250316135458506

常见问题的解决方式

缓存击穿

是指一个热点数据的过期导致大量的请求给到数据库,可能会造成数据库宕机。

解决方式

  • 永不过期(不推荐):设置热点数据永不过期或者过期时间比较长。

  • 加锁(看情况):在缓存失效后,通过设置互斥锁确保只有一个请求去查询数据库并更新缓存。

缓存雪崩

缓存在同一时间大面积的失效,导致大量的请求都直接落到了数据库上,对数据库造成了巨大的压力。

解决方式

针对 Redis 服务不可用的情况

  1. Redis 集群:采用 Redis 集群,避免单机出现问题整个缓存服务都没办法使用。Redis Cluster 和 Redis Sentinel 是两种最常用的 Redis 集群实现方案。
  2. 多级缓存:设置多级缓存,例如本地缓存+Redis 缓存的二级缓存组合,当 Redis 缓存出现问题时,还可以从本地缓存中获取到部分数据。

针对大量缓存同时失效的情况

  1. 设置随机失效时间(可选):为缓存设置随机的失效时间,例如在固定过期时间的基础上加上一个随机值,这样可以避免大量缓存同时到期,从而减少缓存雪崩的风险。
  2. 提前预热(推荐):针对热点数据提前预热,将其存入缓存中并设置合理的过期时间,比如秒杀场景下的数据在秒杀结束之前不过期。
  3. 持久缓存策略(看情况):虽然一般不推荐设置缓存永不过期,但对于某些关键性和变化不频繁的数据,可以考虑这种策略。

缓存穿透

缓存穿透说简单点就是大量请求的 key 是不合理的,根本不存在于缓存中,也不存在于数据库中。这就导致这些请求直接到了数据库上,根本没有经过缓存这一层,对数据库造成了巨大的压力,可能直接就被这么多请求弄宕机了。

解决方式:

1)缓存空对象

2)布隆过滤器

3)接口限流