【快速了解redis】五种数据类型-String篇

前记

我们讲到redis的数据类型,需要区分另一个词,redis存储数据的数据模型,我们知道,redis作为一款key-value键值对数据库,这里讲的key-value其实指的就是redis存储数据的数据模型,所有数据都是以这种Map对象模型保存数据的,而我们今天要将的数据类型,指的是value这个值的类型。 他一共有五种,分别是string字符串list数组hash散列set集合sorted set有序集合

key健

Redis keys are binary safe, this means that you can use any binary sequence as a key, from a string like “foo” to the content of a JPEG file. The empty string is also a valid key.

在官方文档中提到redis的key是二进制的,所以他可以是各种二进制序列,如foo,甚至是图片文件,空字符串non-string value都可以作为存储数据的key健。

String类型

string字符串,它是一个动态字符串。redis自身定义了一种简单动态字符串(SDS, simple dynamic string),SDS里,定义了字符串的长度,用作redis的默认字符串表示。它实际上是一个带有长度信息的字节数组。(查询长度的复杂度为O(1)

特性

  1. 他存储数据的长度不能超过512M,即2^(32-1)位bit。(大家可以算算具体有多少位,因为这个位数正是下面举例bitmap运用能得以实现的前提哦)
  2. string存储方式有两种,当长度小于44字节时,会使用embstr编码存储,超过44字节,则使用raw编码存储。
  3. 数据可以是任何类型的字符串,数值,jpg图片,或者序列化的对象等。

常用操作

赋值给key1
1
2
127.0.0.1:6379> set key1 23 # 赋值23给key1
OK
查询key1的值
1
2
127.0.0.1:6379> get key1 # 查询key1的值
"23"
如果key1的值是数值型的,可对数值型做操作,增1
1
2
127.0.0.1:6379> incr key1 # 23+1
(integer) 24
减1
1
2
127.0.0.1:6379> decr key1  # 24-1
(integer) 23
更多操作可到官网或网络上相关博客进行查询,研究。

应用实例

string类型的应用场景很广,将我们需要存储的数据存储下来,或者运用string字符串可以是数值等格式,进行计算等。
这里列举的场景主要是bitmap的运用,因为bitmap这种操作能极大提升一些场景的效率:使用bitmap做网站的访问记录和统计。我快速地说明这里实现的思路。
另一个应用是使用bitmap实现布隆过滤法,一种可防止缓存击穿的技术。网上的质量文章太多了,这里可以发挥下自己的主观能动性,上网查查。

bitmap 位图

bitmap实际上不是一种数据类型,他是基于String类型定义的一组面向位的操作,所以它的值也只有0和1,无法进行复杂的运算,但可以作为状态记录的载体。
如果我们是一台32位机,我们用一个字来记录一个对象的状态,占据的空间就是32bit,而如果用bitmap来记录状态,32bit其实可以记录32个对象的状态。由此可见,使用bitmap可以大大减少存储空间的使用,32倍的存储差距。常用的操作指令有setbitgetbitbitcount

key的偏移offset位的值设置为value
1
setbit key offset value
查询key的偏移offset位的值
1
getbit key offset
查询key的字节索引为start位到字节索引为end位之间值为1的数量,默认统计key的所有bit位值为1的数量

这里注意的是start、end是字节索引index,不是偏移值

1
2
bitcount key [start] [end]
bitcount key1 0 1 #表示统计第0个Byte到第1个Byte的所有bit位为1的总数

下面👇就是bitmap的一个结构

字节 bit0 bit1 bit2 bit3 bit4 bit5 bit6 bit7
byte0 0 0 1 0 0 1 0 0
byte1 0 0 0 0 0 1 0 0
场景分析

有一个用户量为50万的网站,网站首页会显示当天网站用户的访问人数,在网站的每篇文章里显示当前文章的点赞数。
此处有两个需求点:

  • 统计当天上线人数
  • 统计文章点赞数

我们用一个key=visit:date作为我们保存日期为date的访问量,每一位的0代表某一位用户未上线,1代表上线。
当用户id为288832的用户登录时,操作:

1
setbit visit:20210411 288832 1

当我们要查询用户id为288832的用户的登录情况时,操作:

1
getbit visit:20210411 288832

当我们要查询当天网站用户的登录情况时,操作:

1
bitcount visit:20210411

同理,计算某一篇文章的点赞数的实现和上面👆的思路一样的,不再赘叙。而这里,我们可以算算一个50万用户的网站,存储这些信息,需要多大的空间

大约只需60kB的空间。

拓展与思考

这里粗略补充一下冷数据和热数据的概念。

热数据和冷数据

前面列举了统计网站用户的上线人数,文章的点赞人数等,这些数据有什么特点呢?他们都是些我们经常操作的数据,更新特别频繁的数据,包括网站的注册人数,网站的浏览人数等,每次刷新网页或者用户每次登陆都会改变它,我们把这些数据成为热数据。(我们可以很通俗地理解为很热闹的数据😝)

有热数据,自然就有冷数据冷数据一般指的是我们系统中不频繁操作,不频繁访问的数据,如一些业务和操作的日志数据。(冷淡的数据😬)

当然数据的冷和热一定程度上应该是相对的。比如上面实例中提到的上线人数,如果是当天的,我们需要实时计算,这时它属于热数据,但是昨天的,前天的上线数据,我们并不太关心,而在数据分析时才会用上,这些就是冷数据了。

一般来说,热数据对于效率的要求很高,而redis则很大的满足了效率的要求。

下一篇,我会抽空完成【快速了解redis】五种数据类型-List篇的文章,主要是讲List在消息队列的运用,以及拓展一下:redis的单线程