描述

  bitmap是redis封装的用于针对位(bit)的操作,其特点是计算效率高,占用空间少,常被用来统计用户签到、登录等场景

常用命令及解析

常用命令

setbit key offset value

  给key在指定位索引位置上(offset)设置一个value,因为是bit所以value只能为0或1;如setbit zhangsan 2 1表示在位索引的2号位设置为1,对应的二进制位应该是0010 0000

getbit key offset

  获取key在指定位索引位置上对应的二进制值,要么是0要么是1

bitcount key [start end]

  统计key在给定的字节索引范围内1出现的次数;如bitcount zhangsan 1 2表示统计张三在字节所以1-2之间1出现的次数

bitpos key bit [start] [end]

  统计key对应的二进制串中指定的bit(1或0)在指定字节索引下标内第一次出现的位置,没有出现返回-1;

bitop operation destkey key [key ...]

  将两个或多个key的二进制位进行或、与的操作然后赋值给指定的新key(destkey);如bitop and k3 k1 k2表示将k1和k2按与操作后赋值给k3

解析

  针对上面的常用命令,如果是初识的话有可能会比较蒙蔽,下面结合我画的图来进行解析;首先需要明确的一点是上文提到的offset(偏移量)指的是bit(位)的索引位置,一个字节等于8个bit,bit的索引下标从0开始;然后命令里的start end这些表示的是字节索引位置,如[0,2]表示字节的0到2的区间,相当于3个字节对应bit位置的0-24,下面上图:



针对上图我们再跑一遍上面的常用命令进行解析:

setbit zhangsan 3 1 表示将bit下标为3的位置设置为1,二进制表示如下:0001 0000
getbit zhangsan 3 表示获取bit下标为3位置上的二进制值为1,如果getbit zhangsan 2则值为0
bitcount zhangsan 0 1 表示获取字节下标0-1(相当于bit下标的0-15)之间位置内1出现的次数,这里结果为1
bitpos zhangsan 1 0 1 表示获取字节下标0-1(相当于bit下标的0-15)之间位置内1第一次出现的次数,因为上面设置了zhangsan对应的二进制为0001 0000,所以这里结果应为3
bitop operation destkey key [key ...] 这是bitop前再设置一个key,setbit lisi 2 1,然后执行bitop or k3 zhangsan lisi,这时k3的值因为zhangsan/lisi二进制or运算后的值,应为0011 0000;

应用场景

统计不确定时间周期内用户登录情况

  比方说需要统计20220101-20220107区间内用户登录的次数

思路分析

  针对用户量不是那么多且登录不频繁的非互联网型的应用,利用mysql维护一张用户登录的日志表就能解决问题,但是假设用户量过大且用户登录次数频繁的情况下,mysql就并不是最优解了;这时可以结合使用bitmap来实现这一需求

实现

  在redis里维护一个key为用户id的bitmap,用户每次登录时setbit userId offset 1;需要注意的是这里的offset需要进行计算映射,将bit的下标与一年的365天对应上;统计的时候根据不同需求有好几种实现;

1、bitcount userId 0 -1 统计用户一年登录的次数

2、根据具体查询区间循环getbit userId offset;如查询20220101-20220107区间内用户登录的次数则先找到20220101-10对应的偏移量接着循环getbit,判断结果,如果是1则给登录天数加1即可

统计某一特定时间内活跃用户(登录一次即算活跃)的数量

思路分析与实现

  将日期作为key,offset映射成不同的用户id,当不同的用户登录时setbit 20210101 offset,如:

setbit 20220101 0 1

setbit 20220102 1 1

setbit 20220102 0 1

setbit 20220102 2 1

以日期为key,将用户id与位索引提前做好映射,比方说0位表示张三1位表示李四2位表示王五,当张三登录时在0位设置1,李四登录在1位设置1,王五登录在2位设置1,统计指定时间时将指定时间对应的key做bitop操作即可,如下:bitop or  k3 20220101 20220102 上面命令表示将20220101和02这两个key做or操作,因为二进制or操作是有1即是1,最后统计k3里1出现的次数即得出20210101到02之间活跃用户数为3:bitcount k3 0 -1

