3-位图的使用场景

1、二进制安全

  • redis只存储字节流,与外界交互,存取都是字节流,只要双方客户端有统一的编解码,数据就不会被破坏。
  • redis拿的是字节流,编码是一个字符一个字节
  • redis-cli --raw 连接redis服务,并触发编码器的格式化。如果不格式化,redis只会识别ASCII码的,超出ASCII码,则显示为16进制

2、位图的使用场景

2.1、场景一:统计一段时间内用户的登录天数

  • 如果用数据库实现

    • 创建表,用户每笔登录都产生一行记录,然后登录登录时间,还有其他数据也需要记录。MySQL数据库表与表时间还需要主外键。算一下成本,表最小,每行存一个ID和登录日期,各自至少4个字节,也得要8个字节,就是说一个用户的一笔登录就要消耗8个字节,那再乘以登录天数,大概200多天,8*200/8=200,即200个字节,表示了一个用户一年的登录状态,然后几百万个用户,成本比较大

    • 再来看redis如何实现呢?如果每一天对应一个二进制位,从左到右,第一个二进制位表示第一天,第二个二进制位表示第二天,最多366个二进制位,366/ 8 = 46,即最多用46个字节就表示了一个用户一年的登录状态,乘以100万个用户,则460KB就表示了100万个用户全年的登录状态。举例如下:该用户有3次登录

    • setbit Bob 1 1 Bob用户第2天登录了

    • setbit Bob 7 1 Bob用户第8天登录了

    • setbit Bob 364 1 Bob用户第365天登录了


    统计今年最后2周的登录次数为1

    bitcount Bob -2 1 ----->结果为1

    2.2、场景二:京东618活动,在这一天,给登录的用户送礼物,一个人只能送一件礼物,共需要准备多少礼物

​ 电商用户划分为僵尸用户、冷热用户、忠诚用户,每个用户还可能有多个账号。我们怎么去统计呢?其实我们很多用户都没有经常登录,我们统计活跃用户数即可。那么统计活跃用户数时,需要去重,比如1号到3号这期间,不管这个用户登录了1次还是2次,只要登录了就算,这得去重。

​ 用redis的位图来做,用日期当做key,value呢?我们把每个用户的ID映射到一个二进制位上,每一个二进制位都表示一个用户

​ setbit 20210101 0 1 # 用户Bob登录了,用0号位表示Bob

​ setbit 20210102 0 1 # 用户Bob还是登录了

​ setbit 20210102 7 1 # 用户张三登录了,用第8号位表示张三


  • 统计结果:

​ bitop or orkey 20210101 20210102

​ bitcount orkey 0 -1 # 结果为2,即表示有2个用户登录了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 缓存 Redis最常见的应用场景是缓存。将热点数据存储Redis缓存中,可以极大地提升应用程序的性能,减轻后端数据库的负担。Redis支持多种数据结构,如字符串、哈希表、列表、集合和有序集合等,可以满足不同类型的缓存需求。 2. 消息队列 Redis提供了一种名为“发布/订阅”的机制,可以用于实现消息队列。发布者将消息发布到指定的频道,订阅者从频道订阅消息。Redis还支持阻塞式读取,当没有消息可读时,订阅者会一直等待,直到有新消息到达。 3. 计数器 Redis的原子性操作可以用于实现计数器。例如,可以使用INCR命令将一个键的值增加1,DECR命令将一个键的值减少1。Redis还支持位图操作,可以用于统计用户登录次数、在线时长等数据。 4. 分布式锁 Redis的分布式锁机制可以用于解决分布式系统中的并发问题。通过将锁的状态存储Redis中,可以实现对资源的独占访问。Redis提供了多种实现分布式锁的方式,如SETNX命令、Lua脚本、Redlock算法等。 5. 地理位置 Redis提供了一些地理位置相关的命令,如GEOADD、GEODIST和GEORADIUS等。这些命令可以用于存储和查询地理位置信息,例如,可以记录商店的坐标,并查询附近的商店信息。 6. 排行榜 Redis的有序集合可以用于实现排行榜。将每个用户的得分作为有序集合中的分值,可以按照得分排名。Redis还支持多种操作,如ZADD、ZINCRBY、ZRANK和ZREVRANGE等,可以方便地对排行榜进行操作。 7. 分布式缓存 Redis可以作为分布式缓存使用,可以将数据存储在多个Redis实例中,提高可靠性和性能。Redis提供了多种分布式缓存方案,如Redis Sentinel、Redis Cluster和Twemproxy等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值