Redis之bitmap

  1. 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形,所以可以存储任意格式的数据。末尾会有空字符串表示结尾。

  2. bitmap并不是一种数据结构,实际上它就是字符串,但是可以对字符串的位进行操作。

    bitmap有自己的一套命令。可以把bitmap想象成一个以bit为单位的数组,数组的每个单元存储0和1,数组的下标叫做偏移量。

  3. 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求逻辑与/逻辑或/逻辑异或/逻辑非
  1. 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设置

  2. bitmap的优势,以统计活跃用户为例

    每个用户id占用空间为1bit,消耗内存非常少,存储1亿用户量只需要12.5M

  3. bitmap - Redis布隆过滤器 (应对缓存穿透问题)

    举例:比如爬虫服务器在爬取电商网站的商品信息时,首先经过缓存,如果缓存查不到,再去数据库获取信息,因为爬虫的效率很高,且sku很有可能是不存在或者已下架的,就会造成缓存穿透,大量请求被发送到数据库,导致服务器受到影响。

    此时,可以在缓存层之前,添加一个布隆过滤器,布隆 过滤器看作是一个bitmap,sku作为offset值,如果商品真实存在,bit值设为1。首先将商品数据初始化,当有请求时,通过getbit判断sku是否有效。如果布隆过滤器认为商品不存在,就拒绝访问,这样就可以保护存储层。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值