0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

GeminiDB 新特性:让 Redis 广告频控爱不释手的 exHASH

jf_21561199 来源:jf_21561199 作者:jf_21561199 2024-04-08 18:26 次阅读

exHash 类型是一种支持 Field 过期的新型数据类型,它在原先的 Hash 类型基础上进行了扩展:在支持 Hash 类型的通用功能以外,exHash 类型还支持为 Field 设置过期时间和版本,增强了数据结构的灵活性,从而简化了很多复杂场景下的业务开发工作。

本文以两种常见的场景(频控场景 &购物车)为例,通过使用 GeminiDB Redis 接口中的 exHash 类命令来实现复杂的业务,简化开发难度。

一、exHash 命令使用简介

wKgaomYELouAXiH4AAqJUmc8_5k47.webp

命令语法定义如下:

大写关键字:命令关键字。

斜体:变量。

[options]:可选参数,不在括号中的参数为必选。

A|B:该组参数互斥,请进行二选一或多选一。

...:前面的内容可重复。

二、应用场景

1.频控场景

频控指的是对用户在一定时间内(例如一天、一周、一个月)进行某种操作的次数进行限制,可以控制特定广告或信息在一定时间内在特定平台上的展示次数,以避免过度曝光和广告疲劳,同时优化广告效果和用户体验;对于广告来说,也可以提高广告的效果和转化率。此外,频控还可以避免恶意行为,如刷流量、刷评论、刷点赞等。

频控的 3 个要素包含用户 ID、广告 ID、触发次数;以用户 ID 为 key,广告 ID 为 field,指定时间内的触发次数为 value,恰好构成频控的三要素。先配置好各个广告的指定频控策略,如下图所示即可根据如下的方式来实现频控:

wKgZomYELouAD_MjAAGxpe5msA034.webp

最左边通过 Hash 类型来实现,通过 expire 命令设置 User_1 的过期时间为一天,每推送一次通过 hincrby 来增加指定广告的推送次数,每次推送指定广告前在一天内的推送次数则可以通过 hget 获取进行判断,一天后该用户的数据自动过期无需手动清理,这样便可以简单地实现频控。但这个方案的缺点在于对于每个用户(即每个 key)只能设置一个过期时间,无法做到例如 8 小时 3 次这样指定时间段内的灵活的频控策略。

为了做到对每个广告都配置指定时间段内的灵活频控,如中间图所示可以通过将时间戳拼接在 value 里的方式用 Hash 类型来实现,但这种方案无疑是增加了业务侧开发的工作量。

如最右图所示,支持给 field 设置过期时间的 exHash 类型可以很完美地解决 Hash 类型面对频控场景的缺点。由于 Field 支持过期时间设置,那么该场景下,平台可以给每个广告都配置不同时间段内的频次要求,假设此时给 AD_2 配置的频控策略为 8 小时内 2 次,那么如图所示在下一次再准备给 User_1 推送 AD_2 广告前,先通过 exhget User_1 AD_2 命令获取到了该值已经是 2 时,便可以判断出此时根据平台频控策略,不应该再给 User_1 推送 AD_2 广告了。而当 8 小时一过,User_1 的 AD_2 这个 field 过期后,exhget 无法再获取到这个 field 的信息,则可以继续给 User_1 推送 AD_2 广告了。

2.购物车场景

最近双十一期间,相信很多同学购物车里都填满了各种想要清空的宝贝,这里就以购物车场景为例介绍该场景的几种不同 Redis 类型的实现,并比较这几种实现方案的优缺点。

1)基于 String 实现购物车功能

如图所示基于 String 可以轻松地实现各个用户的购物车功能,该方案需要将用户 ID 与商品 ID 进行拼接作为 key,例如 User_1#Earphones_1,key 对应的 value 为购物车中用户准备购买的数量,其中可能有部分商品为限时特购,所以有过期时间,为 key 对应的过期时间。

wKgaomYELoyAIiDeAABrXRocggY85.webp

涉及命令如下:

wKgZomYELoyAGUgUAAD6XRrxoXA79.webp

该方案会存在如下问题:

额外拼接增加编、解码开发工作量

某个用户获取自己的购物车清单时还需要通过 scan 命令前缀匹配扫描所有 key,并通过 get 命令去获取对应的值。

想要直接获取清单长度时,仍然需要遍历整个前缀 key 的数目,方法复杂。

