redis的setbit、getbit、bitcount命令

老吴2019-04-09 12:32笔记320浏览


版权声明:本篇文章为原创文章,转载请注明出处。https://yao2san.com/article/2052

最近想对网页数据采集时的去重方式进行优化,最终决定使用布隆过滤器来实现,于是先需要先了解一下redis中的setbit/getbit操作,并做个总结。(由于布隆过滤器在4.0版本之后才以插件模块的形式提供,而我用的是3.X的版本,因此不能直接使用,需要自己实现)

redis中的字符串都是以二进制存储的,因此所有数据都能序列化为一个字符串存在redis中,我想也正式因为redis是以二进制存储的,所以在使用jedis等工具时,才需要定义一个key和value的序列化转化方式吧。

redis也提供了一个直接操作二进制数据的命令:setbit/setbit,它可以对存储的数据的任意一位进行操作。

setbit

设置指定key的偏移量处的值

setbit key offset value

key:键值

offset:二进制数据的偏移量(注意从左开始为第0位)

value:要设置的值(0或1)

返回值是旧该位处的值

getbit

获取对应key的offset处的值

get key offset

key:键值

offset:偏移量

bitcount

用于统计指定key的value二进制的1的个数

bitcount key startOffset endOffset

key:键值

startOffset:起始偏移量(注意:这个偏移量是以字节为单位的

endOffset:结束偏移量(注意:这个偏移量同样是以字节为单位的

验证

例如我们存入一个key为m值为b的键值对:

set m b

则实际存储的是b的二进制(转化为ascii码),即01100010,那么我们可以使用setbit 7 1来修改为01100011,即为c,如下图所示,通过setbit将b修改为了c:

然后我们统计一下1的个数:

由于c的二进制为01100011,所以结果为4。

然后set m bc,再使用bitcount统计1的个数:

bc的二进制为01100010 01100011

因此bitcount m 0 0 统计的是第一个字节(从左向右)的1的个数为3,bitcount m 1 1统计的是第二个字节的1的个数为4.

bitcount在统计日登陆/活跃用户时还是很有用的。


另:以下是一篇关于redis常用命令的一篇文章:

https://www.cnblogs.com/dmego/p/9770613.html

赞一个! (0)

文章评论(如需发表图片,请转至留言)