赣州新闻网

首页 / 科技

什么是边缘计算?与云计算有什么区别

2020-02-23 · 赣州新闻网 · 科技

大家有没有想过如何统计活跃用户数量?如果是自己做,那该怎么做?

这里思考一分钟,后面我将分享一下如何使用 redis 中的位图来统计活跃用户数。

正文

什么是位图 ?

位图(bitmap)是二进制的 byte 数组 ,也可以简单理解T b 1 $ J 7成是一个普通字符串。它将二进制数据存储在 byte 数组中以达到存储数据的作用。

Redis 位图基础到统计活跃用户

图 1.1# [ T A n w v s

如何使用位图 ?

理清概念

在W | E ?解释什么是位图的时候说过,位图可以理` ! + d解成是一个普通字符串, 那么我们为什么要用位图而不是字符串呢 ?

下面是F 4 , v n Q ( n P在 redi} E l Bs 中存储字符串的一个示意图

Redis 位图基础到统计活跃用户

图 2.1

如图,存储字符串是将` u t G ` g : R -字符串二进制数组的形式存储在 redis 中,位图可以直接对 二进制的数组操作, 位图的优势在于可以用 0 和 1来存储布尔值,这大大降低了我们的存储空间消耗 。. ( _ g / H h由于这个特性,我们 用位图来记录S ~ 7 i } t P &签到信息,记录活跃用户等 ,可以达到节省空间的能力(后面会有介绍)。

那我们如何对二q { a进制的数组进行操作呢?

基本存取

setbit | getbit

上文说c a 7 h H Z ~的二进制数组我们y j @ / ? C ) A可以对它做 添加、查找及修改 的功能

如何进行添加和查找呢?

se$ ; }tbit   

offset:偏移量,指的是数组的下标; value: 数据, 只能是 0 和 1。

这条命令既可以添加数据也可以修改数据。f - B

如B g O &何进行查找呢 ?

getbit r @ & { L 

offset:偏移量,: ( ] a B o e k p指的是数组的下标。这里,除了设置 value 为 1 的 offset, 查询其他的都返回 0

补充:上面说了位图可以理解成字符串,那么它们之间可以互相操作吗?

Redis 位图基础到统计活跃用户

图 2.2

请对照上图,我们一起完成下面的探究:

  1. 以字符串存储,可以通过 getbit 命令获取到值吗?我们可以结合查询和图片所示的 offsL 0 K , 7 e 5 t &et 及所对应的值来验H I q { m证> set str hi OKM B & L b z > getbit str 0 (* J Yintek 9 ! K ]ger) 0 > getbit str 4 (] n t W M o 6 _ Rinteger) 1U # g ( > getbit str 7 (integer) 0 > getbib ^ d Pt str 15 (integer) 1 复制代码结论:可以的
  2. 以字符串存储,可以通过 settbit 修改值吗?我们可以试着将 offset 7 对应的 vaA } 2 L L Hlue 改成 1, 如果成功了,h 字符应该变成 i> setbit str 7 1 (integer) 0 > get str \"ii\" 复制代码结论:可L g r p 0 G h以
  3. 用 setbit 存储字符串的二进制数据,可以通过 get 获取字符串吗?我们将 字符 h 的二进制存入9 @ 9 e # %位图,看可以能通过 get 获取> setbit bitmap 0 0 (integer) 0 > setbit bitmap 1 1 (integer) 0 >g N m M ` 0 setbit bitmap 2 1 (integer) 0 > setbit bitms ) V R kap 3 0 (integer) 0 > setbit bitmap 4 1 (integer) 0 > setbit bitmap 5 0 (inte) . ager) 0 > setbit bitmap 6 0 (integer) 0 > setbit bitmac N W X X %p 7 0 (integ, * 9 x ! v C 3er) 0 > get bitma_ l J # I 5p \"h\" 复制代码结论:可以

上面介绍了位图的基本U | Y { 6 p = g概念和使用,通过一系列的探究希望能帮助大家更好的理解位图

那么,如何将位图应用的项目中呢?

统计和查找

bitcount | bitpos

bitcount 是用来查找 1 出现的| N 2 . k - R S次数,既可以对位图使用也可以对字符串使用 ,用法如下:

bitcount   

注意:这里的 startWith 和 endWf c U g 5 8 ! `ith 不* y A h是二进制数组的下标(offsx p ?et)

这里的 startWith 和 endWith 可以理解成是字符串的下标,一个字符串对应 8 位二进制数据Z G C W 2 . 0 =;它Q ^ 们相当于是截取字符串,如 s= b * a o r @\"hi\" , s = \9 N 3"h\" , 它所对应的二进制数组的下标是 0,7,以此类推 X { D # v j。

其实这里不好解释,先来带代码,可以结合着上面的 图 2.2 看一下,大家后面G / b J C可以在领悟一下

> set str hi
> bitcount str 0 0
(integer) 4
> bitcount str 0 1
(integer) 8
> bitc ` ^ X [ v v A ount strG # a i E G u
(integer) 8

注意:startWith 和 endWith 不设置的时候默认全部范围

应用场景:s q v 7 v 1 Y 统计活跃用户的数量

bitpos 用来查找指定范围内出现C x v * U的第一个 0 或 1 ,用法如下:

bitpos    

bit: 要找的 0 或者 1, start 和 ene ] 1 F u 8 c 7d 同上面的 startWith 和 endWith

应用场景: 获取第一次签到和第一F U G R I 1 X次未签到的时间

应用场景

上面大致说了 2 个应用场景:

  1. 统计活跃用户的数量
  2. 获取第一次签到和第一次未签到的时间

我在这里稍微介绍一下思路,然后附上一个 统计活跃用户的数量 可供参考

统计活跃用户的数量

  1. 将位图的 keyName 设置成需要统计的 行为和时间范围 , 如: login:2020-3
  2. 将用q [ $ @ n F户对应到位图中的 offset , 如 id 对b L i W B Z x c应二进制数组的下标, id 为 int
  3. 签到成功使用 setbit 将对应的 offset 设置成 1
  4. 使用 bitcount 统计某个 行为和时间范围 的活跃人数,如 bitcount login:2020-3

Demo: DailyActiveUsers

获取第一次签到和第一次未签到的时间

  1. 将位图的 keyName 设置成需要统计的 行为和时间范围和对象 , 如: R R T h I |: lof M 4gin:2020-3:Tom
  2. 将日期对应到位图中的 offset , 如 1号对应二进制数组的下标 0, 2 号为 1
  3. 签到成功J B ? K n W 4 P )使用 setbit 将对应的 offset 设置v : N 5 K成 1
  4. 使用 bitpos 统计某个 行 X ]为和时间范围和对象 的签到情况,如 bitr h A C w G ( ypos login:2020-3:Tom 1

项目设置能力信息一个字石城区别云计算计算