【快速了解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))
特性
- 他存储数据的长度不能超过512M,即2^(32-1)位bit。(大家可以算算具体有多少位,因为这个位数正是下面举例bitmap运用能得以实现的前提哦)
- string存储方式有两种,当长度小于44字节时,会使用embstr编码存储,超过44字节,则使用raw编码存储。
- 数据可以是任何类型的字符串,数值,jpg图片,或者序列化的对象等。
常用操作
赋值给key1
1 | |
查询key1的值
1 | |
如果key1的值是数值型的,可对数值型做操作,增1
1 | |
减1
1 | |
更多操作可到官网或网络上相关博客进行查询,研究。
应用实例
string类型的应用场景很广,将我们需要存储的数据存储下来,或者运用string字符串可以是数值等格式,进行计算等。
这里列举的场景主要是bitmap的运用,因为bitmap这种操作能极大提升一些场景的效率:使用bitmap做网站的访问记录和统计。我快速地说明这里实现的思路。
另一个应用是使用bitmap实现布隆过滤法,一种可防止缓存击穿的技术。网上的质量文章太多了,这里可以发挥下自己的主观能动性,上网查查。
bitmap 位图
bitmap实际上不是一种数据类型,他是基于String类型定义的一组面向位的操作,所以它的值也只有0和1,无法进行复杂的运算,但可以作为状态记录的载体。
如果我们是一台32位机,我们用一个字来记录一个对象的状态,占据的空间就是32bit,而如果用bitmap来记录状态,32bit其实可以记录32个对象的状态。由此可见,使用bitmap可以大大减少存储空间的使用,32倍的存储差距。常用的操作指令有setbit、getbit、bitcount。
将key的偏移offset位的值设置为value
1 | |
查询key的偏移offset位的值
1 | |
查询key的字节索引为start位到字节索引为end位之间值为1的数量,默认统计key的所有bit位值为1的数量
这里注意的是start、end是字节索引index,不是偏移值1
2bitcount 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的单线程
- 本文作者:啊华
- 本文链接:https://lamwimham.github.io/2021/04/11/redis-data-type-string/index.html
- 版权声明:本博客所有文章均采用 BY-NC-SA 许可协议,转载请注明出处!