🙋Redis的一大特性就是有丰富的数据类型,这篇文章我们来整理总结一下Redis的数据类型。
Redis的数据类型有如下5种:String、hash、list、set、zset。
string
string是redis 最基本的数据类型。一个 key 对应一个 value。
string是二进制安全的。也就是说 redis 的 string 可以包含任何数据。比如 jpg 图片或者序列化的对象。
string 类型是 redis 最基本的数据类型,string 类型的值最大能存储 512 MB。
理解:string 就像是 java 中的 map 一样,一个 key 对应一个 value。
hash
Redis hash是一个键值对(key - value)集合。
Redis hash是一个 string 类型的 key 和 value 的映射表,hash 特别适合用于存储对象。
理解:可以将 hash 看成一个 key - value 的集合。也可以将其想成一个 hash 对应着多个 string。
与 string 区别:string 是一个key-value键值对,而hash是多个key - value 键值对。
list
Redis 列表是简单的字符串列表,按照插入顺序排序。我们可以往列表的左边或者右边添加元素。
我们可以看出 list 就是一个简单的字符串集合,和 Java 中的 list 相差不大,区别就是这里的 list 存放的是字符串。list内的元素是可重复的。
set
redis的set是字符串类型的无序集合。集合是通过哈希表实现的,因此添加、删除、查找的复杂度都是O(1)。
redis 的 set 与 java 中的 set 还是有点区别的。
redis 的 set 是一个 key 对应着 多个字符串类型的 value,也是一个字符串类型的集合,但是和 redis 的 list 不同的是 set 中的字符串集合元素不能重复,但是 list 可以。
Zset
redis zset 和 set 一样都是 字符串类型元素的集合,并且集合内的元素不能重复。
不同的是,zset 每个元素都会关联一个 double 类型的分数。redis 通过分数来为集合中的成员进行从小到大的排序。
zset的元素是唯一的,但是分数(score)却可以重复。
zset 是按照分数的大小来排序的。
🙇以上5中数据类型的相关命令在我们的日常开发中应该是很常用了,这儿就不打算进行总结整理了,如果有对哪个数据类型不熟悉,或者对命令不熟悉,自行百度学习学习。
🙋接下来我打算说一个redis中特殊的数据类型:bitmap,当然并不是除上面5中数据类型外新加的数据类型,也是在上面5中数据类型的基础上的,配合新加的命令实现一些非常规操作。其实除了bitmap,redis中还有一些其他的特殊数据类型如:geo、hyperloglog,这些个我是真没用过,我不说了。
bitmap
BitMap就是通过一个 bit 位来表示某个元素对应的值或者状态,每个bit位只有0或1两个值,也就是说每个bit为最多能存储的信息是2。其中的 key 就是对应元素本身,实际上底层也是通过对字符串的操作来实现。从redis2.2.0开始新加了setbit、getbit、bitcount等几个bitmap的命令,但是并没有新加数据类型。
优势:
基于最小单位bit进行存储,所以非常节省空间。
设置的时候空间复杂度为O(1),读取的时候空间复杂度也是O(1)。所以读写操作是非常快的。
二进制的数据存储,进行相关位运算是非常快的。
扩容方便。
限制:
redis中bit映射限制为512M内,即最大为2^32位。所以建议每个key的位数都控制一下,而且位数越长读取所需要的时间花销也越大。
#offset必须是数字,value只能是0或1。bit默认是0。
SETBIT key offset value
#返回一个key的某一位的信息
getbit key offset
#返回一个key从start到end字节中bit=1的数量
bitcount key [start end]
#对key1 key2进行位运算,结果放在destkey中,option:ADD、OR、NOT、XOR
bitop option destkey key1 key2...
复制
应用场景:简单举几个例子说明一下bitmap的应用场景,更多的场景需要同志们自行动动大脑了。
用户签到。在很多应用中需要统计用户一个月或一周的签到情况。我们可以以用户uid和月份为key,下面是使用bitmap的实现:
>setbit 202008:uid 1 1 # 202008月第一天签到
(integer) 0
>setbit 202008:uid 3 1 # 202008月第三天签到
(integer) 0
>bitcount 202008:uid #202008月总计签到次数
(integer) 2
复制
活跃用户统计。日期为key,用户uid为offset,当天如果用户有登陆过服务,就设置活跃度为1。统计当天或者几天的活跃度。
# 20200825
> setbit 20200825 2341 1
> setbit 20200825 2552 1
> bitcount 20200825
(integer) 2
# 20200826
> setbit 20200826 2552 1
> bitcount 20200826
(integer) 2
# 统计0825和0826两天都在的活跃度。
> bitop and 20200825_26 20200825 20200826
(integer) 1
复制
注意:bitcount key [ start end] 命令,start和end表示的是字节,而不是bit位。看代码:
SETBIT online 0 1
SETBIT online 1 1
SETBIT online 8 1
> bitcount online
(integer) 3
> bitcount online 0 0
(integer) 2
> bitcount online 0 1
(integer) 3
> bitcount online 1 1
(integer) 1
复制
不积跬步,无以至千里。
文章有帮助的话,点个转发、在看呗
。
谢谢支持哟 (*^__^*)
复制
END
👇