简介:本文深入解析Redis的核心功能、应用场景及优化策略,涵盖数据结构操作、持久化配置、集群部署等关键技术点,结合实际案例提供可落地的解决方案。
Redis作为高性能内存数据库,其核心价值体现在三个方面:数据结构多样性(支持String、Hash、List等8种结构)、原子性操作(单线程模型保障命令原子性)、持久化机制(RDB快照与AOF日志双模式)。典型应用场景包括:
SETEX key 3600 value
设置1小时有效期的缓存。user_id:session_data
,配合EXPIRE
实现自动过期。SETNX key value
实现互斥锁,结合EXPIRE
防止死锁,解决分布式系统中的资源竞争问题。ZADD
和ZREVRANGE
实现动态排序,适用于游戏得分、直播热度等场景。字符串是Redis最基础的数据类型,支持存储文本、数字或二进制数据。常用命令:
SET user:1001:name "Alice" # 存储字符串
GET user:1001:name # 获取值
INCR user:1001:visits # 原子递增(适用于计数器)
MSET key1 "val1" key2 "val2" # 批量设置
实践建议:对于计数器类场景(如页面访问量),优先使用INCR
而非GET+SET
,避免并发导致的数据不一致。
哈希适合存储对象属性,例如用户信息:
HSET user:1001 name "Alice" age 25
HGETALL user:1001 # 获取全部字段
HMGET user:1001 name age # 获取指定字段
HINCRBY user:1001 score 10 # 数值字段递增
性能优化:当哈希字段较少时(<1000),内存占用比单独的String键更高效。可通过OBJECT ENCODING user:1001
检查是否被优化为ziplist编码。
列表适用于消息队列或历史记录:
LPUSH task_queue "task1" # 左侧插入
RPOP task_queue # 右侧弹出(阻塞版本为BRPOP)
LRANGE task_queue 0 -1 # 获取全部元素
集合用于去重或标签系统:
SADD tags:article:1001 "tech" "redis"
SMEMBERS tags:article:1001 # 获取所有标签
SINTER tag:tech tag:redis # 交集计算(共同标签)
通过快照机制定期保存数据,配置示例:
# redis.conf
save 900 1 # 900秒内至少1次修改触发快照
save 300 10 # 300秒内至少10次修改触发快照
dbfilename dump.rdb # 快照文件名
dir /var/lib/redis # 存储路径
注意事项:RDB可能导致最后一次快照后的数据丢失,需结合AOF使用。
记录所有写操作命令,支持三种重写策略:
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec # 每秒同步(平衡性能与安全性)
auto-aof-rewrite-percentage 100 # AOF文件增长100%时触发重写
恢复流程:启动时优先加载AOF文件(若存在),通过redis-check-aof --fix
修复损坏文件。
Redis Cluster通过分片实现水平扩展,关键步骤:
cluster-enabled yes
。CLUSTER ADDSLOTS
均匀分配。-c
参数启用集群模式(如redis-cli -c -h host
)。故障处理:当主节点故障时,从节点通过选举成为新主节点,选举时间由cluster-node-timeout
控制(默认15秒)。
maxmemory-policy
配置(如volatile-lru
优先淘汰带过期时间的键)。--bigkeys
参数扫描大键,通过HASH-MAX-ZIPLIST-ENTRIES
调整哈希编码阈值。mem_fragmentation_ratio
>1.5时,执行MEMORY PURGE
或重启实例。启用慢查询日志:
slowlog-log-slower-than 10000 # 记录执行时间>10ms的命令
slowlog-max-len 128 # 保留最近128条日志
通过SLOWLOG GET
查看日志,定位高频慢查询。
redis_exporter
采集指标,构建可视化看板。INFO memory
)。启用密码认证:
requirepass "your_password"
限制IP访问:
# 通过防火墙规则(如iptables)
iptables -A INPUT -p tcp --dport 6379 -s 192.168.1.0/24 -j ACCEPT
全量备份方案:
# 停止写入(可选)
redis-cli CONFIG SET appendonly no
# 执行备份
cp /var/lib/redis/dump.rdb /backup/redis_$(date +%Y%m%d).rdb
# 恢复后重启
systemctl restart redis
垂直扩容:直接升级实例内存规格(需重启)。
水平扩容:使用CLUSTER MEET
添加新节点,通过CLUSTER RESHARD
重新分配槽位。
现象:max number of clients reached
错误。
解决:
maxclients
参数(默认10000)。maxTotal=200
)。现象:OOM command not allowed
错误。
解决:
SCAN
遍历键空间)。现象:部分节点无法写入。
解决:
cluster-require-full-coverage
为no
(允许部分节点可用)。CLUSTER FIX
修复。利用Redis+Lua实现令牌桶算法:
-- rate_limiter.lua
local key = KEYS[1]
local limit = tonumber(ARGV[1])
local window = tonumber(ARGV[2])
local current = redis.call("GET", key)
if current == false then
current = limit
redis.call("SETEX", key, window, limit)
else
if tonumber(current) > 0 then
current = current - 1
redis.call("SET", key, current)
else
return 0
end
end
return 1
调用方式:
EVAL "脚本内容" 1 user:1001:rate_limit 10 60 # 每分钟10次
存储用户位置并计算距离:
GEOADD locations 116.404 39.915 "Tiananmen"
GEORADIUS locations 116.404 39.915 5 km WITHDIST # 5公里内地点
业务名:对象ID:字段
格式(如order
status
)。通过合理配置与优化,Redis可支撑每秒数十万次的读写请求,成为高并发系统的核心组件。建议结合实际业务场景进行压测(如使用redis-benchmark
),持续调优参数与架构。