Redis缓存键设计的核心是使用命名空间分隔不同业务的数据,例如user:123:info表示用户123的信息,结合TTL设置过期时间实现自动清理;数据持久化通过RDB快照和AOF日志双重机制,每5秒或100次写操作后自动保存到磁盘;系统性能提升依赖于单线程事件模型和内存存储,读写延迟低至微秒级,热点数据命中率达90%以上可减少数据库压力80%。
键设计原则
在Redis中,键的设计非常重要。一个好的键命名规则,可以让你的Redis实例更清晰,便于管理和维护。通常,我们会采用“业务名:数据类型:唯一标识”的方式来设计键。比如,用户信息的键可以是user:info:123,订单信息可以是order:detail:45678。这种设计的好处是直观,一眼就能看出这个键是做什么用的。另外,还可以加入时间戳,比如user:info:20230101:123,用于区分日期数据。
持久化配置
Redis提供RDB和AOF两种持久化方式。RDB是定期生成快照,save 900 1表示900秒内至少1个键变化就生成快照。AOF是记录每条写命令,appendonly yes开启,appendfsync everysec每秒同步一次。实际使用中,开启两者并以AOF为主,RDB为辅,能最大化数据安全性和恢复速度。
性能优化实践
使用Pipeline批量操作命令,一次发送多个命令减少RTT;开启Lua脚本原子执行复杂逻辑;设置合理的maxmemory和eviction策略如allkeys-lru;监控info stats中的hit率,低于80%需优化键设计或增加内存,避免频繁swap导致性能下降。
实际案例
在电商系统中,商品详情键设计为product:detail:{pid},库存为product:stock:{pid},使用INCRBY原子递减库存;用户session用session:{uid},TTL 7天;结合Redis Cluster分片,支持亿级QPS,数据库QPS降至原10%,响应时间从500ms降到50ms。
持久化与备份
配置redis.conf:save 60 1000,stop-writes-on-bgsave-error no;AOF重写用bgrewriteaof,auto-aof-rewrite-percentage 100;结合cron脚本定期备份dump.rdb到S3,实现异地容灾。
监控与调优
用redis-cli --stat监控used_memory_human和instantaneous_ops_per_sec;键设计避免过长,超过250字节浪费空间;大Value拆分存储,如JSON大对象用Hash或List;JVM应用用Lettuce连接池maxTotal 20。
FAQ
Q: Redis键命名有什么最佳实践?
A: 采用业务:类型:id格式,如user:profile:1001,便于管理和搜索。
Q: 如何选择RDB还是AOF?
A: 生产环境两者结合,AOF数据更完整,RDB恢复更快。
Q: 缓存穿透怎么处理?
A: 空值缓存+布隆过滤器,键设计加前缀隔离。
Q: 内存不足时如何驱逐键?
A: 配置maxmemory-policy allkeys-lru,优先淘汰不常用键。