关于海量级存储用户标签体系架构

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 关于海量级存储用户标签体系架构

项目场景:

对于我们运营来说,需要给用户打上不同的身份标签。比如用户是否偏重,身高范围,是不是我们的会员。。。等等一些标签。

比如我们有100W用户。我们需要来给100W用户打上接近200个不同身份的标签应该如何去做?


设计方式

  • 这里对于mysql表的设计我们有两种方式
  1. 一是采用新增列的方式来新增用户身份。一对一存储,但是这种存在的弊端是我们在新增用户身份时,每次都需要手动新增一列。来保存用户新的身份。而且有多少身份就需要多少列,对于mysql的性能会急剧降低。尽管我们可以进行垂直拆分来增加性能。但也会让mysql更难维护。以及扩展性变的很差。
  1. 二是采用一对多的形式来存储用户身份。表结构如下
ID 标签tag 标签描述 状态
1 is_vip 是否是VIP用户 1
2 is_male 是否是男性 1
3 bmi_is_ok bmi是否正常 1
ID uid 身份标签ID 状态
1 1 1 1
1 2 2 1
1 3 3 1

这样子做我们在新增身份的时候,就能灵活库扩展,在标签表新增之后,我们再按照指定的逻辑去给用户洗上标签。


如何在判断用户标签的时候实现低延时查询判断?

我们建立好标签之后是拿来用的,在业务逻辑代码中,我们经常会判断用户是否是属于某一种身份标签。以此来给用户下发不同的数据。并且在很多的业务逻辑中都有涉及,那么我们需要解决的问题就是如果实时去查询出用户是否属于某一种标签身份。

如果按照我们100W用户 一个用户200种标签的设想。那么我们表数据的存储量级是特别大的,尽管我们考虑了分表的设计。单表1000W数据去做查询也是很慢的。尤其我们很多场景下都需要实时做身份判断。

那么我们将采用redis来作为缓存数据。但是使用redis key value形式将所有用户的身份存储下来那是一个相当庞大的数据量。有没有更好的方式来进行存储呢?

首先我们抽出共性。我们的身份标签值只能为0和1,那么我们是不是可以采用bitmaps的方式来进行用户标签的存储呢?

结合bitmaps特性,我们可以有如下设计


{
    // 所有vip用户
    "user:is_vip":{
        "01001001"
    },
    // 所有男性用户
    "user:is_male":{
        "01101010"
    },
    // 所有男性用户
    "user:male":{
        "01010011"
    },
    // 用户1的所有标签
    "user:all:1":{
        "01101010"
    },
    //用户2的所有标签
    "user:all:2":{
        "00100001"
    }
}

使用上面的存储结构,我们就能快速的找出某人对应的身份信息。并且内存可控。

那么现在如何解决我们存储进去的问题

前置条件
1 以用户主表ID做为用户ID,且满足排序规则。

那么我们可以直接使用用户ID来做为偏移量来判断用户的身份

比如我们要判断uid为3的用户是不是vip
在这里插入图片描述
就能快速的或者用户是不是满足当前身份

SETBIT
GETBIT
BITCOUNT 可以实现我们当前身份下有多少个用户满足
BITPOS
BITOP
BITFIELD

同时 借助以上redis命令我们能实现更多操作。
  • SETBIT

    设置用户身份
    在这里插入图片描述
  • BITOP

    对身份标签做运算

在这里插入图片描述
我们可以借助BITOP来进行身份的交叉运算。以此来快速判断多种身份以及统计结果。

  • GETBIT

    获取用户身份

在这里插入图片描述

性能测试

setbit user:is_vip 10000000 给第10000000个用户设置是vip的身份(相当于也给前10000000个用户都设置了不是vip的身份)
在redis里面都是毫秒级响应

解决方案:

根据上面的分析,我们大致可以确定身份存储的流程,首先我们在标签表新增一种身份,我们按照指定的逻辑来将对应的身份洗进数据库,同时使用bitmaps来存储下来,不设置过期失效,如果有对应身份更新。同步到redis bitmaps。为了保持数据精准性。同时可以设置定时任务来做定时刷新,保持缓存与数据库身份的同步更新。

相关实践学习
基于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
相关文章
|
23天前
|
存储 数据采集 弹性计算
Codota的存储架构通过多种方式保障数据安全
Codota的存储架构通过多种方式保障数据安全
25 4
|
4月前
|
存储 缓存 前端开发
Django 后端架构开发:存储层调优策略解析
Django 后端架构开发:存储层调优策略解析
65 2
|
24天前
|
存储 缓存 弹性计算
Codota的服务器存储架构
Codota的服务器存储架构
25 5
|
23天前
|
存储 缓存 弹性计算
Codota的存储架构
Codota的存储架构
30 3
|
2月前
|
存储 监控 分布式数据库
百亿级存储架构: ElasticSearch+HBase 海量存储架构与实现
本文介绍了百亿级数据存储架构的设计与实现,重点探讨了ElasticSearch和HBase的结合使用。通过ElasticSearch实现快速检索,HBase实现海量数据存储,解决了大规模数据的高效存储与查询问题。文章详细讲解了数据统一接入、元数据管理、数据一致性及平台监控等关键模块的设计思路和技术细节,帮助读者理解和掌握构建高性能数据存储系统的方法。
百亿级存储架构: ElasticSearch+HBase 海量存储架构与实现
|
7月前
|
存储 关系型数据库 分布式数据库
【PolarDB开源】深入PolarDB内核:探究存储计算分离架构的设计哲学
【5月更文挑战第20天】PolarDB是阿里巴巴的云原生分布式数据库,以其存储计算分离架构为核心,解决了传统数据库的扩展性和资源灵活性问题。该架构将数据存储和计算处理分开,实现高性能(通过RDMA加速数据传输)、高可用性(多副本冗余保证数据可靠性)和灵活扩展(计算资源独立扩展)。通过动态添加计算节点以应对业务流量变化,PolarDB展示了其在云时代应对复杂业务场景的能力。随着开源项目的进展,PolarDB将持续推动数据库技术发展。
233 6
|
3月前
|
存储 监控 数据可视化
SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
【9月更文挑战第2天】SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
175 9
|
7月前
|
存储 Cloud Native 对象存储
AutoMQ:基于阿里云计算与存储产品实现云原生架构升级
AutoMQ[1] 是新一代基于共享存储架构实现的云原生 Kafka。得益于其存算分离的共享存储架构,通过和阿里云合作,深度使用阿里云可靠、先进的云服务如对象存储OSS、块存储 ESSD、弹性伸缩ESS以及抢占式实例实现了相比 Apache Kafka 10倍的成本优势并且提供了自动弹性的能力。
84346 26
AutoMQ:基于阿里云计算与存储产品实现云原生架构升级
|
5月前
|
存储 关系型数据库 分布式数据库
PolarDB,阿里云的云原生分布式数据库,以其存储计算分离架构为核心,解决传统数据库的扩展性问题
【7月更文挑战第3天】PolarDB,阿里云的云原生分布式数据库,以其存储计算分离架构为核心,解决传统数据库的扩展性问题。此架构让存储层专注数据可靠性,计算层专注处理SQL,提升性能并降低运维复杂度。通过RDMA加速通信,多副本确保高可用性。资源可独立扩展,便于成本控制。动态添加计算节点以应对流量高峰,展示了其灵活性。PolarDB的开源促进了数据库技术的持续创新和发展。
310 2
|
5月前
|
存储 运维 数据库
业务系统架构实践问题之业务模型和存储模型解耦的重要性问题如何解决
业务系统架构实践问题之业务模型和存储模型解耦的重要性问题如何解决