Redis中bitmap性能数据结构

168 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第12天,点击查看活动详情

前言

  • 开发过程中我们经常需要记录统计数量,比如我想统计点赞数量。按照传统的数据结构那么我们就需要将为每一篇博客设置一个键值对,key-value形式的,这样无疑会造成数据的浪费。

  • redis 中为我们提供了一种新型的数据结构 bitmap ,这种数据结构我们之前也有所接触,那么就是我们的布隆过滤器。 他的本质上就是一种 String 数据结构,要知道 RedisString 内容最多可以存储512M的内容,超出就无法存储了。我们之前用 String 进行存储就是将字符的字节进行拼接存储在内存中。而 bitMap 则是通过位进行存储的,他的内容也只有0和1的分别。

  • 点赞一篇博客就存储到1bit内存中,那么想想掘金日点击量这个高的情况下将会得到多少内存的节省,从而提高网站的响应速度。

原理

  • 比如说我们现在有个存储的bitmap 。 我们只需要看看存入的字符对应的二进制编码,1个字节都是由8的bit组成,那么存储在 bitmap 中的就是拼接的16bit.

setbit test 1 1

  • 我们如上存储了一个bit,设置了1位1 , 即表示 01000000 。而这个二进制对应的字符是 @ 。 这样操作是不是很方便。

image.png

  • 类似这种无法打印的字符,redis中给我们转成16进制的输出。

操作

  • 正常情况我们使用格式为 setbit key offset value 进行设置bitmap类型的数据,获取的话也是对应的命令getbit key offset
  • 值得注意的是我们的bitmap可以理解成一个可变数组,当我们的偏移量超过了我们的bitmap的长度,这个时候他会自动扩容了。所以我们在操作的时候尽量不要迈太大的步子。这样容易造成性能浪费。最好是按顺序操作。