首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >低版本 Redis bitcount 偏移参数不是 bit 的解决方案

低版本 Redis bitcount 偏移参数不是 bit 的解决方案

作者头像
seth-shi
发布2023-12-18 14:34:21
发布2023-12-18 14:34:21
1990
举报
文章被收录于专栏:seth-shi的专栏seth-shi的专栏
  • 最近在项目中要用到一个签到N天送礼品的功能, 这个功能很自然而然的想到用Redisbitmap去实现
  • 签到就是setbit {key} {offset} 1
  • 累计签到天数就是bitcount {key} {start} {end}

index.md

  • 一开始的时候这样写
代码语言:javascript
复制
# 基数日期比如是: 2023-09-12, 那么 2023-09-12, offset 就是 0
setbit users:id 0 1
# 10000000
# 2023-09-13, offset 就是 1
setbit users:id 1 1
# 11000000
# 然后获取用户: 2023-09-12 ~ 2023-09-20 的登录天数, 当时代码就是
bitcount users:id 0 8
# 输出的也是 2, 当时也没想这么多. 然后测试的时候, 测试人员反馈当获取 2023-09-13 ~ 2023-09-20 的登录天数的时候一直是 0
bitcount users:id 1 7
# 输出的是 0, 实际上上面的命令是获取了`9~16 bit`的`1`数量, 11000000 由于后面无`1`, 所以 bitcount users:id 1 7 必定返回了 0
  • 一开始下意识的认为, 以为start,end就是bit, 然后查了文档才发现实际上是byte, 所以在bitcount的时候, 数据不对

旧版本解决方案

  • 由于我们的Redis版本比较低的问题, 所以代码中计算的时候改成如下方案
  • set的时候乘以8,虽然导致浪费了7倍的空间, 但是为了让代码简单点忍忍 (最好的方案还是升级Redis来支持BIT参数)
代码语言:javascript
复制
setbit {key} {offset*8} 1
bitcount {key} {start} {end}

Redis大于7.0版本解决方案

代码语言:javascript
复制
bitcount {key} {start} {end} BIT
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-09-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 旧版本解决方案
  • Redis大于7.0版本解决方案
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档