Skip to content

Redis进阶特性:解锁更多黑科技

在掌握了Redis基础之后,我们现在来探索一些更高级的特性和功能。这些特性就像Redis的"隐藏技能",能让你的Redis应用更加专业和强大。

1. 持久化机制:让数据不再"健忘"

Redis虽然是内存数据库,但它也有"记忆"功能,通过持久化机制可以将内存中的数据保存到磁盘上,防止重启后数据丢失。

RDB(Redis Database):快照式备份

RDB就像给Redis拍快照,定期将内存中的数据保存到磁盘文件中。

bash
# 手动触发RDB保存
SAVE        # 同步保存(会阻塞Redis)
BGSAVE      # 异步保存(后台执行,推荐使用)

# RDB配置(redis.conf)
save 900 1      # 900秒内至少1个键被修改则保存
save 300 10     # 300秒内至少10个键被修改则保存
save 60 10000   # 60秒内至少10000个键被修改则保存

# 查看最近一次RDB保存状态
LASTSAVE

RDB的优缺点:

  • 优点:文件紧凑、恢复速度快、适合备份
  • 缺点:可能丢失最后一次快照后的数据

AOF(Append Only File):日志式记录

AOF记录所有写操作命令,恢复时重放这些命令来重建数据。

bash
# AOF配置(redis.conf)
appendonly yes                  # 开启AOF
appendfilename "appendonly.aof" # AOF文件名
appendfsync everysec           # 同步策略(每秒同步)

# AOF同步策略
appendfsync always    # 每次写操作都同步(最安全但性能最差)
appendfsync everysec  # 每秒同步一次(推荐,性能和安全性平衡)
appendfsync no        # 由操作系统决定何时同步(性能最好但可能丢失数据)

# 手动触发AOF重写(压缩文件)
BGREWRITEAOF

AOF的优缺点:

  • 优点:数据安全性高、可读性强、支持重写压缩
  • 缺点:文件通常比RDB大、恢复速度相对较慢

持久化策略选择

bash
# 1. 仅使用RDB(追求性能,可容忍少量数据丢失)
save 900 1
save 300 10
save 60 10000
appendonly no

# 2. 仅使用AOF(追求数据安全)
save ""
appendonly yes
appendfsync everysec

# 3. 混合持久化(Redis 4.0+,推荐)
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes  # 开启混合持久化

2. 过期策略与内存淘汰:聪明的"清理工"

过期键删除策略

Redis如何处理过期的键?它采用了两种策略的组合:

bash
# 设置带过期时间的键
SET cache:user:1001 "用户数据" EX 300  # 300秒后过期

# 查看剩余过期时间
TTL cache:user:1001

# 设置永不过期
PERSIST cache:user:1001

# 手动设置过期时间
EXPIRE cache:user:1001 600  # 600秒后过期
PEXPIRE cache:user:1001 600000  # 毫秒为单位

Redis的过期策略:

  1. 惰性删除:访问键时才检查是否过期
  2. 定期删除:每隔一段时间随机检查部分键是否过期

内存淘汰策略

当内存使用达到上限时,Redis会根据配置的淘汰策略清理数据:

bash
# 查看当前内存淘汰策略
CONFIG GET maxmemory-policy

# 设置最大内存
CONFIG SET maxmemory 1gb

# 设置内存淘汰策略
CONFIG SET maxmemory-policy allkeys-lru

# 常用的内存淘汰策略
maxmemory-policy volatile-lru     # 从设置了过期时间的键中删除最近最少使用的
maxmemory-policy allkeys-lru      # 从所有键中删除最近最少使用的(缓存常用)
maxmemory-policy volatile-ttl     # 删除剩余过期时间最短的
maxmemory-policy volatile-random  # 从设置了过期时间的键中随机删除
maxmemory-policy allkeys-random   # 从所有键中随机删除
maxmemory-policy noeviction       # 不删除,内存满时写操作返回错误(默认)

3. 发布订阅与事务:消息传递与批量操作

发布订阅(Pub/Sub)

Redis的发布订阅功能就像广播电台,发布者发送消息,订阅者接收消息。

bash
# 订阅频道(在redis-cli中执行)
SUBSCRIBE news        # 订阅"news"频道
PSUBSCRIBE news.*     # 模式订阅,订阅所有以"news."开头的频道

# 发布消息(在另一个redis-cli中执行)
PUBLISH news "今日头条"      # 向"news"频道发布消息
PUBLISH news:sports "NBA最新战况"  # 向"news:sports"频道发布消息

# 查看活跃频道
PUBSUB CHANNELS

# 查看频道订阅者数量
PUBSUB NUMSUB news

