使用Bitmaps位图实现Redis签到

本文介绍了Redis中的Bitmaps位图功能,其实质是字符串数据类型的扩展,允许对位进行操作。通过SETBIT、GETBIT、BITCOUNT等命令进行位设置、获取和计数。在代码实现中,通常结合Spring的RedisTemplate进行操作,适用于签到等场景。
摘要由CSDN通过智能技术生成

系列文章目录


文章目录


前言

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。
在这里插入图片描述


Redis提供了Bitmaps这个“数据类型”可以实现对位的操作:
(1) Bitmaps本身不是一种数据类型, 实际上它就是字符串(key-value) , 但是它可以对字符串的位进行操作。
(2) Bitmaps单独提供了一套命令, 所以在Redis中使用Bitmaps和使用字符串的方法不太相同。 可以把Bitmaps想象成一个以位为单位的数组, 数组的每个单元只能存储0和1, 数组的下标在Bitmaps中叫做偏移量。
在这里插入图片描述
首先我们要理解几个命令,特别是最后一个,这些命令可以参考Redis文档。

SETBIT key offset value
设置或者清空key的value(字符串)在offset处的bit值。

SETBIT bit:sign 2 1

GETBIT key offset
返回key对应的string在offset处的bit值,当offset超出了字符串长度的时候,这个字符串就被假定为由0比特填充的连续空间。

GETBIT bit:sign 2

BITCOUNT key [start end]
统计字符串被设置为1的bit数。对一个不存在的 key 进行 BITCOUNT 操作,结果为 0 。

SETBIT bit:sign 2 1
SETBIT bit:sign 5 1
BITCOUNT bit:sign

BITPOS key bit [start] [end]
返回字符串里面第一个被设置为1或者0的bit位。

BITPOS bit:sign 1

BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]
BITFIELD命令能操作多字节位域,它会执行一系列操作,并返回一个响应数组,在参数列表中每个响应数组匹配相应的操作。

BITFIELD bit:sign get u1 2

从offset-2开始,取一位,结果为无符号数(u),也可以进行多个操作

BITFIELD bit:sign get u1 2 get u1 5

其次是如何在我们的代码中使用,由于目前代码都集成Spring使用RedisTemplate来操作,这里使用RedisTemplate来演示。
代码中的位运算操作,可以百度“Java语言位运算符详解”参考别人文章理解。

/**
 * 用户签到功能
 */
private static final String USER_SIGN = "USER_SIGN:%d:%s";
private static String buildSignKey(Long uid, LocalDate date) {
   
    return String.format(USER_SIGN, uid, formatDate(date));
}
@Test
public void testBit() {
   
    String bitKey = buildSignKey(100000L, LocalDate.now());
    // 当前签到情况
    LocalDate date = LocalDate.now();
    redisTemplate.delete(bitKey);
 
    // offset是从0开始的,因此2号签到,offset要标记为1
    int todayOffset = date.getDayOfMonth() - 1;
    redisTemplate.opsForValue().setBit(bitKey, 3, true); // 4号签到
    redisTemplate.opsForValue().setBit(bitKey, 4, true); // 5号签到
    redisTemplate.opsForValue().setBit(bitKey, 5, true); // 6号签到
    redisTemplate.opsForValue().setBit(bitKey
  • 31
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java毕设王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值