redis 命令 setbit、bitcount、getbit、bitop
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的更多相关文章
- redis中setbit bitcount命令详解
bitmap,位图,即是使用bit. redis字符串是一个字节序列. 1 Byte = 8 bit SETBIT key offset value 设置或者清空key的value(字符串)在offs ...
- 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 ...
- redis的setbit命令
redis的setbit这个bit怎么理解,配合bitcount使用? 这个是SETBIT使用方法的简单说明<img src="https://pic4.zhimg.com/8 ...
- Redis命令之setbit
setbit的作用是,对key上存储的字符串,设置或清除指定偏移量上的位(bit). 语法如下: SETBIT key offset value key是要操作的对象的键. offset是操作对象上的 ...
- Redis命令大全&中文解释&在线测试命令工具&在线中文文档
在线测试命令地址:http://try.redis.io/ 官方文档:http://redis.io/commands http://redis.io/documentation Redis 命令参考 ...
- Redis命令参考(Keys & String)
r = redis.Redis(ip, port, index) 如此实例化一个redis对象,index取值0-15,一个redis对象有16个库. Keys 函数 功能 返回值 备注 keys(s ...
- redis命令参考和redis文档中文翻译版
找到了一份redis的中文翻译文档,觉得适合学习和查阅.这份文档翻译的真的很良心啊,他是<Redis 设计与实现>一书的作者黄健宏翻译的. 地址:http://redisdoc.com/i ...
- 【转帖】 redis 命令 From https://www.cnblogs.com/zhouweidong/p/7550717.html
redis命令详解 redis中添加key value元素:set key value; 获取元素:get key ; redis中添加集合:lpush key value1 va ...
- Windows操作Redis及Redis命令
Windows操作Redis及Redis命令 一.Windows下操作Redis 设置密码 打开redis服务 Windows 下的redis命令行 二.redis常用命令大全 key String ...
随机推荐
- lyc——2019.10.31
10:判决素数个数 总时间限制: 1000ms 内存限制: 65536kB 描述 输入两个整数X和Y,输出两者之间的素数个数(包括X和Y). 输入 两个整数X和Y(1 <= X,Y <= ...
- linux 部署jar
Linux 运行jar包命令如下: 方式一: java -jar xxx.jar 这种方式特点是ssh窗口关闭时,程序中止运行.或者是运行时没法切出去执行其他任务,有没有办法让Jar在后台运行呢: 方 ...
- 13.调整数组顺序使奇数位于偶数前面 Java
思路 两次遍历,第一次把奇数加到list中,第二次把偶数加到list中,时间复杂度为O(n). 利用类似于插入排序的方法,但时间复杂度为O(n^2). 代码 import java.util.Arra ...
- Linux孤儿进程与僵尸进程
1. 基本概念: 孤儿进程:父进程退出,但是其子进程仍然在运行,那么这些子进程被称为孤儿进程:孤儿进程会被init进程收养,并作善后处理: 僵尸进程:一个已经终止,但是其父进程尚未对齐进行善后处理的进 ...
- 黑马vue---18、v-for指令的四种使用方式
黑马vue---18.v-for指令的四种使用方式 一.总结 一句话总结: (item, i) in list:什么in什么的形式,前面是各种参数 1.v-for循环普通数组? <p v-for ...
- Android性能优化-电量优化
前言 电量优化,这个名词在传统PC时代,我们基本很少听见.然而到了诺基亚时代,我们也同样很少关注.直到了移动互联的智能机时代.电量优化才被慢慢的重视起来.可能的原因如下: 移动设备,不能一直使用电源供 ...
- 【Taro全实践】修改radio组件的大小
需求是将radio选中后颜色改为橙色.大小改成合适大小. 1.改颜色 <Radio color='#FF7464'></Radio> 2.改大小 <Radio style ...
- TP5连接数据库和phpstrom连接数据库(宝塔面板数据库连接)
1.编译器:phpstrom 框架:TP5 服务器面板:宝塔面板 2.我遇到的核心问题:数据库.用户名.密码均正确但是无法连接, 使用宝塔面板的都知道phpmyadmin的端口号是888,注意注意这个 ...
- manifest节点
xmlns:android属性——定义命名空间 这个属性定义了这个XML文件所使用的命名空间.如果需要指定特殊的命名空间,就需要手动编写代码,在Android Studio基本格式如下: xmlns: ...
- 新导入的项目目录结构不对(main目录)
Eclipse导入一个maven项目,碰到一个这样的错误:项目的包路径编程了main.java开头的,而java代码中的pakge却是com开头的,如图. 导致项目编译不通过 错误提示: 解决办法: ...