"张工,我们的Redis又报警了!内存使用率突破90%了!"凌晨3点,运维小王的电话把张工从睡梦中惊醒,作为某电商平台的技术负责人,张工知道这已经是本月第三次因为Redis问题被叫醒了。
登录服务器查看后,张工发现Redis实例中竟然存储了超过8000万个Key!其中大部分是用户浏览记录和商品缓存,很多Key设计得毫无章法,user_12345_view_product_67890_at_20250715_030022"这种又长又包含冗余信息的Key比比皆是,更糟的是,很多Key根本没有设置过期时间...
这个场景是不是很熟悉?Redis作为高性能的内存数据库,Key的数量和设计直接影响着其性能和稳定性,今天我们就来聊聊Redis中如何合理把握Key数量,分享一些实用的Key数量控制技巧。
Redis虽然是内存数据库,性能优异,但Key数量过多会带来一系列问题:
不好的实践:
user_12345_view_product_67890_at_20250715_030022
优化后的设计:
uv:12345:67890:20250715
或使用哈希结构:
user:views:12345 -> {p67890: "20250715"}
命名规范建议:
不要把所有数据都存为String类型,根据场景选择合适的数据结构:
哈希(Hash):适合存储对象属性
user:1000 -> {name:"张三", age:30, email:"zhangsan@example.com"}
集合(Set):适合存储唯一值集合
article:1000:likers -> {1001, 1002, 1003}
有序集合(ZSet):适合需要排序的场景
hot_articles -> {(1000, 1200), (1001, 980), (1002, 750)}
为临时性数据设置TTL是控制Key数量的有效手段:
# 设置24小时过期 SET session:1234 "data" EX 86400
定期清理脚本示例(Lua):
-- 删除7天前的不活跃用户会话 local keys = redis.call('KEYS', 'session:*') for _,key in ipairs(keys) do local ttl = redis.call('TTL', key) if ttl == -1 then -- 没有设置过期时间的Key redis.call('DEL', key) end end return #keys
低效做法:
for product_id in product_ids: redis.delete(f"product:{product_id}")
高效做法:
# 使用pipeline批量删除 pipe = redis.pipeline() for product_id in product_ids: pipe.delete(f"product:{product_id}") pipe.execute()
当需要遍历Key时,避免使用阻塞性的KEYS命令:
cursor = '0' while cursor != 0: cursor, keys = redis.scan(cursor=cursor, match='temp:*', count=1000) if keys: redis.delete(*keys)
对于存储大Value的Key,考虑拆分为多个小Key:
原始设计:
user_actions:1001 -> [100次操作记录的JSON数组]
优化设计:
ua:1001:20250715 -> [当日操作记录]
ua:1001:20250714 -> [前日操作记录]
按业务划分Key前缀:
order:1001
payment:1001
logistics:1001
定期Key分析:
# 采样分析Key模式 redis-cli --bigkeys # 内存使用分析 redis-cli info memory
设置内存告警:
# redis.conf配置 maxmemory 16gb maxmemory-policy allkeys-lru
建立Key生命周期管理:
如用户标签系统,可能产生数亿个小Key,解决方案:
替代DBSIZE
的方案:
# 使用SCAN增量统计 def count_keys(pattern='*'): cursor = '0' total = 0 while cursor != 0: cursor, keys = redis.scan(cursor=cursor, match=pattern, count=1000) total += len(keys) return total
Redis Key管理就像整理房间 - 定期清理、合理归类、丢掉无用之物,才能保持高效运转,当你的Redis中Key数量得到合理控制后,你会发现不仅性能提升了,运维压力也小多了,凌晨三点被叫醒的次数自然也就少了!
本文由 扈代巧 于2025-07-31发表在【云服务器提供商】,文中图片由(扈代巧)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/494425.html
发表评论