zoukankan      html  css  js  c++  java
  • Redis学习笔记之位图

    位图定义

    位图并不是一种数据结构,其实就是一种普通的字符串,也可以说是byte数组。基本语法是setbit/getbit,刚才说了是一个byte数组,所以也可以用set/get设置或获取

    SetBit语法: Setbit KEY_NAME OFFSET

    GetBit语法: Getbit KEY_NAME OFFSET

    应用场景

    上面介绍了redis的位图,对于redis位图有什么应用场景?假如要统计用户一年签到次数,这里如果用记录表来记录的话,每个用户就用存365条记录,一千个用户就是365*1000条记录,想一下这个数据量是不少的,而且实际业务意义不是很明显,那么有什么高效的方法可以替换?其实可以用本博客介绍的Redis位图来实现,刚才说了位图就是byte数字,假如签到就表示1,没签到就表示0,这里可以用365个字节来记录前端数,这样很节省资源了,提高了效率。这个例子就是redis位图的很好应用,比如用户签到统计,月活跃用户数统计等等业务场景都适合用位图实现

    基本使用

    Redis位图的基本语法是setbit/getbit,按照一次只存一个字节,还是一次一个数组字符串整个存的情况,分为[零存整取]、[零存零取]、[整存零取],下面介绍的例子来自《Redis深度历险:核心原理与应用实践》一书

    对于字符串'hello',换成ASCII码的二进制为:
    'h':0b1101000'

    'e':0b1100101'

    'l':0b1101100'

    'l':0b1101100'

    'o':'0b1101111'
    [零存整取]的情况:setbit key为tk

    //在第二位存“1”
    127.0.0.1:6379> setbit tk 1 1
    (integer) 0
    //在第三位存"1"
    127.0.0.1:6379> setbit tk 2 1
    (integer) 0
    //在第五位存"1"
    127.0.0.1:6379> setbit tk 4 1
    (integer) 0
    //整个字节数组取出来
    127.0.0.1:6379> get tk
    "h"
    127.0.0.1:6379>
    

    [零存零取]的情况:

    //在第二位加“1”位
    127.0.0.1:6379> setbit tk 1 1
    (integer) 1
    //在第三位加“1”位
    127.0.0.1:6379> setbit tk 2 1
    (integer) 1
    //在第五位加“1”为
    127.0.0.1:6379> setbit tk 4 1
    (integer) 1
    //取出第二位
    127.0.0.1:6379> getbit tk 1
    (integer) 1
    //取出第三位
    127.0.0.1:6379> getbit tk 2
    (integer) 1
    //取出第五位
    127.0.0.1:6379> getbit tk 4
    (integer) 1
    //取出第六位
    127.0.0.1:6379> getbit tk 5
    (integer) 0
    127.0.0.1:6379>
    

    [整存零取]

    //存整个字符
    127.0.0.1:6379> set tk h
    OK
    //获取一下第二位
    127.0.0.1:6379> getbit tk 1
    (integer) 1
    //获取一下第三位
    127.0.0.1:6379> getbit tk 2
    (integer) 1
    //获取一下第五位
    127.0.0.1:6379> getbit tk 4
    (integer) 1
    //获取一下第六位
    127.0.0.1:6379> getbit tk 5
    (integer) 0
    127.0.0.1:6379>
    

    特殊情况:

    127.0.0.1:6379> setbit tk 0 1
    (integer) 1
    127.0.0.1:6379> setbit tk 1 1
    (integer) 1
    //不代表任何字符,返回16进制符号
    127.0.0.1:6379> get tk
    "xc0"
    127.0.0.1:6379>
    

    查找统计

    Redis有提供查询和统计函数,分别是bitpos和bitcount函数,其语法分别为:

    bitcount语法:bitcount key [start end]

    bitpos语法:bitpos key bit [start] [end]

    127.0.0.1:6379> set tk hello
    OK
    //从第1个字符h算起,第一个“1”位的位置
    127.0.0.1:6379> bitpos tk 1 1 1
    (integer) 9
    //从第2个字符2算起,第一个“1”位的位置
    127.0.0.1:6379> bitpos tk 1 2 2
    (integer) 17
    //第一个“0”位
    127.0.0.1:6379> bitpos tk 0
    (integer) 0
    //第一个“1”位
    127.0.0.1:6379> bitpos tk 1
    (integer) 1
    //统计tk“1”的数量
    127.0.0.1:6379> bitcount tk
    (integer) 21
    //第一个字符h的“1”位数量
    127.0.0.1:6379> bitcount tk 0 0
    (integer) 3
    //第一个字符h和第二个字符e“1”位的数量
    127.0.0.1:6379> bitcount tk 0 1
    (integer) 7
    127.0.0.1:6379>
    
  • 相关阅读:
    付费客户端攻防篇
    psql查询结果保存文件
    mysql5.5自定义函数-计算并赋值
    TortoiseSVN 提交时出现错误 Error: Malformed svndiff data in representation
    打开文件共享突然提示:你没有权限访问\。请与网络管理员联系请求访问权限。
    golang 实现笛卡尔积
    爬虫练习3:提取全国省市县信息并统计
    爬虫练习2:爬取省市信息(增加地址信息)
    爬虫练习1:爬取省市信息
    个人使用的效率神器分享【不定期补充】
  • 原文地址:https://www.cnblogs.com/mzq123/p/10461950.html
Copyright © 2011-2022 走看看