本篇介绍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的更多相关文章

  1. Redis系列(三):Redis的持久化机制(RDB、AOF)

    本篇博客是Redis系列的第3篇,主要讲解下Redis的2种持久化机制:RDB和AOF. 本系列的前2篇可以点击以下链接查看: Redis系列(一):Redis简介及环境安装. Redis系列(二): ...

  2. Redis系列三之持久化

    一.Redis持久化 Redis是一个支持持久化的内存数据库,redis需要经常将内存中的数据同步到磁盘来保证持久化. redis提供了不同级别的持久化方法: Snapshotting(快照,默认方式 ...

  3. Redis系列(三)-Redis发布订阅及客户端编程

    阅读目录 发布订阅模型 Redis中的发布订阅 客户端编程示例 0.3版本Hredis 发布订阅模型 在应用级其作用是为了减少依赖关系,通常也叫观察者模式.主要是把耦合点单独抽离出来作为第三方,隔离易 ...

  4. Redis系列三(redis配置文件分析)

    在第一篇文章中有提到过redis.conf这个文件,这个文件就是redis-server的具体配置了.要使用好redis,一定要搞清楚redis的配置文件,这样才能最大的发挥redis的性能. # B ...

  5. Redis系列三:reids常用命令

    全局命令 keys *  查看所有键 dbsize 查看的是当前所在redis数据库的键总数 如果存在大量键,线上禁止使用此指令 exists key 检查键是否存在,存在返回1,不存在返回0 del ...

  6. Redis系列三 Redis数据类型

    一 .Redis的五大数据类型 1.String(字符串) string是redis最基本的数据类型,可以理解成与 Memached一模一样的数据类型,一个key对应一个value. string 类 ...

  7. Redis系列(三)--消息队列、排行榜等

    Redis命令执行生命周期: 发送命令--->排队(单线程)--->执行命令--->返回结果 慢查询: 只是针对命令执行阶段 慢查询日志通过一个固定长度的FIFO queue,这个q ...

  8. Redis系列三 - 缓存雪崩、击穿、穿透

    前言 从学校出来,做开发工作也有一定时间了,最近有想系统地进一步深入学习,但发现基础知识不够扎实,故此来回顾基础知识,进一步巩固.加深印象. 最初开始接触编程时,总是自己跌跌撞撞.不断摸索地去学习,再 ...

  9. Redis系列(四):Redis的复制机制(主从复制)

    本篇博客是Redis系列的第4篇,主要讲解下Redis的主从复制机制. 本系列的前3篇可以点击以下链接查看: Redis系列(一):Redis简介及环境安装 Redis系列(二):Redis的5种数据 ...

  10. Redis系列(五):Redis的过期键删除策略

    本篇博客是Redis系列的第5篇,主要讲解下Redis的过期键删除策略. 本系列的前4篇可以点击以下链接查看: Redis系列(一):Redis简介及环境安装 Redis系列(二):Redis的5种数 ...

随机推荐

  1. DVWA之File Upload (文件上传漏洞)

    目录 Low: Medium: 方法一:抓包修改文件的type 方法二:00截断 High: Impossible : Low: 源代码: <?php if( isset( $_POST[ 'U ...

  2. Linux中的shell和bash

    目录 shell shell script sh bash Dash tty .pty 和 pts 学安全的我们,经常会听到说获得某服务器的shell,就是指获得某个服务器的操作权限.我们学习linu ...

  3. HellowWorld详解

    1.随便新建一个文件夹,存放代码 2.在文件夹中新建一个Java文件 新建一个.txt文本文档-->将扩展名.txt修改为.java 注:如果创建的文本文档没有显示扩展名,则有如下方法: 方法一 ...

  4. 【Mybatis源码解析】- 整体架构及原理

    整体架构 version-3.5.5 在深入了解Mybatis的源码之前,我们先了解一下Mybatis的整体架构和工作原理,这样有助于我们在阅读源码过程中了解思路和流程. 核心流程 在上一遍的入门程序 ...

  5. Pytorch_Part5_迭代训练

    VisualPytorch beta发布了! 功能概述:通过可视化拖拽网络层方式搭建模型,可选择不同数据集.损失函数.优化器生成可运行pytorch代码 扩展功能:1. 模型搭建支持模块的嵌套:2. ...

  6. 【BUAA软工】Alpha阶段测试报告

    vLab-online项目Alpha阶段测试报告 项目 内容 班级:北航2020春软件工程 博客园班级博客 作业:Alpha阶段测试报告 测试报告 测试发现的bug 在测试过程中发现了多少Bug? 我 ...

  7. [刷题] 200 Number of Islands

    要求 给定一个二维数组,只有0和1两个字符,1代表陆地,0代表水域,纵向和横向的陆地连接成岛屿,被水域隔开,求出地图中有多少岛屿 思路 对要查找的区域进行双重循环遍历,寻找陆地 从陆地初始点开始进行深 ...

  8. split命令_Linux split命令:切割(拆分)文件

    <Linux就该这么学>是一本基于最新Linux系统编写的入门必读书籍,内容面向零基础读者,由浅入深渐进式教学,销量保持国内第一,年销售量预期超过10万本.点此免费在线阅读. 15 分钟之 ...

  9. AJAX 原理与使用

    AJAX 是什么 AJAX ( Asynchronous JavaScript and XML,异步 JavaScript 和 XML,中文读音:"阿贾克斯 ") 是一种 Web ...

  10. OSI 七层参考模型与 TCP/IP 四层协议

    OSI 七层参考模型 OSI (Open System Interconnect,开放系统互连参考模型)是由 ISO(国际标准化组织)定义的,它是个灵活的.稳健的和可互操作的模型,并不是协议,常用来分 ...