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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 基于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
  • 最后取出来的数据进行后面向前的唯一运算就能得到连续打卡天数了.
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
95 1
|
2月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
51 2
数据的存储--Redis缓存存储(二)
|
2月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
78 6
|
4月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
|
28天前
|
存储 NoSQL 算法
Redis分片集群中数据是怎么存储和读取的 ?
Redis集群采用哈希槽分区算法,共有16384个哈希槽,每个槽分配到不同的Redis节点上。数据操作时,通过CRC16算法对key计算并取模,确定其所属的槽和对应的节点,从而实现高效的数据存取。
47 13
|
28天前
|
存储 NoSQL Redis
【赵渝强老师】Redis的存储结构
Redis 默认配置包含 16 个数据库,通过 `databases` 参数设置。每个数据库编号从 0 开始,默认连接 0 号数据库,可通过 `SELECT <dbid>` 切换。Redis 的核心存储结构包括 `dict`、`expires` 等字段,用于处理键值和过期行为。添加键时需指定数据库信息。视频讲解和代码示例详见内容。
|
3月前
|
存储 NoSQL Redis
2)Redis 的键值对长什么样子,又是怎么存储的?
2)Redis 的键值对长什么样子,又是怎么存储的?
46 0
|
4月前
|
存储 消息中间件 NoSQL
Redis命令详解以及存储原理
Redis命令详解以及存储原理
|
4月前
|
存储 NoSQL Redis
Redis存储原理与数据模型
Redis存储原理与数据模型
|
4月前
|
存储 缓存 NoSQL
Redis深度解析:部署模式、数据类型、存储模型与实战问题解决
Redis深度解析:部署模式、数据类型、存储模型与实战问题解决