首页 > 数据库 >GeminiDB新特性:让Redis广告频控爱不释手的exHASH

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

时间:2023-11-23 11:46:10浏览次数:38  
标签:Hash 过期 Redis exHASH 购物车 广告 频控 ID

本文分享自华为云社区《GeminiDB新特性:让Redis广告频控爱不释手的exHASH》,作者:GeminiDB-Redis博客 。

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

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

exHash命令使用简介

应用场景

频控场景

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

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

  • 最左边通过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广告了。

购物车场景

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

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

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


涉及命令如下:

该方案会存在如下问题:

  • 额外拼接增加编、解码开发工作量
  • 某个用户获取自己的购物车清单时还需要通过scan命令前缀匹配扫描所有key,并通过get命令去获取对应的值。
  • 想要直接获取清单长度时,仍然需要遍历整个前缀key的数目,方法复杂。
  • 存在大量重复的用户名前缀,浪费存储空间。

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

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

涉及命令如下:

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

  • 获取某个用户购物车中的所有商品清单仅需要一个hgetall命令即可
  • 获取某个用户的清单长度时直接hlen获取即可
  • 不存在大量重复的用户名前缀问题

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

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

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

涉及命令如下:

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

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

总结

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

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

 

团队往期技术分享目录:http://3ms.huawei.com/km/blogs/details/13802925,也可加入我们的交流群哦!

点击关注,第一时间了解华为云新鲜技术~

 

标签:Hash,过期,Redis,exHASH,购物车,广告,频控,ID
From: https://www.cnblogs.com/huaweiyun/p/17851204.html

相关文章

  • Redis单线程速度快原理
    Redis单线程速度快原理基于内存存储实现我们都知道内存读写是比在磁盘快很多的,Redis基于内存存储实现的数据库,相对于数据存在磁盘的MySQL数据库,省去磁盘I/O的消耗。高效的数据结构数据结构说明:Redis内部采用了一些精细化的数据结构和算法,例如哈希表、跳跃表、压缩列表等,这......
  • Redis命令合集
    Redis命令合集服务器相关命令说明命令启动redis服务redis-server.exeredis.windows.conf默认连接redis-cli.exe-a123456避免中文显示乱码连接redis-cli.exe-a123456--rawIP、端口、密码连接,地址:localhost、端口:6379、密码:12345如果没加密码可以不输......
  • redis
    04-01redis一.简介1.快速了解#存储形式:key:value对#存储位置:内存#支持存储的类型:string(字符串)、list(链表)、set(集合)、zset(sortedset--有序集合)和hash(哈希类型)#支持的操作:(注意:具有原子性,要么同时成功,......
  • redis中查看慢日志以及返回参数值的解释
    1、问题描述 业务反馈,出现很多连接redis的readtimedout的报错  2、问题分析及解决 由于redis是单线程处理的,所有redis接收到命令,都会进入到队列中,等待执行。 当客户端,由于等待时间过长,没有接收到server端返回的数据,就是出现超时的报错。 程序里,jedis客户端,默......
  • 面试还搞不懂redis,快看看这40道面试题(下)
    21、Redis集群的主从复制模型是怎样的?答:为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品.22、Redis集群会有写操作丢失吗?为什么?答:Redis并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下......
  • redis常用知识
    1.安装aptinstallredis2.启动、停止、重启serviceredisstartserviceredisstopserviceredisrestartredis-server/etc/redis/redis.conf也可以启动kill-9进程号停止3.配置项绑定ip:如果要远程访问,将此行注释bind127.0.0.1端口:p......
  • docker 部署redis
     OKdockerrun-d--privileged=true--restart=always-p6379:6379-v/usr/local/docker/redis/6379.conf:/etc/redis/redis.conf-v/usr/local/docker/redis/data6379:/data--nameredis6379redis:7.0.5redis-server/etc/redis/redis.confdockerrun-d--privilege......
  • redis
    redis支持数据持久化,支持多种数据类型,支持数据备份性能高,数据类型丰富,支持事务,支持订阅、消息队列安装官方编译安装[root@redis:/usr/local/redis-4.0.0]#yum-yinstallgccgcc-c++[root@redis:~]#wgethttp://download.redis.io/releases/redis-4.0.0.tar.gz[root@red......
  • 10、Redis哨兵(sentinel)【面试重点】
    一、是什么二、能干嘛三、怎么玩(案例演示实战步骤)1、RedisSentinel架构,前提说明2、案例步骤2.1sentinel.conf文件位置2.2重点参数项说明2.3本次案例哨兵sentinel文件通用配置2.4先启动一主二从3个redis实例,测试正常的主从复制以下是哨兵......
  • SpringBoot使用RedisTemplate
    SpringBoot使用RedisTemplate目录1.Redis五种基础数据结构2.SpringBoot连接Redis1引入依赖2配置redis连接3编写测试类3.详解RedisTemplate的API1常用数据操作2.几种数据结构操作的具体用法1.Redis五种基础数据结构参考链接:Redis入门-数据类型:5种基础数据类......