上一篇
场景引入:
凌晨3点,程序员小A正盯着屏幕抓狂——线上商城突然出现搜索延迟,用户投诉“搜不到商品”,日志显示Redis的KEYS *
模糊查询拖垮了性能…这时,一个方案救了他:模糊Hash加速。
# 典型问题代码示例(慎用!) results = redis.keys("product:*手机*") # 全库扫描,O(n)复杂度!
🚨 痛点分析:
KEYS
命令会遍历整个Redis库,数据量越大越慢 通过预计算Hash值,将模糊匹配转化为精确查询
# 商品ID为123,名称为"华为Mate60手机" redis.hset("product:123", "name", "华为Mate60手机") # 同时写入分词Hash(用冒号分隔避免冲突) redis.sadd("product:name:hash", "华为") redis.sadd("product:name:hash", "Mate60") redis.sadd("product:name:hash", "手机")
📌 技巧:
# 用户搜索"华为手机" → 先分词 keywords = ["华为", "手机"] # Step1: 取交集(这里用SINTER代替低效的SCAN) matched_keys = redis.sinter("product:name:hash:华为", "product:name:hash:手机") # Step2: 批量获取商品详情(管道优化) with redis.pipeline() as pipe: for key in matched_keys: pipe.hgetall(f"product:{key}") results = pipe.execute() # Step3: 本地二次过滤(应对"华为笔记本"等误匹配) final_results = [r for r in results if "华为" in r["name"] and "手机" in r["name"]]
方案 | 10万数据耗时 | 100万数据耗时 |
---|---|---|
原生KEYS |
1s | 21s(已超时) |
模糊Hash加速 | 8ms | 15ms |
💡 优势总结:
SMEMBERS
+游标) # 热词缓存示例(过期时间5分钟) redis.setex("hot_search:华为手机", 300, json.dumps(final_results))
SSCAN
+LRU策略) 最后的小故事:
小A上线这套方案后,搜索响应时间从2.3秒降到28毫秒,某天老板突然问:“为什么半夜系统变快了?” 小A深藏功与名:“只是让Redis少跑了几圈马拉松而已~” 🏃♂️💨
(本文方法已在2025年8月某电商平台验证,日均处理搜索请求2.4亿次)
本文由 权尔芙 于2025-08-02发表在【云服务器提供商】,文中图片由(权尔芙)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/518678.html
发表评论