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连续两天都登陆,其他用户两天中只有一天登录。

redis 命令 setbit、bitcount、getbit、bitop的更多相关文章

  1. redis中setbit bitcount命令详解

    bitmap,位图,即是使用bit. redis字符串是一个字节序列. 1 Byte = 8 bit SETBIT key offset value 设置或者清空key的value(字符串)在offs ...

  2. Redis 命令 - Strings

    APPEND key value Available since 2.0.0, Time complexity: O(1). Append a value to a key 127.0.0.1:637 ...

  3. redis的setbit命令

    redis的setbit这个bit怎么理解,配合bitcount使用? 这个是SETBIT使用方法的简单说明<img src="https://pic4.zhimg.com/8 ...

  4. Redis命令之setbit

    setbit的作用是,对key上存储的字符串,设置或清除指定偏移量上的位(bit). 语法如下: SETBIT key offset value key是要操作的对象的键. offset是操作对象上的 ...

  5. Redis命令大全&中文解释&在线测试命令工具&在线中文文档

    在线测试命令地址:http://try.redis.io/ 官方文档:http://redis.io/commands http://redis.io/documentation Redis 命令参考 ...

  6. Redis命令参考(Keys & String)

    r = redis.Redis(ip, port, index) 如此实例化一个redis对象,index取值0-15,一个redis对象有16个库. Keys 函数 功能 返回值 备注 keys(s ...

  7. redis命令参考和redis文档中文翻译版

    找到了一份redis的中文翻译文档,觉得适合学习和查阅.这份文档翻译的真的很良心啊,他是<Redis 设计与实现>一书的作者黄健宏翻译的. 地址:http://redisdoc.com/i ...

  8. 【转帖】 redis 命令 From https://www.cnblogs.com/zhouweidong/p/7550717.html

    redis命令详解   redis中添加key value元素:set key value;       获取元素:get key ;   redis中添加集合:lpush key value1 va ...

  9. Windows操作Redis及Redis命令

    Windows操作Redis及Redis命令 一.Windows下操作Redis 设置密码 打开redis服务 Windows 下的redis命令行 二.redis常用命令大全 key String ...

随机推荐

  1. BZOJ 2402 陶陶的难题II (树链剖分、线段树、凸包、分数规划)

    毒瘤,毒瘤,毒瘤-- \(30000\)这个数据范围,看上去就是要搞事的啊... 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2402 ...

  2. PHP 电子围栏算法-不依赖任何第三方接口

    <?php /** * @name 围栏算法,判断一个坐标,是否在围栏里面.如:['113.664673,34.810146','113.681667,34.796896','113.69231 ...

  3. 20.包含min函数的栈 Java

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 思路 借助辅助栈实现: 压栈时:若辅助栈为空,则将节点压入辅助栈.否则,当当前节点小于 ...

  4. CISCO实验记录五:静态路由与RIP动态路由

    一.实验要求 1.创建设备间静态路由 2.检查三层连通性 3.清空路由,使用RIP创建动态路由 4.检查路由表 二.实验操作 1.创建设备静态路由 #iip route 192.168.1.0 255 ...

  5. pwn学习日记Day5 基础知识积累

    知识杂项 int mprotect(const void *start, size_t len, int prot); mprotect()函数把自start开始的.长度为len的内存区的保护属性修改 ...

  6. HTTP之简析

    1. 简介 HTTP 协议是 Hyper Text Transfer Protocol(超文本传传输协议)的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议.HTTP 通常架构在 TCP 传 ...

  7. springboot多个数据源

    1.启动两个mysql,可以按照如下操作使用docker来部署mysql容器,比较简单 https://www.cnblogs.com/qq931399960/p/11527222.html 2.如果 ...

  8. P2602 [ZJOI2010]数字计数&P1239 计数器&P4999 烦人的数学作业

    P2602 [ZJOI2010]数字计数 题解 DFS 恶心的数位DP 对于这道题,我们可以一个数字一个数字的求 也就是分别统计区间 [ L , R ] 内部数字 i 出现的次数 (0<=i&l ...

  9. P4124 [CQOI2016]手机号码

    P4124 [CQOI2016]手机号码 题解 数位DP   DFS  虽然套路,但还是恶心到找不到锅在哪里 注意这个 然后你就发现其实这样就不用记录前导0了 锅在这个鬼地方QAQ 代码 #inclu ...

  10. Rancher-k8s加速安装文档

    Kubernetes是一个强大的容器编排工具,帮助用户在可伸缩性系统上可靠部署和运行容器化应用.Rancher容器管理平台原生支持K8s,使用户可以简单轻松地部署K8s集群. 很多同学正常部署k8s环 ...