前言
对于我们平时的一些 区应用,如微博,知乎,掘金等应用点赞,评论这类功能是不可或缺的,例如点赞功能我们其实是可以通过 mysql 去做实现的,但是每次点赞都去实时改库可以想象一下当遇到一个热点文章例如,前段时间大火特火的爆料帖子,这个上千万乃至亿级的点赞量,这个时候我们再去实时改库的话就不那么恰当,今天我们介绍的主角是Redis的位图操作,接下来我们引出正题,来看一下是这么做到的;
介绍
在 Redis 里位图并不是一个真正的数据类型,其实就是一种普通的字符串,也可以说是byte数组。它是定义在字符串类型中,一个字符串类型的值最多能存储字节的内容也就是;
?2^(9(512)+10(1024)+10(1024)+3(8b=1B))=2^32b
?
应用场景:
- 用户签到
- 用户在线状态
- 统计活跃用户
- 各种状态值
- 自定义布隆过滤器
- 点赞功能
可以想象一下假如我们要统计一个用户一年的签到记录,要记录 365 天。如果使用普通的 ,每个用户要记录 ,当用户上亿的时候,需要的存储空间是惊人的。因为只统计我们可以使用来进行存储,这样每天的签到记录只占据一个位,365 天就是 个位, 个字节 (一个字节有8位) 就可以完全容纳下,这样就很节省资源了,同时也提高了效率;
基本命令:
简单使用:
点赞功能
我们先拿点赞功能来做一个简单的编码介绍:
点赞功能
我这里的处理方式是异步改库,点完赞之后异步修改数据库,不要求实时处理结果其实可以用定时任务去批量改库(需要存一定时间内的 postId 和 userId 索引关系);
取消点赞的操作和这个相反将就OK了!
统计点赞数:
在页面展示的时候我们我们只需要查询当前的这个 bitmap 的总数就 ok 了!
范围统计
当然我觉得范围查找最实用的场景就是签到统计 第一种玩法:userId 为 key,时间戳为 offset,签到 1 未签到 0 可以使用以下命令:
- BITPOS key bit start :从start+1个字节开始查找,直到尾部
- BITPOS key bit start end:从start+1字节开始到end+1字节之间查找
第二种玩法:时间为 key,userId 为 offset,签到 1 未签到 0 可以使用以下命令:
- BITOP operation destkey key [key …]
对一个或多个保存二进制位的字符串 key 进行位操作,并将结果保存到 destkey 上。operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种
ok!一个简单的位图实现点赞等功能就实现了,大家一个举一反三哈,玩法还是很多的,大家也可以根据自己的需求去做优化,希望可以对大家有帮助,有不对的地方希望大家可以提出来的,共同成长。
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树使用JDBC操作数据库数据库操作93905 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!