redis高级用法

1.分布式锁
使用setnx命令可以实现分布式锁,但是这个锁会有原子性、可重入问题,就⽐如setnx成功,设置失效时间expire的时候可能失败。第三⽅的⼀些插件可以解决这些问题,Redission ,Jedis等,他们的底层都是通过lua脚本去保证的,就⽐如去删除的时候,去校验是否当前线程锁定的,就把⽐较和删除这样⼀些动作都放到⼀起了:
在这里插入图片描述
2.位图bitmap
在我们平时开发过程中,会有⼀些 bool 型数据需要存取,⽐如⽤户⼀年的签到记录,签了是 1,没签是
0,要记录 365 天。如果使⽤普通的 key/value,每个⽤户要记录 365 个,当⽤户上亿的时候,需要的
存储空间是惊⼈的。
为了解决这个问题,Redis 提供了位图数据结构,这样每天的签到记录只占据⼀个位,365 天就是 365
个位,46 个字节 (⼀个稍⻓⼀点的字符串) 就可以完全容纳下,这就⼤⼤节约了存储空间。
位图不是特殊的数据结构,它的内容其实就是普通的字符串,也就是 byte 数组。我们可以使⽤普通的
get/set 直接获取和设置整个位图的内容,也可以使⽤位图操作 getbit/setbit 等将 byte 数组看成「位数
组」来处理。
当我们要统计⽉活的时候,因为需要去重,需要使⽤ set 来记录所有活跃⽤户的 id,这⾮常浪费内存。
这时就可以考虑使⽤位图来标记⽤户的活跃状态。每个⽤户会都在这个位图的⼀个确定位置上,0 表示
不活跃,1 表示活跃。然后到⽉底遍历⼀次位图就可以得到⽉度活跃⽤户数。
这个类型不仅仅可以⽤来让我们改⼆进制改字符串值,最经典的就是⽤户连续签到。
key 可以设置为 前缀:⽤户id:年⽉ 譬如 setbit sign:123:1909 0 1
代表⽤户ID=123签到,签到的时间是19年9⽉份,0代表该⽉第⼀天,1代表签到了
第⼆天没有签到,⽆需处理,系统默认为0
第三天签到 setbit sign:123:1909 2 1
可以查看⼀下⽬前的签到情况,显示第⼀天和第三天签到了,前8天⽬前共签到了2天
在这里插入图片描述
3.HyperLogLog去重计数
如果统计 PV 那⾮常好办,给每个⽹⻚⼀个独⽴的 Redis 计数器就可以了,这个计数器的 key 后缀加上
当天的⽇期。这样来⼀个请求,incrby ⼀次,最终就可以统计出所有的 PV 数据。
但是 UV 不⼀样,它要去重,同⼀个⽤户⼀天之内的多次访问请求只能计数⼀次。
这就要求每⼀个⽹⻚请求都需要带上⽤户的 ID,⽆论是登陆⽤户还是未登陆⽤户都需要⼀个唯⼀ ID 来
标识。
你也许已经想到了⼀个简单的⽅案,那就是为每⼀个⻚⾯⼀个独⽴的 set 集合来存储所有当天访问过此
⻚⾯的⽤户 ID。
当⼀个请求过来时,我们使⽤ sadd 将⽤户 ID 塞进去就可以了。
通过 scard 可以取出这个集合的⼤⼩,这个数字就是这个⻚⾯的 UV 数据。没错,这是⼀个⾮常简单的
⽅案。
但是,如果你的⻚⾯访问量⾮常⼤,⽐如⼀个爆款⻚⾯⼏千万的 UV,你需要⼀个很⼤的 set 集合来统
计,这就⾮常浪费空间。
如果这样的⻚⾯很多,那所需要的存储空间是惊⼈的。为这样⼀个去重功能就耗费这样多的存储空间,
值得么?其实⽼板需要的数据⼜不需要太精确,105w 和 106w 这两个数字对于⽼板们来说并没有多⼤
区别,So,有没有更好的解决⽅案呢?
HyperLogLog 提供了两个指令 pfadd 和 pfcount,根据字⾯意义很好理解,⼀个是增加计数,⼀个是获
取计数。
pfadd ⽤法和 set 集合的 sadd 是⼀样的,来⼀个⽤户 ID,就将⽤户 ID 塞进去就是,pfcount 和 scard
⽤法是⼀样的,直接获取计数值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值