发布订阅的特点:

  • 实时性好
  • 无持久化(订阅者离线会丢失消息)
  • 支持模式匹配订阅

事务(Transactions)

Redis事务允许将多个命令打包执行,要么全部执行,要么全部不执行。

bash
# 开始事务
MULTI

# 添加命令到事务队列
SET user:name "张三"
SET user:age 25
INCR user:login_count

# 执行事务
EXEC

# 取消事务
DISCARD

# 监视键(乐观锁)
WATCH user:balance
MULTI
SET user:balance 1000
EXEC

Redis事务的特点:

  • 不支持回滚(执行出错不会回滚)
  • 命令按顺序执行
  • 支持WATCH实现乐观锁

4. 高级数据结构:特殊技能解锁

Bitmap(位图):节省空间的神器

Bitmap不是一种独立的数据类型,而是对String类型的特殊操作,可以高效处理大量布尔值数据。

bash
# 设置位图
SETBIT login:2024-01-01 1001 1  # 用户1001在2024-01-01登录了
SETBIT login:2024-01-01 1002 1  # 用户1002在2024-01-01登录了

# 获取位图值
GETBIT login:2024-01-01 1001

# 统计登录用户数
BITCOUNT login:2024-01-01

# 多个位图操作
SETBIT active:2024-01-01 1001 1  # 用户1001活跃
SETBIT active:2024-01-02 1001 1  # 用户1001第二天也活跃

# 按位与操作(两天都活跃的用户)
BITOP AND active:both_days active:2024-01-01 active:2024-01-02
BITCOUNT active:both_days

应用场景:

  • 用户签到统计
  • 在线用户统计
  • 权限控制(每个位代表一种权限)

HyperLogLog:统计专家

HyperLogLog用于估算集合的基数(不重复元素的数量),占用空间极小。

bash
# 添加元素到HyperLogLog
PFADD unique_visitors "user1"
PFADD unique_visitors "user2"
PFADD unique_visitors "user3"
PFADD unique_visitors "user1"  # 重复元素不会影响计数

# 估算基数
PFCOUNT unique_visitors

# 合并多个HyperLogLog
PFADD site_a "user1" "user2" "user3"
PFADD site_b "user3" "user4" "user5"
PFMERGE site_combined site_a site_b
PFCOUNT site_combined

特点:

  • 占用空间极小(12KB)
  • 误差率约0.81%
  • 适合大数据量的去重统计

Geospatial(地理空间):位置服务专家

Redis的地理空间功能可以存储地理位置信息并进行距离计算和范围查询。

bash
# 添加地理位置信息
GEOADD cities 116.4074 39.9042 "北京"
GEOADD cities 121.4737 31.2304 "上海"
GEOADD cities 113.2644 23.1291 "广州"

# 计算两个城市之间的距离(单位:公里)
GEODIST cities "北京" "上海" km

# 查找附近的城市(1000公里范围内)
GEORADIUS cities 116.4074 39.9042 1000 km

# 获取城市的地理位置坐标
GEOPOS cities "北京"

# 根据成员名称查找附近的城市
GEORADIUSBYMEMBER cities "北京" 1000 km

5. 实践项目:动手做一做

带过期时间的验证码存储

bash
# 生成验证码并存储(5分钟有效期)
SET verify_code:user:1001 "888888" EX 300

# 验证验证码
GET verify_code:user:1001

# 删除已使用的验证码
DEL verify_code:user:1001

用户连续签到统计

bash
# 记录用户签到(假设今天是2024年的第15天)
SETBIT sign:2024:user:1001 15 1

# 统计用户今年签到天数
BITCOUNT sign:2024:user:1001

# 查看用户是否在某天签到
GETBIT sign:2024:user:1001 15

# 统计连续签到天数
# 这需要编写Lua脚本或在应用层处理

简单的实时聊天功能

bash
# 用户A订阅聊天室
SUBSCRIBE chatroom

# 用户B发布消息
PUBLISH chatroom "大家好!"

# 用户C加入聊天
SUBSCRIBE chatroom

# 用户B再次发送消息
PUBLISH chatroom "欢迎用户C加入!"

总结

本章节介绍了Redis的进阶特性:

  • 持久化机制(RDB和AOF)
  • 过期策略与内存淘汰
  • 发布订阅与事务
  • 高级数据结构(Bitmap、HyperLogLog、Geospatial)

掌握这些特性后,你可以构建更复杂、更专业的Redis应用。在下一章节中,我们将学习Redis的高可用架构,包括主从复制、哨兵和集群等技术。

记住,Redis的强大不仅在于速度快,更在于它提供了丰富的功能来解决各种实际问题。多动手实践这些特性,你会发现Redis在不同场景下的独特魅力!