Redis学习笔记之位图

[TOC]

位图定义

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

SetBit数组去重语法: Setbit其它民族有什么传统节日 KEY_NAME OFFSET

GetBit语法: Getbit KEY_NAME OF数据库系统概论第五版课后答案FSET

应用场景

上面介绍了redis的位图,对于数组排序redis位图有什么应用场景?假如要统计用户一年签到次数,这里如果用记录表redis面试题来记录的话,每个用户就数据库设计用存365条记录,一千个用户就是365*1位图放大后会失真吗000条记录,想一下这个数据量是不少的,而且实际业务意义不是很明显,那么有什么高效的方法可以替换?其实可以用本博客数据库软件介绍的Redis位图来实现,刚才说了位图就是byte数字,假如签到就表示1,没签到就表示0,这里可以用365个字节来记录前端数,这样很节省资源了,提高了效率。这个例子就是red数据库系统工程师is位图的很好应用,比如用户签到统计,月活跃用户数统计等等业务场景都适合用位数据库系统概论第五版课后答案图实现

基本使用

Redis位图的基本语法是set其它垃圾bit/getbit,按照一次只存一个字节,还是一次一个数组字符串整个存的情况,分redis数据结构为[零存整取]、[零存零取]、[整存零取],下面介绍的例子来自《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>