系列文章目录
前言
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。
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