前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis系列之位图简介

Redis系列之位图简介

作者头像
SmileNicky
发布2022-05-07 16:51:37
6060
发布2022-05-07 16:51:37
举报
文章被收录于专栏:Nicky's blog

文章目录

位图定义

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

代码语言:javascript
复制
//在第二位存“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>

[零存零取]的情况:

代码语言:javascript
复制
//在第二位加“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>

[整存零取]

代码语言:javascript
复制
//存整个字符
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>

特殊情况:

代码语言:javascript
复制
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]

代码语言:javascript
复制
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>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 位图定义
  • 应用场景
  • 基本使用
  • 查找统计
相关产品与服务
云数据库 Redis®
腾讯云数据库 Redis®(TencentDB for Redis®)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档