Redis三种特殊数据类型——bitmap位图计算

Redis三种特殊数据类型:bitmaps位图、hyperloglog基数统计 和 geospatial 地理空间

 一、介绍

位图计算。Redis提供的Bitmaps可以实现对位的操作。Bitmaps本身不是一种数据结构,实际上就是字符串,可以对字符串的位进行操作。

可以把Bitmaps想象成一个以位为单位数组,数组中的每个单元只能存0或者1,数组的下标在bitmaps中叫做偏移量。单个bitmaps的最大长度是512MB,即2^32个比特位。

优点

  • 省空间:基于最小的单位bit进行存储
  • 效率高:设置时候时间复杂度O(1)、读取时候时间复杂度O(n),操作是非常快的

限制
redis中bit映射被限制在512MB之内,所以最大是2^32位。建议每个key的位数都控制下,因为读取时候时间复杂度O(n),越大的串读的时间花销越多。

二、操作命令

命令 功能 描述

setbit

设置 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit) ,只能是0和1
getbit 获取 对 key 所储存的字符串值,获取指定偏移量上的位(bit)
bitcount 计算 计算key的字符串值中,被设置为 1 的bit的数量

1、setbit   向key中存储的字符串设置位的值   (添加)

语法:setbit key offset value 

# 案例一:可以计算周一到周日的打卡,用0或1区分 是否打卡
127.0.0.1:6379> setbit sign 0 1 # 设置sign这个key,在第0位上的值为1(周一)
(integer) 0
127.0.0.1:6379> setbit sign 1 1 # 第一位上的值为1(周二)
(integer) 0
127.0.0.1:6379> setbit sign 2 0 # 第二位上的值为0(周三)
(integer) 0

127.0.0.1:6379> getbit sign 2  # 获取sign这个key第二位上的值是0还是1(周三)
(integer) 0

——————可以理解为,每天打开的状态,每一天占坑,坑里用0和1 来区分状态


# 案例二:操作位的偏移量
127.0.0.1:6379> set str a # 使用set设置一个名为str的key,值为:"a"
OK
127.0.0.1:6379> get str  # 获取字符串值
"a"

127.0.0.1:6379> getbit str 6  # 获取str的键的值在第6位是什么
(integer) 0  # 值是“0”

127.0.0.1:6379> setbit str 6 1  操作位数,设置第6位的位置的值为1
(integer) 0
127.0.0.1:6379> get str  # 获取字符串值
"c"  # 字符串值由“a" 变成了"c"

——————更改字符串的ascii码,位数上的值

案例二:设置一个名为 str 的key,其key的值为"a",流程如下:

其中a的Ascii 值是97,97 的二进制是 1100 001,上述  setbit str 6 1  命令,就是把str对应的二进制的 第6位(从左往右数),改为1,即 1100 001 ——> 1100 011,即十进制数是99,对应的字符为 "c"

2、bitcount   计算位的值是1的个数   (计算)

语法:bitcount key  [start end]

# 获取str键的值
127.0.0.1:6379> get str
"c"

# (对应的ascii码是:1100 011)统计被设置为1的 位的数量
127.0.0.1:6379> bitcount str
(integer) 4

三、总结

bitmap位图,都是操作二进制位来进行记录,就只有0和1两个状态!

统计一年的是否打卡状态,365天 = 365 bit(位数)  1字节=8bit    总共也就占46个字节左右!

你可能感兴趣的:(redis,redis,数据库,database)