存在大量重复的用户名前缀,浪费存储空间。

2)基于 Hash 实现购物车功能

可以根据如图所示的 Hash 类型来实现购物车的管理,用户 ID 作为 key,商品 ID 作为 field,value 为购物车中对应商品的数量。其中对于部分限时特购的商品,其过期时间通过拼接的方式放到 field 对应的 value 里。

wKgaomYELo2AcvMXAABWc45KMjU39.webp

涉及命令如下:

wKgZomYELo2AQ2oxAAEoVPDwuJk41.webp

该方案相对于 String 类型的方案有了不少优化:

获取某个用户购物车中的所有商品清单仅需要一个 hgetall 命令即可

获取某个用户的清单长度时直接 hlen 获取即可

不存在大量重复的用户名前缀问题

然而该方案仍存在一个明显的缺点,即对于部分限时特购的商品处理起来复杂:对于 User_1 的 Keyboard_1 商品,如果要再加一个数量,不能直接使用 hincrby,而是需要先 hget 获取 Keyboard_1 商品的值并解码,再加上指定的数量再编码后 hset 对应的值。

3)基于 exHash 实现购物车功能

根据如图所示的 exHash 类型来实现购物车的管理,同 Hash 类型一样,用户 ID 作为 key,商品 ID 作为 field,value 为购物车中对应商品的数量。其中对于部分限时特购的商品,由于 exHash 类型可以为 Field 设置过期时间,其过期时间可通过 hset 命令直接设置。

wKgaomYELo6AXUclAABkKnHz51E91.webp

涉及命令如下:

wKgZomYELo-ANXV7AAFeIa9cFtk63.webp

该方案相对于 Hash 类型的优化主要体现在可以直接为各 field 设置过期时间,使业务侧使用起来简单又高效。可以看到 exHash 类型相关的命令和 Hash 类型是类似的,使用起来学习成本很低,业务侧改造成本相对也比较低。

wKgaomYELo-ATHolAAJmte8PcIQ67.webp

图 1.1 华为商城购物车中,用户 ID、商品 ID、商品数量及 exhash 类型命令的使用。

三、总结

本文介绍了 GeminiDB Redis 接口的 exHash 类型的特性、使用方法及应用场景。为客户提供了一种语法与原生 Redis Hash 类型类似、和 Hash 类型的使用相互隔离、支持给 Field 单独设置过期时间和版本的 exHash 类型作为各种复杂场景的解决方案。未来,GeminiDB Redis 接口将持续致力于开发更多好用的企业级特性,帮助客户轻松运维,高效开发。

如果你的业务需要一款稳定可靠的 KV 数据库,可以试试 GeminiDB Redis 接口。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Gemini
    +关注

    关注

    0

    文章

    49

    浏览量

    7544
  • Redis
    +关注

    关注

    0

    文章

    368

    浏览量

    10780
