9人参与 • 2025-06-10 • Redis
这些问题,redis的3种核心方案能帮你解决!
适用场景:
核心代码:
# 场景:记录用户访问时间戳(防重复计数) pipeline.hset("user:visits:202310", user_id, time.time()) pipeline.expire("user:visits:202310", 86400) # 每天清理一次 # 统计当前活跃用户数 current_uv = redis.hlen("user:visits:202310")
参数说明:
hset
:哈希表存储用户id和最后访问时间expire
:自动清理过期数据,避免内存泄漏内存优化技巧:
100kb * 10^5 = 10gb
user_id:md5
缩短键名,内存占用可降低至**<1mb/万用户**适用场景:
核心代码:
# 场景:统计本月访问过的用户(假设用户id为整数) user_id = 123456 redis.setbit("uv:202310", user_id, 1) # 获取本月uv总数 total_uv = redis.bitcount("uv:202310")
参数说明:
setbit
:将用户id对应位设为1,每个用户仅占1bit内存bitcount
:统计所有置位位数,时间复杂度o(1)内存对比:
方法 | 100万用户内存占用 | 精度 |
---|---|---|
hash | ~100mb | 100% |
bitmap | ~125kb | 100% |
适用场景:
核心代码:
# 场景:统计全站日活(误差率0.5%) redis.pfadd("uv:202310", user_id) estimated_uv = redis.pfcount("uv:202310")
参数说明:
pfadd
:将用户id加入hyperloglog结构pfcount
:返回近似值,内存占用仅<1kb/百万用户性能对比:
方法 | 1000万用户内存 | 统计误差 |
---|---|---|
bitmap | 1.25mb | 0% |
hyperloglog | <1kb | 0.5% |
对比表格:
方案 | 内存占用 | 精度 | 适用场景 |
---|---|---|---|
hash | 中(mb级) | 100% | 小规模精确统计 |
bitmap | 极低(kb级) | 100% | 大规模精确去重 |
hyperloglog | 超低(kb级) | <1% | 超大规模近似统计 |
优化建议:
redis统计访问量的本质是内存优化+算法选型的平衡。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论