Redis面试: 如何实现位操作及典型应用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/William0318/article/details/89290335
通过阅读本篇文章,将为您讲解Redis如何实现位操作。

Redis位图操作不是新的数据结构,它的内容其实就是普通的字符串,也就是 byte 数组。我们可以使用普通的 get/set 直接获取和设置整个位图的内容,也可以使用位图操作 getbit/setbit 等将 byte 数组看成「位数组」来处理。

Redis位操作指令

指令setbit指定位的值,getbit获取某个位的值

> SETBIT key offset value //对key所储存的字符串值,设置或清除指定偏移量上的位,返回指定偏移量原来储存的位。
> setbit bittest 1 1
> GETBIT key offset //对 key 所储存的字符串值,获取指定偏移量上的位; 
//当 offset 比字符串值的长度大,或者 key 不存在时,返回 0
> getbit bittest 1
> BITCOUNT key [start] [end] //计算给定字符串中,被设置为 1 的比特位的数量
>  bitcount bittest 0 1
>  BITPOS key bit [start] [end] //位图中第一个值为 bit 的二进制位的位置
>  BITOP operation destkey key [key …] //对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上
>  BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL] //

BITFIELD 命令可以将一个 Redis 字符串看作是一个由二进制位组成的数组, 并对这个数组中储存的长度不同的整数进行访问, 可用指令get, set, incryby。

字符串swh的ascII码 s:1110011 w:1110111 h:1101000
> set string swh
> 

BITFIELD 命令还可以对指定的整数执行加法操作和减法操作, 并且这些操作可以通过设置妥善地处理计算时出现的溢出情况。

后续补充

位图应用场景

1、使用 bitmap 实现用户上线次数统计

假设现在我们希望记录自己网站上的用户的上线频率,比如说,计算用户 A 上线了多少天,用户 B 上线了多少天,我们可以以username作为key, 每上线一天就setbit一下,offset为开始统计的日期以来的天数。

今天是2018.01.01,开始统计上线次数。用户peter登录了,执行
setbit peter_login 1 1
明天peter登录的话,执行setbit peter_login 2 1

最后统计的话,执行bitcount peter_login, 就可以统计出距离上线开始的登录次数。
这些数据也可以统计出某个时间段的登录天数,比如在2018.01.01-2019.01.01登录次数bitcount peter_login 0 365

利用bitpos可以从数据中捞出用户在指定范围内第一次登录的时间。

2、按天统计网站活跃用户

天作为key,用户的id作为offset,上线设置为1。
比如我要统计2018.01.01-2018.06.01的登录用户数量。
第一天2018.01.01, 用户id为1和200的用户登录
setbit 20180101 1 1;
setbit 20180101 200 1;

最后统计
BITOP OR login 20180101 20180102 …
BITCOUNT login
最终计算出活跃人数。

猜你喜欢

转载自blog.csdn.net/William0318/article/details/89290335
今日推荐