Redis系列(三):Bitmaps和HyperLogLog
本篇介绍Bitmaps和HyperLogLog。
一、Bitmaps
计算机中最小的单位是bit(位),很多计算机语言也提供了位操作符,比如Java中就有&、|、>>、>>>、<<、~、^ 。1bit可以存储0和1两种值。介绍几个Redis的Bitmaps相关的操作
- bitop
完整的命令参数是bitop operation destkey key [key...]
其中operation是位操作类型,支持and、or、not、xor,分别就是与、或、非、异或。destkey是用来存储计算结果的变量,key是参与运算是变量,可以指定多个。
127.0.0.1:6379> set bitkey1 "\x8e"
OK
127.0.0.1:6379> set bitkey2 "\xa5"
OK
127.0.0.1:6379> bitop and bitkey3 bitkey1 bitkey2
(integer) 1
127.0.0.1:6379> get bitkey3
"\x84"
127.0.0.1:6379> bitop or bitkey4 bitkey1 bitkey2
(integer) 1
127.0.0.1:6379> get bitkey4
"\xaf"
127.0.0.1:6379> bitop not bitkey5 bitkey1
(integer) 1
127.0.0.1:6379> get bitkey5
"q"
127.0.0.1:6379> bitop xor bitkey6 bitkey1 bitkey2
(integer) 1
127.0.0.1:6379> get bitkey6
"+"
先设置bitkey1和bitkey2的值,用16进制(\x开头)设置,这时bitkey1的二进制就是10001110,bitkey2的二进制就是10100101,然后把bitkey1和bitkey2做按位与运算,把结果存到bitkey3,经过计算得10001110&10100101=10000100,刚好是16进制的"\x84",其它运算也一样,但是需要注意的是,用get命令获取key的值时,会按照字节做显示,如果刚好是ascii码表上的字符,会直接显示ascii码,比如bitkey5和bitkey6。
- bitcount
完整命令参数是bitcount key [start end]
统计key中1的数量,可以指定下标范围,如果不指定就统计整个key。下标的范围指的是字符串下标,范围是包含start 和包含end的,也就是start <= index <= end。
127.0.0.1:6379> set bitkey "abc"
OK
127.0.0.1:6379> get bitkey
"abc"
127.0.0.1:6379> bitcount bitkey
(integer) 10
127.0.0.1:6379> bitcount bitkey 0 0
(integer) 3
127.0.0.1:6379> bitcount bitkey 0 1
(integer) 6
abc的ascii码对应的十进制整数分别是97、98、99,二进制分别是0110 0001、0110 0010、0110 0011,所以bitcount bitkey得到的结果是10,bitcount bitkey 0 0计算是字母a的二进制1的个数,bitcount bitkey 0 1计算的是a和b的二进制1的个数。
- getbit
完整命令参数是getbit offset
获取第offset位的值,最左边的是第0位。
127.0.0.1:6379> set bk "\xa3"
OK
127.0.0.1:6379> getbit bk 0
(integer) 1
127.0.0.1:6379> getbit bk 1
(integer) 0
16进制的a3的二进制是10100011,那么第0位就是1,第1位就是0。
- setbit
完整命令参数是setbit key offset value
其中key是键,offset是偏移量,与getbit命令的offset意义相同,value只能是1或者0。
127.0.0.1:6379> setbit bk 3 1
(integer) 0
127.0.0.1:6379> get bk
"\xb3"
这里把bk的值的第3位(从0开始计算)设置为1,原来是10100011,修改后 变成了10110011,也就是16进制的b3。
由于Bitmaps是用位来存储信息的,所以它很适合用在那种存储只有两种状态的数据的场景,用位偏移量来隐式存储整形数据,位置存储状态。例如用来存储用户的签到情况,文章已读或未读情况。比如要存储用户的签到状态,可以用第offset位的位值表示用户的签到,1为已签到,0为未签到。具体做法可以参考用Redis实现签到功能。
二、HyperLogLog
HyperLogLog其实是一种算法,它是用来估算一个集合的基数的。先说明一下,这里说的集合和数学上的集合不同,这里的集合指的是若干个元素合在一起,是不具有互异性的,也就是其中的元素是可以重复的,而HyperLogLog算法正是用来计算去重之后的元素个数,就是基础。举个例子,{1, 2, 3}的基数是3,{1, 2, 3, 2, 1}的基数还是3,因为1和2已经重复了,不需要再计算。这个算法是有误差的,它只能用在计算一些对精度要求不高的场景下,比如统计页面访问的UV数,统计网站的ip数。
下面是Redis提供的HyperLogLog的相关命令:
- pfadd
完整命令参数是pfadd key element [element ...]
将element添加到键为key的HyperLogLog结构中,这个命令可以一次添加多个element。
127.0.0.1:6379> pfadd pf one two three two one
(integer) 1
- pfcount
完整命令参数是pfcount key [key ...]
返回key的近似基数,如果指定了多个key,返回这些key的并集的近似基数。
127.0.0.1:6379> pfcount pf
(integer) 3
127.0.0.1:6379> pfadd pf2 three four five
(integer) 1
127.0.0.1:6379> pfcount pf pf2
(integer) 5
pf只有one、two、three 3个元素,pf2,只有three、four、five 3个元素,取并集之后是5个。
- pfmerge
完整命令参数是pfmerge destkey sourcekey [sourcekey ...]
把若干个sourcekey合并并存储到destkey,如果destkey不存在,会创建一个。
127.0.0.1:6379> pfmerge destkey pf pf2
OK
127.0.0.1:6379> pfcount destkey
(integer) 5
Redis系列(三):Bitmaps和HyperLogLog的更多相关文章
- Redis系列(三):Redis的持久化机制(RDB、AOF)
本篇博客是Redis系列的第3篇,主要讲解下Redis的2种持久化机制:RDB和AOF. 本系列的前2篇可以点击以下链接查看: Redis系列(一):Redis简介及环境安装. Redis系列(二): ...
- Redis系列三之持久化
一.Redis持久化 Redis是一个支持持久化的内存数据库,redis需要经常将内存中的数据同步到磁盘来保证持久化. redis提供了不同级别的持久化方法: Snapshotting(快照,默认方式 ...
- Redis系列(三)-Redis发布订阅及客户端编程
阅读目录 发布订阅模型 Redis中的发布订阅 客户端编程示例 0.3版本Hredis 发布订阅模型 在应用级其作用是为了减少依赖关系,通常也叫观察者模式.主要是把耦合点单独抽离出来作为第三方,隔离易 ...
- Redis系列三(redis配置文件分析)
在第一篇文章中有提到过redis.conf这个文件,这个文件就是redis-server的具体配置了.要使用好redis,一定要搞清楚redis的配置文件,这样才能最大的发挥redis的性能. # B ...
- Redis系列三:reids常用命令
全局命令 keys * 查看所有键 dbsize 查看的是当前所在redis数据库的键总数 如果存在大量键,线上禁止使用此指令 exists key 检查键是否存在,存在返回1,不存在返回0 del ...
- Redis系列三 Redis数据类型
一 .Redis的五大数据类型 1.String(字符串) string是redis最基本的数据类型,可以理解成与 Memached一模一样的数据类型,一个key对应一个value. string 类 ...
- Redis系列(三)--消息队列、排行榜等
Redis命令执行生命周期: 发送命令--->排队(单线程)--->执行命令--->返回结果 慢查询: 只是针对命令执行阶段 慢查询日志通过一个固定长度的FIFO queue,这个q ...
- Redis系列三 - 缓存雪崩、击穿、穿透
前言 从学校出来,做开发工作也有一定时间了,最近有想系统地进一步深入学习,但发现基础知识不够扎实,故此来回顾基础知识,进一步巩固.加深印象. 最初开始接触编程时,总是自己跌跌撞撞.不断摸索地去学习,再 ...
- Redis系列(四):Redis的复制机制(主从复制)
本篇博客是Redis系列的第4篇,主要讲解下Redis的主从复制机制. 本系列的前3篇可以点击以下链接查看: Redis系列(一):Redis简介及环境安装 Redis系列(二):Redis的5种数据 ...
- Redis系列(五):Redis的过期键删除策略
本篇博客是Redis系列的第5篇,主要讲解下Redis的过期键删除策略. 本系列的前4篇可以点击以下链接查看: Redis系列(一):Redis简介及环境安装 Redis系列(二):Redis的5种数 ...
随机推荐
- Linux中的SSH服务
目录 SSH 使用scp在两台Linux间传数据: 基于SSH做远程访问,可以使用ftp服务的相关指令sftp root@192.168.10.10 Openssh公私钥验证: SSH SSH(Sec ...
- Python中的BeautifulSoup模块
目录 BeautifulSoup Tag NavigableString BeautifulSoup Comment 遍历文档树 直接子节点 所有子孙节点 节点内容 搜索标签 CSS选择器 Bea ...
- C#-WiFi共享
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- sharding JDBC 不支持批量导入解决方法
package com.ydmes.service.impl.log; import com.ydmes.domain.entity.log.BarTraceBackLog;import org.sp ...
- C# 变体(variance)
上节讲到了泛型,这节延申一下,讲一下变体. 变体(variance)是协变(convariance)和抗变(也说逆变contravariance)的统称.这个概念在.net 4中引入,在.net 2. ...
- Codeforces Round #713 (Div. 3)AB题
Codeforces Round #713 (Div. 3) Editorial 记录一下自己写的前二题本人比较菜 A. Spy Detected! You are given an array a ...
- [Django框架之视图层]
[Django框架之视图层] 视图层 Django视图层, 视图就是Django项目下的views.py文件,它的内部是一系列的函数或者是类,用来专门处理客户端访问请求后处理请求并且返回相应的数据,相 ...
- 使用小记:Zookeeper中动态改变节点的功能
Zookeeper 3.5+提供了reconfig功能实现动态配置节点,官方的说明是,"你再也不需要进行全部节点重启"就可以应用所有的修改: http://zookeeper.ap ...
- str.isdigit()可以判断变量是否为数字
字符串.isdigit()可以判断变量是否为数字 是则输出True 不是则输出False 好像只能字符串
- [Qt] 基本概念
QObject :所有 Qt 类的基类 QWidget类:包含所有组件的类 Widgets:组件,组成Qt界面的基本元素 window:界面,是不含有父组件的组件 Child Widgets:子组件, ...