1.SETBIT key offset value

  对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。

  在redis中,存储的字符串都是以二级制的进行存在的。

举例:
  设置一个 key-value ,键的名字叫“andy” 值为字符'a'

  我们知道 'a' 的ASCII码是 97。转换为二进制是:01100001。offset的学名叫做“偏移” 。二进制中的每一位就是offset值啦,比如在这里 offset 0 等于 ‘0’ ,offset 1等于'1' ,offset2等于'1',offset 6 等于'1' ,没错,offset是从左往右计数的,也就是从高位往低位。

  我们通过SETBIT 命令将 andy中的 'a' 变成 'b' 应该怎么变呢?

  也就是将 01100001 变成 01100010 (b的ASCII码是98),这个很简单啦,也就是将'a'中的offset 6从0变成1,将offset 7 从1变成0 。

果然,就从'a' 变成 'b'了。 

这就是redis 中 “SETBIT” 的基本用法。

2. BITCOUNT 就是统计字符串的二级制码中,有多少个'1'。

所以在这里,BITCOUNT andy 得到的结果就是 3 啦。

3.1 BITCOUNT key [start end] 

 从左向右从0开始,从右向左从-1开始,注意start和end是字节
 BITCOUNT testkey 0 0 表示从索引0个字节到索引0个字节,就是第一个字节的统计
 BITCOUNT testkey 0 -1 等同于BITCOUNT testkey 
 最常用的就是BITCOUNT testkey

3.2 实战

3.3 实例解析 

3. Getbit 命令用于对 key 所储存的字符串值,获取指定偏移量上的位(bit)。

 4、BITOP

4.1对一个或多个保存二进制位的字符串key进行位元操作,并将结果保存到destkey上。

operation可以是AND、OR、NOT、XOR这四种操作中的任意一种。
  BITOP AND destkey key [key ...]  ,对一个或多个key求逻辑并,并将结果保存到destkey
  BITOP OR destkey key [key ...] ,对一个或多个key求逻辑或,并将结果保存到destkey
  BITOP XOR destkey key [key ...] ,对一个或多个key求逻辑异或,并将结果保存到destkey
  BITOP NOT destkey key ,对给定key求逻辑非,并将结果保存到destkey
除了NOT操作外,其他操作都可以接受一个或多个key作为输入
当BITOP处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看做0
空的key也被看作是包含0的字符串序列

4.2 实战

bitset的使用场景

 假设这样一个场景,假如每个网站有1亿的用户,那么我们怎么来统计这个网站的日登陆数或者说有哪些用户登录过这个网站。

 最常见的做法就是设计一张用户登录表:

  user_login:

  user_uid    login_date

  0                   2017-7-1

  1                   2017-7-1

  0                   2017-7-2

 如果平均一个人一天登录1次,那么1亿个用户一个星期就会产生1 * 1 * 7 = 7亿条数据,一个月就会产生30亿条数据,这对数据库的压力是很大的,只是统计一下用户登录,没必要花费这么多的资源。

 这个时候我们就可以用reids 的bitmap来解决。

 用户是否登录可以用0/1来表示,0代表用户不登陆,1表示登录,那么1bit 就可以表示用户是否登录。

 1亿个用户一天的数据量也就 1 0000 0000bit  = 11.92m,也就是说用户一天的登录信息也就产生11.92m的数据量。一个月也就357.63m的数据量。

 具体实现过程(为了实验方便,我们就假设4个用户0,1,2,3,统计两天的登录量):

  mon: 1010 (用户0未登录,用户1登录,用户2未登录,用户3登录)

  tue:    1101 (用户0登录,用户1未登录,用户2登录,用户3登录)

如果要统计这两天都登陆的用户:

可以看到mon 和 tue做and运算,得到结果result 为 :1000,则表示用户3连续两天都登陆,其他用户两天中只有一天登录。

最新文章

  1. Warning: mysql_connect(): No such file or directory 解决方案总结(操作系统: Mac)
  2. Myeclipse添加外部Tomcat出现启动故障的问题解决
  3. 使用jquery的imagecropper插件做用户头像上传 兼容移动端
  4. CSS重置样式表
  5. Linux下svn命令详解
  6. 【转载】Oracle的方案(Schema)和用户(User)的区别
  7. [转] C++ Redistributable Package版本详解
  8. Android 里面的小坑
  9. C# 之 托付
  10. ImageView及其子类(二)
  11. bzoj4974 字符串大师
  12. Rails + React +antd + Redux环境搭建
  13. 远程连接服务器或云数据库上的mysql服务 - 赖大大
  14. learning svn change commit log
  15. Postgres数据库获取所有的索引信息的SQL
  16. 04 Spring的@Autowired注解、@Resource注解、@Service注解
  17. 【原创】express3.4.8源码解析之Express结构图
  18. 《快学 Go 语言》第 16 课 —— 包管理 GOPATH 和 Vendor
  19. C#串口介绍以及简单串口通信程序设计实现
  20. erlang的一些系统限制修改

热门文章

  1. ACM之路(14)—— 线段树的日常(上)
  2. deep sort
  3. 2018-2019-2 20175226王鹏雲 实验四《Android程序设计》实验报告
  4. Linux设备驱动程序 之 主次设备号
  5. vue中解决three.js出现内存泄漏丢失上下文问题
  6. JS基础_数组简介
  7. R语言:各类型数据文件的导入
  8. token的解码及 判断值不为空的方法
  9. 一个简易的PHP读取CSV文件的方法
  10. MySQL使用空事务解决slave从库errant问题