收藏 人收藏

    评论

    相关推荐

    高效充电!你被这条快充电源线硬控了吗?

    需求这条电源线都能高效满足爱不释手!快让我们一起揭开这条橙色USBType-C快充电源线的神秘面纱吧!产品亮点高效充电快人一步MINIWARE新推出的橙色快充
    的头像 发表于 06-06 08:02 275次阅读
    高效充电!你被这条快充电源线硬控了吗?

    华为云多模数据库 GeminiDB 架构与应用实践直播问答实录

    龙通过直播(链接见文末)的方式,分享了《华为云多模数据库 GeminiDB 的技术架构及应用实践》,对 GeminiDB 的技术特性、架构优势等进行了全方位解读。整场直播干货满满,
    的头像 发表于 04-08 18:25 1051次阅读

    华为云 GeminiDB 发布新版本,全面支持 Redis 6.2

    华为云 GeminiDB 是一款兼容 Redis 协议的弹性 KV(Key-Value)数据库,支持远超内存的容量和极致的性能,可支撑用户平滑迁移,在广告、游戏、电商等行业有着广泛的应用。 今年 3
    的头像 发表于 04-08 18:22 1037次阅读
    华为云 <b class='flag-5'>GeminiDB</b> 发布新版本,全面支持 <b class='flag-5'>Redis</b> 6.2

    Redis开源版与Redis企业版,怎么选用?

    点击“蓝字”关注我们数以千计的企业和数以百万计的开发人员Redis开源版来构建应用程序。但随着用户数量、数据量和地区性的增加,成本、可扩展性、运营和可用性等问题也随之而来。Redis企业版
    的头像 发表于 04-04 08:04 673次阅读
    <b class='flag-5'>Redis</b>开源版与<b class='flag-5'>Redis</b>企业版,怎么选用?

    GaussDB(for Redis) 特性揭秘:多租户管理

    华为云 GaussDB(for Redis)持续完善企业级增强特性,是名副其实的 "Redis Plus" ,其中很经典的企业级特性是 多租户能力 ,支持添加只读账号、读写账号,且具备
    的头像 发表于 03-28 22:06 658次阅读
    GaussDB(for <b class='flag-5'>Redis</b>) <b class='flag-5'>特性</b>揭秘:多租户管理

    GaussDB(for Redis) 特性揭秘:大 key 治理

    运行过程中悄悄产生的,人防不胜防。因此,一款可随时在线诊断,且能主动预警,防患于未然的 Redis 服务产品显得尤为重要。   作为由华为云精心打造的企业级 Redis,GaussDB
    的头像 发表于 03-28 22:06 587次阅读
    GaussDB(for <b class='flag-5'>Redis</b>) <b class='flag-5'>特性</b>揭秘:大 key 治理

    MongoDB和Redis的技术特性

    Redis作为一个高性能的内存数据存储系统,能够提供快速的缓存机制,从而帮助应用承受高并发请求,显著提高系统响应速度和吞吐量。这与国内互联网公司推崇的快速迭代和高用户并发量的特点非常契合。
    的头像 发表于 02-01 11:42 379次阅读
    MongoDB和<b class='flag-5'>Redis</b>的技术<b class='flag-5'>特性</b>

    redis容器内怎么查看redis日志

    redis是一款流行的开源内存数据库,常用于缓存、消息队列、任务管理等场景。在使用redis时,了解如何查看redis日志对于排查问题、监控性能和分析应用程序行为非常重要。在本文中,我们将介绍在
    的头像 发表于 12-05 10:10 2898次阅读

    Java redis锁怎么实现

    在Java中实现Redis锁涉及到以下几个方面:Redis的安装配置、Redis连接池的使用、Redis数据结构的选择、实现分布式锁的几种方式等。 一、
    的头像 发表于 12-04 10:47 887次阅读

    Cloud MemoryStore for Redis Cluster 正式发布

    以下文章来源于谷歌云服务,作者 Google Cloud 自从我们推出 Memorystore for Redis Cluster 预览版以来,银行、零售、广告、制造和社交媒体等各个行业的客户都利用
    的头像 发表于 11-24 17:40 303次阅读
    Cloud MemoryStore for <b class='flag-5'>Redis</b> Cluster 正式发布

    STC单片机烧录一定次数程序后芯片损坏的原因?

    自从使用STC的51单片机以来,觉得STC不仅功能强大,而且烧写方便。现在一直是爱不释手。但是在使用过程当中也遇到烧写次数多导致损坏的问题,不论是STC89901215(11系列没有用过)以至于现在
    发表于 10-26 07:20

    Redis中的使用

    Redis 作为内存的存储中间件,已经是面试的面试题必问之一了,今天一起来看看 Redis 的事务吧。 事务提供了一种"将多个命令打包,一次性提交并按顺序执行"的机制,提交后在事务执行中不会
    的头像 发表于 10-08 15:27 395次阅读
    <b class='flag-5'>Redis</b>中的使用

    如何用Springboot整合Redis

    本篇文件我们来介绍如何用Springboot整合Redis。 1、Docker 安装 Redis 1.1 下载镜像 docker pull redis: 6 . 2 . 6 1.2 创建配置文件
    的头像 发表于 10-08 14:56 483次阅读
    如何用Springboot整合<b class='flag-5'>Redis</b>

    如何使用Rust连接Redis

    Redis是一款快速、开源、键值存储数据库,被广泛应用于缓存、发布/订阅系统、定时任务等场景中。Rust提供了很多Redis的客户端库,本教程将会介绍如何使用Rust连接Redis,以及如何通过
    的头像 发表于 09-19 16:22 1956次阅读

    Redis 的数据清理策略

    本文整理 Redis 的数据清理策略所有代码来自 Redis version :5.0, 不同版本的 Redis 策略可能有调整
    发表于 09-19 14:24 299次阅读
    <b class='flag-5'>Redis</b> 的数据清理策略