位图定义

位图并不是一种数据结构,其实就是一种普通的字符串,也可以说是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. //在第二位存“1”
  2. 127.0.0.1:6379> setbit tk 1 1
  3. (integer) 0
  4. //在第三位存"1"
  5. 127.0.0.1:6379> setbit tk 2 1
  6. (integer) 0
  7. //在第五位存"1"
  8. 127.0.0.1:6379> setbit tk 4 1
  9. (integer) 0
  10. //整个字节数组取出来
  11. 127.0.0.1:6379> get tk
  12. "h"
  13. 127.0.0.1:6379>

[零存零取]的情况:

  1. //在第二位加“1”位
  2. 127.0.0.1:6379> setbit tk 1 1
  3. (integer) 1
  4. //在第三位加“1”位
  5. 127.0.0.1:6379> setbit tk 2 1
  6. (integer) 1
  7. //在第五位加“1”为
  8. 127.0.0.1:6379> setbit tk 4 1
  9. (integer) 1
  10. //取出第二位
  11. 127.0.0.1:6379> getbit tk 1
  12. (integer) 1
  13. //取出第三位
  14. 127.0.0.1:6379> getbit tk 2
  15. (integer) 1
  16. //取出第五位
  17. 127.0.0.1:6379> getbit tk 4
  18. (integer) 1
  19. //取出第六位
  20. 127.0.0.1:6379> getbit tk 5
  21. (integer) 0
  22. 127.0.0.1:6379>

[整存零取]

  1. //存整个字符
  2. 127.0.0.1:6379> set tk h
  3. OK
  4. //获取一下第二位
  5. 127.0.0.1:6379> getbit tk 1
  6. (integer) 1
  7. //获取一下第三位
  8. 127.0.0.1:6379> getbit tk 2
  9. (integer) 1
  10. //获取一下第五位
  11. 127.0.0.1:6379> getbit tk 4
  12. (integer) 1
  13. //获取一下第六位
  14. 127.0.0.1:6379> getbit tk 5
  15. (integer) 0
  16. 127.0.0.1:6379>

特殊情况:

  1. 127.0.0.1:6379> setbit tk 0 1
  2. (integer) 1
  3. 127.0.0.1:6379> setbit tk 1 1
  4. (integer) 1
  5. //不代表任何字符,返回16进制符号
  6. 127.0.0.1:6379> get tk
  7. "\xc0"
  8. 127.0.0.1:6379>

查找统计

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

bitcount语法:bitcount key [start end]

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

  1. 127.0.0.1:6379> set tk hello
  2. OK
  3. //从第1个字符h算起,第一个“1”位的位置
  4. 127.0.0.1:6379> bitpos tk 1 1 1
  5. (integer) 9
  6. //从第2个字符2算起,第一个“1”位的位置
  7. 127.0.0.1:6379> bitpos tk 1 2 2
  8. (integer) 17
  9. //第一个“0”位
  10. 127.0.0.1:6379> bitpos tk 0
  11. (integer) 0
  12. //第一个“1”位
  13. 127.0.0.1:6379> bitpos tk 1
  14. (integer) 1
  15. //统计tk“1”的数量
  16. 127.0.0.1:6379> bitcount tk
  17. (integer) 21
  18. //第一个字符h的“1”位数量
  19. 127.0.0.1:6379> bitcount tk 0 0
  20. (integer) 3
  21. //第一个字符h和第二个字符e“1”位的数量
  22. 127.0.0.1:6379> bitcount tk 0 1
  23. (integer) 7
  24. 127.0.0.1:6379>

Redis学习笔记之位图的更多相关文章

  1. redis 学习笔记(6)-cluster集群搭建

    上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...

  2. Redis学习笔记~目录

    回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...

  3. Redis学习笔记4-Redis配置详解

    在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...

  4. Redis学习笔记7--Redis管道(pipeline)

    redis是一个cs模式的tcp server,使用和http类似的请求响应协议.一个client可以通过一个socket连接发起多个请求命令.每个请求命令发出后client通常会阻塞并等待redis ...

  5. Redis学习笔记一:数据结构与对象

    1. String(SDS) Redis使用自定义的一种字符串结构SDS来作为字符串的表示. 127.0.0.1:6379> set name liushijie OK 在如上操作中,name( ...

  6. Redis学习笔记之ABC

    Redis学习笔记之ABC Redis命令速查 官方帮助文档 中文版本1 中文版本2(反应速度比较慢) 基本操作 字符串操作 set key value get key 哈希 HMSET user:1 ...

  7. (转)redis 学习笔记(1)-编译、启动、停止

    redis 学习笔记(1)-编译.启动.停止   一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先 ...

  8. Redis学习笔记(二)-key相关命令【转载】

    转自 Redis学习笔记(二)-key相关命令 - 点解 - 博客园http://www.cnblogs.com/leny/p/5638764.html Redis支持的各种数据类型包括string, ...

  9. Redis学习笔记(三)Redis支持的5种数据类型的总结

    继续Redis学习笔记(二)来说说剩余的三种数据类型. 三.列表类型(List) 1.介绍 列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的一段片段.列表类型内部是 ...

随机推荐

  1. textarea下高度自适应

    1,背景:textarea的高度不会随内容的增加而自适应,会出现滚动条 解决方案: 1)使用div模拟textarea  使用h5的属性    <div contenteditable=&quo ...

  2. List Leave

    本次作业是建立二叉树并输出叶结点 (1)首先是定义结点,包括左孩子,右孩子 typedef struct { int lch;//左孩子 int rch;//右孩子 }Node; (2)建立二叉树 c ...

  3. java中的Condition协作线程接口类

    在Java的Condition接口中,存在的几个方法跟Synchronized中的wait(),waitall(),wait(time ^),这个几个方法一一对应起来,但是在Lock.newCondi ...

  4. Java程序简介

    ---恢复内容开始--- java程序的基本构成: HelloDate.java package 语句 import 语句 类定义 -class 一个文件只能有一个public 类 (与文件同名) 类 ...

  5. mybatis中怎样使用having?

    1.dao层代码 List<ErgTipSimpleBo> queryListMore(@Param("typeId") Integer typeId,@Param(& ...

  6. 计蒜客 2019 蓝桥杯省赛 B 组模拟赛(三)一笔画

    #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> us ...

  7. FileReader实现图片预览,并上传(js代码)

    var rFilter = /^(image\/bmp|image\/gif|image\/jpeg|image\/png|image\/tiff)$/i; //控制格式 var iMaxFilesi ...

  8. Spring的声明式事务管理<tx:advice/>

    <tx:advice/> 有关的设置 这一节里将描述通过 <tx:advice/> 标签来指定不同的事务性设置.默认的 <tx:advice/> 设置如下: 事务传 ...

  9. OpenGIS

    OpenGIS(Open Geodata Interoperation Specification,OGIS-开放的地理数据互操作规范)由美国OGC(OpenGIS协会,Open Geospatial ...

  10. OPC转发阿里云alink工具

    这个最近还在做 2019-04-24 今天抽空吧基本mqtt上传,OPC遍历,导出物模型功能先做了 上报操作日志,上报错误信息,导入参数,导出参数还没做 有需要可以联系微信NBDX123