在学习redis的过程了,看到了redis还能用于大数据处理,具体场景如下:
腾讯10亿用户,要几个毫秒内查询到某个用户是否在线,你能怎么做?千万别说给每个用户建立一个key,然后挨个记(你可以算一下需要的内存会很恐怖,而且这种类似的需求很多,腾讯光这个得多花多少钱。。)
原理是:
redis内构建一个足够长的数组,每个数组元素只能是0和1两个值,然后这个数组的下标index用来表示我们上面例子里面的用户id(必须是数字哈),那么很显然,这个几亿长的大数组就能通过下标和元素值(0和1)来构建一个记忆系统,就能实现上述场景。用到的命令是:setbit、getbit、bitcount

先来说说setbit、getbit、bitcount这三个指令的用法:
在学习这几个命令之前,我们得先了解下redis中字符串的存储方式,redis中的字符串都是以二进制的方式进行存储的,比如说我执行如下命令:

我们知道 'a' 的ASCII码是 97。转换为二进制是:01100001。我们BIT相关命令都是对这个二进制数据进行操作

GETBIT
GETBIT命令可以返回key对应的value在offset(偏移)处的bit值,以上文提到的kk为例,a对应的二进制数据是01100001,所以当offset为0时,对应的bit值为0;offset为1时,对应的bit值为1;offset为2时,对应的bit值为1;offset为3时,对应的bit值为0,依此类推….,如下:

通过上述结果,可以看到offset从0到7,就是01100001,也就是说offset是从左往右计数的,也就是从高位往低位。当超过位数时,结果是0

BITCOUNT
BITCOUNT可以用来统计这个二进制数据中1的个数,如下:

官网上有一个非常有意思的案例:用户上线次数统计。节选部分原文如下:

SETBIT
我们通过SETBIT 命令将 andy中的 'a' 变成 'b' 应该怎么变呢?
也就是将 01100001 变成 01100010 (b的ASCII码是98),这个很简单啦,也就是将'a'中的offset 6从0变成1,将offset 7 从1变成0。如下图:

大家可能也发现了,每次SETBIT完毕之后,有一个(integer) 0或者(integer)1的返回值,这个是在你进行SETBIT 之前,该offset位的比特值。

另外使用 BITPOS 指令可以用来获取二进制位串中第一个1或者0的位置,如下:

参考博客:https://zhuanlan.zhihu.com/p/51170402

最新文章

  1. 用block做事件回调来简化代码,提高开发效率
  2. WinDbg 蓝屏dump分析教程
  3. meta标签和作用
  4. 寻找Fragment的替代品的尝试
  5. arcgis破解的时候,不能启动license manager的问题
  6. Fedora install chrome
  7. Python Beautiful Soup模块的安装
  8. SQL Server blocking session
  9. Python之路Day9
  10. InputMonitor注意事项
  11. JAVA IO流结构图
  12. python3 第十九章 - 写一个10进制转任意进制的函数
  13. (最完美)小米平板3的USB调试模式在哪里开启的流程
  14. [android]adb 模拟双击 快速点击屏幕
  15. peewee 事物 回滚
  16. AssemblyVersion和AssemblyFileVersion的区别
  17. mysql5.7 误删管理员root账户
  18. 在windows中使用Navicat连接Linux虚拟机中的mysql数据库
  19. sublime Text3 === 无法输入input的问题解决办法
  20. The lesser known pitfalls of allowing file uploads on your website

热门文章

  1. CL_GUI_FRONTEND_SERVICES 使用问题
  2. python数据存储-- CSV
  3. 【VS开发】CTime和CTimeSpan使用
  4. nginx文件路径配置(root|alias)
  5. superset连接sqlite频繁断开
  6. Linux学习笔记(15)Linux字符集(locale,LANG,LC_ALL)
  7. SqlServer中union 和 union all的区别
  8. Idea中新建maven项目的目录结构
  9. powerdesiner概念模型转物理模型以及失败的解决方法
  10. 最短meeting路线(树的直径)--牛客第四场(meeting)