Redis学习笔记之位图

作者: smileNicky | 来源:发表于2019-03-02 23:40 被阅读5次

[TOC]

位图定义

位图并不是一种数据结构,其实就是一种普通的字符串,也可以说是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>

相关文章

  • Redis学习笔记之位图

    [TOC] 位图定义 位图并不是一种数据结构,其实就是一种普通的字符串,也可以说是byte数组。基本语法是setb...

  • 【Redis】Redis学习笔记(五)jedis(JedisCl

    redis系列文章目录 redis学习笔记(一)redis3.2.5集群安装与测试 redis学习笔记(二)Jed...

  • redis位图

    在我们平时开发过程中,会有一些 bool 型数据需要存取,比如用户一年的签到记录,签了是 1,没签是 0,要记录 ...

  • Redis学习笔记:事务

    Redis学习笔记:事务 原文链接:Redis学习笔记:事务 一、事务的描述 和MySQL一样,Redis中也有事...

  • Redis 参数

    Redis Redis 学习笔记 II 常见参数配置

  • Redis应用-布隆过滤器

    系列文章Redis应用-分布式锁Redis应用-异步消息队列与延时队列Redis应用-位图Redis应用-Hype...

  • Redis应用-Geo

    系列文章Redis应用-分布式锁Redis应用-异步消息队列与延时队列Redis应用-位图Redis应用-Hype...

  • Python ☞ day 13

    Python学习笔记之 MongoDB数据库 & Redis数据库 系统说明:windows 一、操作MongoD...

  • 2018-11-12

    Redis学习笔记 Redis在在线测试 Redis官网 REmote DIctionary Server(Red...

  • Redis系列之进阶篇(上)

    Redis系列之进阶篇(上) 前言 这篇文章主要内容是: 分布式锁 延时队列 位图 HyperLogLog本文所学...

网友评论

    本文标题:Redis学习笔记之位图

    本文链接:https://www.haomeiwen.com/subject/bpeuuqtx.html