Redis对数据保存时,通过redisObject对象来存储
redisObject属性:type(数据类型)、encoding(编码方式)
1、String的编码方式最常用的是int;
2、还有EMString(固定编码方式)初始化长度小于44,内存分配以及回收只需一次,效率较高;
3、raw字符串,动态分配,大于44的字符串一般用raw
Redis会根据保存的数据类型,状态,动态的选举最合适的编码方式来节省空间资源。
prt(指针)指向另外一种结构sdshdr
1、free:表示当前剩余容量
2、len:表示当前字符串长度
3、buf:表示当前字符串的字节数组,使用bitmap形,所以可以存储任意格式的数据。末尾会有空字符串表示结尾。
bitmap并不是一种数据结构,实际上它就是字符串,但是可以对字符串的位进行操作。
bitmap有自己的一套命令。可以把bitmap想象成一个以bit为单位的数组,数组的每个单元存储0和1,数组的下标叫做偏移量。
bitmap的命令
常用命令 | 作用 |
---|---|
1、getbit key offset | 用于获取Redis中指定key对应的值,中对应offset的bit |
2、setbit key key offset value | 用于修改指定key对应的值,中对应offset的bit |
3、 bitcount key [start end] | 用于统计字符串被设置为1的bit数 |
4、bitop and/or/xor/not destkey key [key …] | 用于对多个key求逻辑与/逻辑或/逻辑异或/逻辑非 |
bitmap的应用场景 - 统计
通过 bitcount可以很快速的统计,比传统的关系型数据库效率高很多
1、比如统计年活跃用户数量
用户的ID作为offset,当用户在一年内访问过网站,就将对应offset的bit值设置为“1”;
通过bitcount 来统计一年内访问过网站的用户数量
2、比如统计三天内活跃用户数量
时间字符串作为key,比如 “190108:active“ “190109:active”“190110:active” ;
用户的ID就可以作为offset,当用户访问过网站,就将对应offset的bit值设置为“1”;
统计三天的活跃用户,通过bitop or 获取一周内访问过的用户数量
3、连续三天访问的用户数量 bitop and
4、三天内没有访问的用户数量 bitop not
5、统计在线人数 设置在线key:“online:active”,当用户登录时,通过setbit设置
bitmap的优势,以统计活跃用户为例
每个用户id占用空间为1bit,消耗内存非常少,存储1亿用户量只需要12.5M
bitmap - Redis布隆过滤器 (应对缓存穿透问题)
举例:比如爬虫服务器在爬取电商网站的商品信息时,首先经过缓存,如果缓存查不到,再去数据库获取信息,因为爬虫的效率很高,且sku很有可能是不存在或者已下架的,就会造成缓存穿透,大量请求被发送到数据库,导致服务器受到影响。
此时,可以在缓存层之前,添加一个布隆过滤器,布隆 过滤器看作是一个bitmap,sku作为offset值,如果商品真实存在,bit值设为1。首先将商品数据初始化,当有请求时,通过getbit判断sku是否有效。如果布隆过滤器认为商品不存在,就拒绝访问,这样就可以保护存储层。
更新时间:2024-10-26 16:27