基于redis 或者二进制实现打卡记录存储

简介: 基于redis 或者二进制实现打卡记录存储,我们都知道打卡记录基于用户量会变得越来越多的记录量 ,这个时候我们就要考虑存储压力和查询打卡记录的解决方案了

我们完成了一般的积分系统表模型设计,也的确可以满足大部分企业的业务诉求。但是我们不妨想一想,积分签到信息一个用户、一个月可能会产生0-28/29/30/31的数据条目,按30来算一年就是360条数据,一条数据大小按我们刚才的表结构设计,我们来看看会占用多少字节数

表字段 数据类型 占用字节数
id bigint 8
user_id bigint 8
year year 1
month tinyint 1
date date 3
is_backup bit 1
合计:22 个字节

所以,上面的表结构可以存,但是面对大业务量的时候,就会因数据存储问题导致查询效率变慢,或需要做分库分表了。

做模型设计时,不仅考虑能不能存,最好多思考一下:这样存,后面会不会出现什么问题?

那么有什么数据结构是比较适合的呢?实际这里比较适合位图的存储结构,就类似我们的签到卡,当用户签到我们记录1,没签到记录0

把每一个bit位对应当月的每一天,形成了映射关系。用0和1标示业务状态,这种思路就称为位图(BitMap)

如布隆过滤器就是借助位图实现的。

image.png

最终我们的记录在一个月后会变成:

image.png

数据一下子就减少了很多内存(仅31bit),并且一个月才一条数据,但是随之而来的问题就是,位图怎么存 ?怎么取?实际Redis中提供了BitMap数据结构(底层还是String数据结构),并且提供了很多操作bit的命令。

Redis指令学习

  • 存储数据指令:SETBIT

image.png

指令是:

  • SETBIT:关键字
  • key:存储的key
  • offset:存储的位置脚标,0开始
  • value:存储的值
  • 读取数据指令:BITFIELD

image.png

指令是:

  • BITFILED:关键字
  • key:存储的key
  • GET:关键字
  • encoding:编码格式+要读取几位,u:无符号整数(常用)、i:有符号整数
  • offset:从哪个脚标开始读取

Redis指令测试

由于我们的redis是部署在docker中的,所以步骤大致如下:

  • 进入容器的指令:docker exec -it redis redis-cli进入
  • 存储数据:setbit user 0 1,会提示没有权限,我们输入一下密码:auth 123321,再存储就可以了

image.png

这里的返回值,说明的是存储在当前脚标下,之前的值是多少,因为默认都是0,所以返回0,我们再存一次会发现返回的是1

image.png

  • 我们可以多存储几个,甚至可以跳着存储(模拟部分天数打卡,部分不打卡),也会发现格式不对会失败

image.png

我们此时数据存储是:111010001

  • 查看数据:BITFIELD user GET u2 2:从脚标2开始获取长度2的数据,即获取脚标为2-3的数据,数据的key是 user,而脚标为2-3的数据在上面可以发现是1 0,并且二进制中:10标识的是2,因此返回:2

image.png

  • 同理,我们如果是从脚标0开始,获取3位,即:111,在二进制就是:7(1+2+4)
    image.png
  • 所以后续我们就可以使用:SETBITBITFIELD 完成签到数据的保存和读取了。



  • image.png
  • 最后取出来的数据进行后面向前的唯一运算就能得到连续打卡天数了.
相关文章
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
454 1
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
183 2
数据的存储--Redis缓存存储(二)
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
248 6
|
存储 缓存 NoSQL
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
235 2
|
9月前
|
存储 NoSQL 算法
Redis分片集群中数据是怎么存储和读取的 ?
Redis集群采用的算法是哈希槽分区算法。Redis集群中有16384个哈希槽(槽的范围是 0 -16383,哈希槽),将不同的哈希槽分布在不同的Redis节点上面进行管理,也就是说每个Redis节点只负责一部分的哈希槽。在对数据进行操作的时候,集群会对使用CRC16算法对key进行计算并对16384取模(slot = CRC16(key)%16383),得到的结果就是 Key-Value 所放入的槽,通过这个值,去找到对应的槽所对应的Redis节点,然后直接到这个对应的节点上进行存取操作
|
存储 消息中间件 监控
Redis Stream:实时数据流的处理与存储
通过上述分析和具体操作示例,您可以更好地理解和应用 Redis Stream,满足各种实时数据处理需求。
1121 14
|
存储 NoSQL 算法
Redis分片集群中数据是怎么存储和读取的 ?
Redis集群采用哈希槽分区算法,共有16384个哈希槽,每个槽分配到不同的Redis节点上。数据操作时,通过CRC16算法对key计算并取模,确定其所属的槽和对应的节点,从而实现高效的数据存取。
259 13
|
存储 NoSQL Redis
【赵渝强老师】Redis的存储结构
Redis 默认配置包含 16 个数据库,通过 `databases` 参数设置。每个数据库编号从 0 开始,默认连接 0 号数据库,可通过 `SELECT <dbid>` 切换。Redis 的核心存储结构包括 `dict`、`expires` 等字段,用于处理键值和过期行为。添加键时需指定数据库信息。视频讲解和代码示例详见内容。
226 0
|
存储 消息中间件 NoSQL
Redis命令详解以及存储原理
Redis命令详解以及存储原理
|
存储 NoSQL Redis
Redis存储原理与数据模型
Redis存储原理与数据模型