首页
学习
活动
专区
圈层
工具
发布

【Dubug】bitField 引发的栈溢出排错记

、背景 前期因为布隆过滤器的实现需求,导入了 redisson 的依赖,后面项目需求迭代,需要用到 redis 的 bitmap 来做签到信息的存储,并且需要提供读取每月签到记录的功能,这里需要用 bitField...方法将位信息读取成 Long 数值,之后进行移位操作得到当月每天的签到情况,问题代码如下: 对于 bit 的 set 操作是没问题的,但是用到这个 bitField 就出问题了。...跟进去可以看到 doInRedis 实际上是个回调方法,回调到一开始的 connection.bitField 方法。...首先是业务代码,就是一行简单的调用: 接着我们跟进去看 set 方法,可以看到跟 bitField 类似,进到 execute 看看。...到这里 set 的操作就结束了,对比可以发现,正是因为 redisson 中没有实现 bitField 方法才导致的递归调用默认方法,进而导致栈溢出。

83130

如何优雅地实现Redis命令setbits与getbits

今天给大家介绍一种通过Redis原生命令bitfield实现setbits和getbits的方法。 bitfield命令 首先介绍一下bitfield命令的用途。...官方对bitfield命令的介绍是:通过bitfield命令可以一次性操作多个比特位域,它会执行一系列操作并返回一个响应数组,这个数组中的元素对应参数列表中的相应操作的执行结果。...上述只是bitfield的一部分应用,实际上bitfield还有很多更高级的用法,有兴趣的可以去Redis官网查阅,这里就不再详细介绍了。...说明确实可以使用bitfield命令来实现getbits。...总结 使用bitfield实现getbits和setbits的好处有2个:1、原子性保证,由于所有操作都是在一个bitfield命令中完成的,所以可以保证操作的原子性。

1.1K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Redis 中的 BitMaps(位图)命令详解

    BITFIELD 命令可以将一个 Redis 字符串看作是一个由二进制位组成的数组, 并对这个数组中储存的长度不同的整数进行访问 (被储存的整数无需进行对齐)。...此外, BITFIELD 命令还可以对指定的整数执行加法操作和减法操作, 并且这些操作可以通过设置妥善地处理计算时出现的溢出情况。...bitfield 有三个子指令,分别是 get/set/incrby。每个指令都可以对指定片段做操作。 子命令:GET —— 返回指定的二进制位范围。...bitfield key set type offset value # 从偏移量offset=0开始取3位,设置为无符号的整数5并返回旧值 127.0.0.1:6379> bitfield hello...,设置为无符号的整数6并返回旧值 127.0.0.1:6379> bitfield hello set u4 0 6 1) (integer) 10 127.0.0.1:6379> bitfield hello

    1.4K20

    利用 Redis bitmap 实现高效的用户签到统计功能

    统计今年累计签到天数 要实现统计一年里的签到次数,我们需要用到 Redis 的 BITFIELD 命令。...封装 BitField 命令的参数: 通过循环将从年初到当前日期的天数(dayOfYear)分割为每段最多包含 63 天的多个区间,动态构建 BitField 命令的参数。...执行 BitField 命令: 使用 rdb.BitField() 方法执行构建好的 BitField 命令,返回一个包含位二进制对应的十进制表示的 int64 类型切片。...统计当月的签到情况 要实现统计某月的签到情况,同样我们也需要用到 Redis 的 BITFIELD 命令。...执行 BitField 命令:通过 rdb.BitField() 方法执行 BitField 命令,返回一个包含位二进制对应的十进制表示的 int64 类型切片。

    1.4K31

    CSDN是怎么实现用户签到,统计签到次数,连续签到天数等功能微服务的

    127.0.0.1:0>BITPOS user:sign:98:202212 1 "0" # 获取2022年12月前3签到情况,返回7,二进制111,意味着前三天都签到了 127.0.0.1:0>BITFIELD...指令关注时,offset从0开始计算,0就代表1号) 构建用户按月存储key(user:sign:用户id:月份) 判断用户是否签到(GETBIT指令) 用户签到(SETBIT) 返回用户连续签到次数(BITFIELD...DateUtil.dayOfMonth(date); // 构建 Key String signKey = buildSignKey(userId, date); // bitfield...request.getServletPath(), map); } 签到业务逻辑层 SignService 获取某月签到情况,默认当月 获取登录用户信息 构建Redis保存的Key 获取月份的总天数(考虑2月闰、平年) 通过BITFIELD...DateUtil.month(date) + 1, DateUtil.isLeapYear(DateUtil.dayOfYear(date))); // bitfield

    3.2K20

    初识Redis · 命令、数据结构补充、协议

    对多个 bitmap 进行位运算 当然了,具体怎么实现的还是根据源码了,我们后面再学习咯~ bitfield 这个东西大家可能看起来是非常陌生的,对于bitfield来说,咱们翻译一下,bitfield...通过 BITFIELD,用户可以高效地执行多位数据操作(如整数计数器、嵌入式计数器等),适合一些需要操作大规模二进制数据的应用场景。...BITFIELD 主要用于位图的分段操作,可以进行整数值的增减、查询和位操作,甚至支持直接对多个不同类型的字段进行批量操作。...key GET type offset 获取指定位置的整数值(支持类型如 i8, i16, u32 等) BITFIELD key SET type offset value 设置指定位置的整数值 BITFIELD...key INCRBY type offset increment 增加指定位置的整数值 BITFIELD key AND type offset value 按位与操作 BITFIELD key OR

    15610

    Redis系列(十九)独立功能之bitmap(位图)

    bitfield: 在 3.2.0 之后新添加的操作指令。 在 3.2 之前,如果需要一次性操作多个位,我们只能使用管道,所以 Redis 提供了 bitfield 来进行批量的位操作。...bitfield 有三个子指令,分别是 get/set/incrby,它们都可以对指定位片段进行读写,但是最多只能处理 64 个连续的位,如果 超过 64 位,就得使用多个子指令,bitfield 可以一次执行多个子指令...bitfield huyanshi_key get i3 2 # 一次性执行多个字指令,get 多个片段的值 bitfield huaynshi_key get u4 0 get u3 2 get..., port=6379) r.setbit("huyanshi_bitmap_key", 10, 1) print(r.getbit("huyanshi_bitmap_key", 10)) 进阶使用 bitfield...bitfield 指令提供了溢出策略子指令 overflow,用户可以选择溢出行为。 默认是折返 (wrap). 失败 (fail) 报错不执行。

    1.8K50

    C语言位域解析及在嵌入式编程中的应用

    因此为了避免上述这种问题的出现,应该将 BitField_8 中的 char 转换成 unsigned char ,那输出的结果就是 3,5 位域禁止的操作 由于位域的特殊,同时也有了一些跟普通变量不同的特性...: 结构体位域成员不能够使用取址操作 struct BitField_8 { unsigned char a : 2; }BF8; printf("%p\n",&...BF8.a); /*错误*/ 结构体位域成员不能够用 static 修饰 struct BitField_8 { static unsigned char a : 2;/*错误*.../ }BF8; 结构体位域成员不能够使用数组 struct BitField_8 { unsigned char a[5] : 5;/*错误*/ }BF8; 不同处理器...编译器影响 结构体位域成员不同类型 不同的编译器对于位域会有不同的结果,比如下面这段代码: struct BitField_5 { unsigned int a : 4; unsigned

    1.9K10
    领券