redis位图(bitmap)常用命令的解析的更多相关文章

  1. redis 介绍和常用命令

    redis 介绍和常用命令 redis简介 Redis 是一款开源的,基于 BSD 许可的,高级键值 (key-value) 缓存 (cache) 和存储 (store) 系统.由于 Redis 的键 ...

  2. Redis数据类型和常用命令

    Redis相较于其它的数据库虽然简单,但是要熟记所有命令的用法也并非易事.一个简单的技巧是通过要操作的数据类型来将这些命令进行结构化. 数据类型和对应命令 所有存储于redis中的数据都对应于一个键值 ...

  3. 记录redis安装及常用命令

    Redis安装及常用命令 一.安装 1.下载,解压,进入redis解压目录,make. make PREFIX=目录/redis install :安装到指定目录文件名为redis. 2.将解压目录里 ...

  4. VMWare12安装CentOS7以及redis安装和常用命令

    一.vmware安装centos7后没有网卡 VMWare 12版本不提供32位安装程序,只有64位安装程序,如果在安装CentOS时,选择的是CentOS而不是CentOS 64位,则会出现Cent ...

  5. redis数据类型及常用命令介绍(图文实例)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhgAAAFLCAYAAACUdvXUAAAgAElEQVR4nO3da1da58L2fT5KfPvc96 ...

  6. redis笔记总结之redis数据类型及常用命令

    三.常用命令 3.1 字符串类型(string) 字符串类型是Redis中最基本的数据类型,一个字符串类型的键允许存储的数据的最大容量为512MB. 3.1.1 赋值与取值: SET key valu ...

  7. 数据库之redis篇(2)—— redis配置文件,常用命令,性能测试工具

    redis配置 如果你是找网上的其他教程来完成以上操作的话,相信你见过有的启动命令是这样的: 启动命令带了这个参数:redis.windows.conf,由于我测试环境是windows平台,所以是这个 ...

  8. Redis学习笔记--常用命令

    以下为本人学习Redis的备忘录,记录了大部分常用命令 1.客户端连接redis服务端: ===启动Redis服务端 redis-server /yourpath/redis.conf ===启动Re ...

  9. Redis 学习之常用命令及安全机制

    该文使用centos6.5 64位    redis3.2.8 一.redis常用命令 键值常用命令: 1. keys 返回满足pattern的所有key. 127.0.0.1:6379> ke ...

随机推荐

  1. HTML初学者小知识2

    网页内嵌 代码以及演示如下 代码 <div id="tab_1"> <iframe src="div.html" height="5 ...

  2. 部署k8s的heapster监控

    Heapster是容器集群监控和性能分析工具,天然的支持Kubernetes和CoreOS heapster监控目前官网已经不更新,部署学习使用 heapster: 收集监控数据 influxdb:数 ...

  3. 抛砖系列之git仓库拆分工具git-filter-repo

    最近负责把团队内的git仓库做了一次分拆,解锁一个好用的工具git-filter-repo,给大伙抛砖一波,希望以后遇到类似场景时可以信手拈来. 背景 笔者团队目前是把业务相关的java项目都放到了一 ...

  4. KingbaseES 实现MYSQL hex/unhex 函数

    MySQL 的hex 和 unhex 函数类似于KingbaseES 的encode 和 decoding,实现字符与16进制之间的转换. 一.先看MySQL例子 mysql> select h ...

  5. 当web项目没有配置<welcome-file>index_1.jsp</welcome-file>默认标签启动tomcat后默认访问的页面是什么呢?

    当web项目没有配置index_1.jsp默认标签启动tomcat后默认访问的页面是什么呢? 结果我启动后居然默认打开了index.jsp页面 为什么呢?为什么会访问我的.indexjsp页面呢?不是 ...

  6. AD画板从头开始

    AD画板从头开始 前言 近期认真的画了一次板子,以前虽然也画过,但是都是很随意的,这次是做一个小项目,然后因为有一段时间没有画板了,发现自己很多基础的东西都忘记了,这里就来记录一下从头到尾的过程.本次 ...

  7. [Python]-pdb模块-单步调试

    使用pdb模块辅助python调试. import pdb 断点模式 在需要调试的语句前设置断点,加入这行代码: pdb.set_trace() 程序运行到这就会进入断点调试模式. 输入 作用 n 运 ...

  8. Gitea 与 Drone 集成实践:完全基于 Docker 搭建的轻量级 CI/CD 系统

    Drone 是一个使用 Go 语言编写的自助式的持续集成平台,和 Gitea 一样可以完全基于容器部署,轻松扩展流水线规模.开发者只需要将持续集成过程通过简单的 YAML 语法写入 Gitea 仓库目 ...

  9. nginx反向代理Grafana

    官方文旦地址:https://grafana.com/tutorials/run-grafana-behind-a-proxy/ 一级路径 只需要修改nginx配置文件 # this is requi ...

  10. 《HelloGitHub》第 78 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...