zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    idea输出目录详解
    svn的使用教程
    java常用技术名词解析
    1.0 idea使用教程(配置)一
    fastDFS的搭建
    log4j的配置
    关于elementUI中上传组件点击上传时页面卡死的问题
    Nginx的反向代理
    给所有实体类重写tostring方法
    Nginx的配置
  • 原文地址:https://www.cnblogs.com/spareyaya/p/12822170.html
Copyright © 2011-2022 走看看