美文网首页redis
redis003--节衣缩食(位图)

redis003--节衣缩食(位图)

作者: 天的安排 | 来源:发表于2019-08-14 09:02 被阅读0次

在我们平时开发过程中,会有一些 bool 型数据需要存取,比如用户一年的签到记录,签了是 1,没签是 0,要记录 365 天。如果使用普通的 key/value,每个用户要记录 365
个,当用户上亿的时候,需要的存储空间是惊人的。

为了解决这个问题,Redis 提供了位图数据结构,这样每天的签到记录只占据一个位,365 天就是 365 个位,46 个字节 (一个稍长一点的字符串) 就可以完全容纳下,这就大大节约了存储空间。

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

统计和查找

Redis 提供了位图统计指令 bitcount 和位图查找指令 bitpos,bitcount 用来统计指定位置范围内 1 的个数,bitpos 用来查找指定范围内出现的第一个 0 或 1。

比如我们可以通过 bitcount 统计用户一共签到了多少天,通过 bitpos 指令查找用户从哪一天开始第一次签到。如果指定了范围参数[start, end],就可以统计在某个时间范围内用户签到了多少天,用户自某天以后的哪天开始签到。

遗憾的是, start 和 end 参数是字节索引,也就是说指定的位范围必须是 8 的倍数,而不能任意指定。这很奇怪,我表示不是很能理解 Antirez 为什么要这样设计。因为这个设计,我们无法直接计算某个月内用户签到了多少天,而必须要将这个月所覆盖的字节内容全部取出来 (getrange 可以取出字符串的子串) 然后在内存里进行统计,这个非常繁琐。

相关文章

  • redis003--节衣缩食(位图)

    在我们平时开发过程中,会有一些 bool 型数据需要存取,比如用户一年的签到记录,签了是 1,没签是 0,要记录 ...

  • 节衣缩食 —— 位图

    在我们平时开发过程中,会有一些 bool 型数据需要存取,比如用户一年的签到记录,签了是 1,没签是 0,要记录 ...

  • 节衣缩食

    食:公司包吃三餐,一天三餐在公司解决后才回家。关键公司的伙食也很好,偶尔还有水果,每天都吃得饱饱的。每天回到家都7...

  • 节衣缩食

    从贫穷年代走过来的人,似乎挺享受这“节衣缩食”四个字所涵盖的无穷力量。 年少时为了生存不得已节衣缩食;如今生活丰衣...

  • 节衣缩食,消费膨胀

    节衣缩食,我有一个朋友从小因为家里条件不太好,从小就懂得节省,一直到长大工作之后对自己都很"抠",衣服鞋子都不舍得...

  • 生活有感-节衣缩食

    节衣缩食的日子来了。这几天,跑了三次浏阳,因为几个同事都开始搞装修,所以张也终于闲不住了。 看了几家全屋定制,跑了...

  • 节衣缩食攒学费

    今天真是……双十一的信用卡账单下来了,各种辅导班又要续费,感觉被这点钱压的透不过气来。其实,真正想不开的原因哪是钱...

  • 从此吃糠咽菜、节衣缩食

    一中要搬至新城区了,小儿过两年也要去上学了,老城区的房子相距甚远,儿子每天骑车上学风里来雨里去,还要上晚自习,着实...

  • 节衣缩食过日子!

    钱不好挣了。口罩事件以来,经济环境是越来越差。可能与个人能力有关,因为水平不行所以就愈发觉得生活之艰难。 为了...

  • 两个位图覆盖合成为一个位图

    /** *把两个位图覆盖合成为一个位图,以底层位图的长宽为基准 *@parambackBitmap在底部的位图 *...

网友评论

    本文标题:redis003--节衣缩食(位图)

    本文链接:https://www.haomeiwen.com/subject/ofswjctx.html