1. <output id="5rrzn"></output>

        <dl id="5rrzn"><ins id="5rrzn"><strong id="5rrzn"></strong></ins></dl><dl id="5rrzn"><font id="5rrzn"><nobr id="5rrzn"></nobr></font></dl>
        1. Redis学习笔记之位图

          PHP技术大全 / 2019-03-15 15:06:59


          位图定义

          位图并不是一种数据结构,其实就是一种普通的字符串,也可以说是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个字节来记?#35760;?#31471;数,这样很节省资源了,提高了效?#30465;?#36825;个例子就是redis位图的很好应用,比如用户签到统计,月活跃用户数统计等等业务场景?#38469;?#21512;用位图实现

          基本使用

          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>

          干货分享

          敬请关注“PHP技术大全”微信公众号


          足球外围投注app

              1. <output id="5rrzn"></output>

                <dl id="5rrzn"><ins id="5rrzn"><strong id="5rrzn"></strong></ins></dl><dl id="5rrzn"><font id="5rrzn"><nobr id="5rrzn"></nobr></font></dl>

                      1. <output id="5rrzn"></output>

                        <dl id="5rrzn"><ins id="5rrzn"><strong id="5rrzn"></strong></ins></dl><dl id="5rrzn"><font id="5rrzn"><nobr id="5rrzn"></nobr></font></dl>
                        1. 新浪彩票擂台 足彩胜负彩怎么玩 重庆欢乐生肖开奖结果 精准免费平特肖 上海时时乐下载 3d试机号金码关注对应千禧 内蒙古快三今天推荐什么豹子 福利彩票七乐彩走势图带坐标 时时彩娱乐平台导航 中国竞彩网受住赛程 3d107期预测号码 北京pk10走势图 辽宁11选5遗漏数据 世界杯法甲转会 25选7中奖规则