bitmap
我们知道redis的bitmap本身不是一种数据结构,底层实际上依靠字符串进行存储,可以借助字符串进行位操作,由于redis的字符串最大内存位512MB,所以bitmap的bit位也是有上限的,8 * 1024 * 1024 * 512 = 2^32,由于C语言字符串的末尾都有一位分隔符,所以bitmap存储的实际上限位 2^32 - 1,所以我们可以借助bitmap来实现很多功能,最常用的比如签到功能,比如用一年一个key,所占用存储空间位 365 / 1024 = 0.36kb,假设有10w个用户全部参与签到 0.36 * 100000 / 1024 = 35MB,10w个用户1年才占用35Mb存储空间,就可以签到功能,想比如结构化数据库,所占存储空间可以说是非常小,并且签到数据保留的作用性不是很大,也没有这个必要,所以设置这些key的过期时间为1年
应用
以签到为例,如果需要获取一年当中的某一天是否签到,只需要getbit,对应的offset为dayOfYear,如果需要统计一年当中已经签到了多少天,可以直接使用bitcount进行统计,但是如果想统计已经签到的天数,具体到一年的第几天就需要进一步操作了
由于存储的时候是设置的bit值,所以不能直接用get方法获取值,需要获取当前字符串的byte
如果用jedis更方便获取byte值,这里使用的是stringRedisTemplate,稍微