# 其它功能

# 事务

  • Redis 的事务不能保证原子性。
  • 客户端可以将连续执行的多个命令声明为一个事务,如下:
    multi        # 声明一个事务的开始
    set...
    get...
    exec         # 开始执行该事务
    
    • 在执行 exec 之前,可以用 discard 取消执行剩下的命令(但已执行的命令并不能回滚)。

# 缓存

当 MySQL 等数据库的读操作远多于写操作时,可以用 Redis 作为读缓存。

  • 当用户查询某个 Key 时,先到 Redis 缓存中查询,如果查询不到再到数据库查询。这样可以降低数据库的压力。
  • 如果在数据库查询到了该 key 的值,则放入缓存,并设置几分钟的过期时间。

# 部署方式

  • 本地缓存
    • 响应速度很快(因为直接在内存中读写),但是容量有限。
  • 分布式缓存
    • 响应速度较慢(因为要经过网络通信),但是容易横向扩容。
  • 多级缓存
    • :将访问频率高的数据存储在本地缓存中,其它 key 存储在分布式缓存中。

# 缓存穿透

  • :有恶意请求不断地查询一些不存在的 key ,绕过缓存,直接冲向数据库。
  • 解决方案:
    • 即使查询到的值为空,也将该 key 放入缓存。
    • 在查询缓存之前,先过滤掉明显不正常的查询请求。

# 缓存击穿

  • :大量请求一直频繁地查询某个 key(称为热 key),而该 key 在某一时刻缓存过期,导致这些请求直接冲向数据库。
  • 解决方案:
    • 延长热 key 的过期时间。

# 缓存雪崩

  • :在某一时刻,大量的普通 key 都缓存过期,导致它们的请求直接冲向数据库。
  • 解决方案:
    • 给不同类型的 key 设置不同的缓存时长,给同一类型的 key 设置缓存时长时加上随机数,尽量分散缓存周期。
    • 将这些 key 存储在多个 Redis 上,分散查询请求。

# 分区

:用于将 key 分散保存到多个 Redis 实例。

  • 分区的方式
    • 按 value 值的范围分区。
    • 按 key 的 hash 值的范围分区。
  • 优点
    • 合并多个 Redis 实例,扩展容量。
  • 缺点
    • 如果多个 key 存储在不同 Redis 实例,则不能在一个事务中处理,不能进行 set 交集、差集等运算。

# 发布/订阅

Redis 提供了 发布/订阅 功能,可用作功能简单的消息队列。