Redis BitMap实现签到与统计

1. 引言

在各个项目中,我们都可能需要用到签到和 统计功能。签到后会给用户一些礼品以此来吸引用户持续在该平台进行活跃。

签到功能,我们可以通过Redis中的 BitMap功能来实现

2. Redis BitMap基本用法

  • SETBIT: 向指定个位置offset存入一个0或者1, setbit key offset value

  • GETBIT: 获取指定位置offset的bit值, GETBIT key offset

  • BITCOUNT: 统计BigMap中值为1的bit位的数量

  • BITFIELD: 操作(查询、修改、自增)BitMap中bit数组中的指定位置offset的值

  • BITFIELD_RO: 获取BitMap中bit的数组,并以十进制形式返回

  • BITOP: 将多个BitMap的结果做位运算(与、或、异或)

  • BITPOS: 查找bit数组中指定范围内第一个0或者1出现的位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## setbit key offset value
xiaoyuge-redis:0>setbit bm1 0 1
xiaoyuge-redis:0>setbit bm1 1 1
xiaoyuge-redis:0>setbit bm1 2 1
xiaoyuge-redis:0>setbit bm1 3 1
xiaoyuge-redis:0>setbit bm1 4 0
xiaoyuge-redis:0>setbit bm1 5 1
## GETBIT key offset
xiaoyuge-redis:0>getbit bm1 2
"1"
## bitpos key value
xiaoyuge-redis:0>bitpos bm1 0
"4"
xiaoyuge-redis:0>bitpos bm1 1
"0"

案例工程

采用BitMap 实现签到功能, 实现签到接口,将当前用户当天签到信息保存到Redis中

**思路分析: ** 把签到日期作为BitMap中的key,然后保存到BitMap中,每次签到就到对应位上的数字由0变为1,只要是1,表示已经签到类

  1. 创建用户签到表
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE `tb_sign` (
    `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
    `user_id` bigint unsigned NOT NULL COMMENT '用户',
    `sign_date` date NOT NULL COMMENT '签到日期',
    `is_backup` tinyint unsigned DEFAULT NULL COMMENT '是否补签',
    PRIMARY KEY (`id`) USING BTREE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT;