基于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
相关文章
|
5月前
|
存储 NoSQL 算法
09- Redis分片集群中数据是怎么存储和读取的 ?
Redis分片集群使用哈希槽分区算法,包含16384个槽(0-16383)。数据存储时,通过CRC16算法对key计算并模16383,确定槽位,进而分配至对应节点。读取时,根据槽位找到相应节点直接操作。
125 12
|
5月前
|
存储 缓存 NoSQL
深入解析Redis:一种快速、高效的键值存储系统
**Redis** 是一款高性能的键值存储系统,以其内存数据、高效数据结构、持久化机制和丰富的功能在现代应用中占有一席之地。支持字符串、哈希、列表、集合和有序集合等多种数据结构,适用于缓存、计数、分布式锁和消息队列等场景。安装Redis涉及下载、编译和配置`redis.conf`。基本操作包括键值对的设置与获取,以及哈希、列表、集合和有序集合的操作。高级特性涵盖发布/订阅、事务处理和Lua脚本。优化策略包括选择合适数据结构、配置缓存和使用Pipeline。注意安全、监控和备份策略,以确保系统稳定和数据安全。
381 1
|
2月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
|
5月前
|
存储 监控 NoSQL
Redis处理大量数据主要依赖于其内存存储结构、高效的数据结构和算法,以及一系列的优化策略
【5月更文挑战第15天】Redis处理大量数据依赖内存存储、高效数据结构和优化策略。选择合适的数据结构、利用批量操作减少网络开销、控制批量大小、使用Redis Cluster进行分布式存储、优化内存使用及监控调优是关键。通过这些方法,Redis能有效处理大量数据并保持高性能。
80 1
|
4天前
|
存储 NoSQL Redis
2)Redis 的键值对长什么样子,又是怎么存储的?
2)Redis 的键值对长什么样子,又是怎么存储的?
9 0
|
2月前
|
存储 消息中间件 NoSQL
Redis命令详解以及存储原理
Redis命令详解以及存储原理
|
2月前
|
存储 NoSQL Redis
Redis存储原理与数据模型
Redis存储原理与数据模型
|
2月前
|
存储 缓存 NoSQL
Redis深度解析:部署模式、数据类型、存储模型与实战问题解决
Redis深度解析:部署模式、数据类型、存储模型与实战问题解决
|
3月前
|
存储 消息中间件 NoSQL
中间件键值存储模型Redis
【7月更文挑战第11天】
39 3
下一篇
无影云桌面