# 其它功能
# 事务
- 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 提供了 发布/订阅 功能,可用作功能简单的消息队列。