Redis BitMap适应场景
来源:互联网 发布:iphone怎么投屏到mac 编辑:程序博客网 时间:2024/06/03 20:32
Bitmap以及Redis Bitmaps快速入门(Crash Course on Bitmap and Redis Bitmaps)
Bitmap(即Bitset)
Bitmap是一串连续的2进制数字(0或1),每一位所在的位置为偏移(offset),在bitmap上可执行AND,OR,XOR以及其它位操作。
位图计数(Population Count)
位图计数统计的是bitmap中值为1的位的个数。位图计数的效率很高,例如,一个bitmap包含10亿个位,90%的位都置为1,在一台MacBook Pro上对其做位图计数需要21.1ms。SSE4甚至有对整形(integer)做位图计数的硬件指令。
Redis Bitmaps
Redis允许使用二进制数据的Key(binary keys) 和二进制数据的Value(binary values)。Bitmap就是二进制数据的value。Redis的 setbit(key, offset, value)操作对指定的key的value的指定偏移(offset)的位置1或0,时间复杂度是O(1)。
一个简单的例子:日活跃用户
为了统计今日登录的用户数,我们建立了一个bitmap,每一位标识一个用户ID。当某个用户访问我们的网页或执行了某个操作,就在bitmap中把标识此用户的位置为1。在Redis中获取此bitmap的key值是通过用户执行操作的类型和时间戳获得的。
这个简单的例子中,每次用户登录时会执行一次redis.setbit(daily_active_users, user_id, 1)。将bitmap中对应位置的位置为1,时间复杂度是O(1)。统计bitmap结果显示有今天有9个用户登录。Bitmap的key是daily_active_users,它的值是1011110100100101。
因为日活跃用户每天都变化,所以需要每天创建一个新的bitmap。我们简单地把日期添加到key后面,实现了这个功能。例如,要统计某一天有多少个用户至少听了一个音乐app中的一首歌曲,可以把这个bitmap的redis key设计为play:yyyy-mm-dd-hh。当用户听了一首歌曲,我们只是简单地在bitmap中把标识这个用户的位置为1,时间复杂度是O(1)。
[java]
Redis.setbit(play:yyyy-mm-dd, user_id, 1)
Redis.setbit(play:yyyy-mm-dd, user_id, 1)
今天听过歌曲的用户就是key是play:yyyy-mm-dd的bitmap的位图计数。如果要按周或月统计,只要对这周或这个月的所有bitmap求并集,得出新的bitmap,在对它做位图计数
利用这些bitmap做其它复杂的统计也非常容易。例如,统计11月听过歌曲的高级用户(premium user):
(play:2011-11-01∪ play:2011-11-02∪ … ∪ play:2011-11-30)∩premium:2011-11
1亿2千8百万用户的性能比较(Performance comparison using 128 million users)
下面的表格显示了在1亿2千8百万用户上完成的时间粒度为1天,一周,一个月的用户统计的时间消耗比较。
- Redis BitMap适应场景
- epoll的适应场景
- Node.js 适应场景
- HAWQ适应场景总结
- CoreOS的适应场景介绍
- redis bitmap 入门
- redis bitmap实现签到
- redis bitmap 入门
- redis bitmap的秘密
- Redis:九、redis使用场景
- Redis:九、redis使用场景
- redis--3--Redis应用场景
- Redis应用场景 redis精髓
- Redis应用场景
- Redis使用场景
- Redis应用场景
- Redis应用场景
- Redis应用场景
- strcmp实现
- 从session里面取得值为null
- 线程练习
- Mathematica 之 module
- 计算机网络之NAT
- Redis BitMap适应场景
- 停车场管理系统
- Laravel5.3学习笔记
- Easyui 基础布局和静态菜单栏
- 【opencv】双目视觉下空间坐标计算
- OleDbDataAdapter 的Update语句执行时提示“insert into语法错误”解决方法
- JavaScript定义变量是加var和不加var的区别
- SSH免密码登陆
- T-SQL语言中如何在一条语句中既有升序,又有降序?