如何用阿里云Redis构建高性能在线广告系统

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 摘要 本文主要介绍在线广告系统,以及如果使用阿里云Redis方便快捷的构建大数据量,低延迟的在线广告服务。 背景 在线广告作为互联网最主要的盈利模式之一,支撑着互联网行业的发张。早期的在线广告主要是展示广告,和在报纸,期刊上刊登广告相似。

摘要

本文主要介绍在线广告系统,以及如果使用阿里云Redis方便快捷的构建大数据量,低延迟的在线广告服务。

背景

在线广告作为互联网最主要的盈利模式之一,支撑着互联网行业的发张。早期的在线广告主要是展示广告,和在报纸,期刊上刊登广告相似。通过建立个性化数据,Google推出了AdSense产品,通过AdSense的合作网站,采集到访客在这些网站的访问足迹,并利用这些数据提高其广告的相关性;以Facebook为代表的社交网络由于具备了完善的用户个性化数据,利用这些数据,网站可以将定向技术使用到展示广告,这使展示广告迎来了第二春。近年来一种新的广告业务模式–“实时竞价广告交易系统”也逐渐被网站主和广告主接受,其核心目的是让每次广告展现都创造出尽可能多的回报,以自动化的方式系统使用实时数据和竞价信息将广告空间分配给那一时刻出价最高的销售渠道。由于对实时性要求越来越高,如何构建高效的在线广告系统,成为关注的焦点。本文以阿里云Redis来阐释在线广告子系统的构建。

广告业务分类介绍

广告按业务划分有以下几类:

  • 展示广告(Banner广告)
  • 搜索广告(关键词广告

按计费模式有:

  • CPT: 按有效广告展示天数计费,可定价或竞价;
  • CPM: 按有效广告展现次数计费,可定价或竞价;
  • CPC: 按有效点击次数计费;
  • CPS: 按效果计费,如,按成交订单额,按流量带来的有效下载或安装次数计费;

广告系统按结构可划分为以下子系统:

  • 广告投送服务器
  • 广告数据库及业务系统
  • 用户行为跟踪系统
  • 日志传输系统
  • 流式数据分析和计算平台
  • 离线数据分析和计算平台

在线广告系统架构设计

首页广告在阿里云Redis上的实现

  • 使用Redis的list数据类型存放需要展示的广告ID,hash数据类型存放广告详细信息。
  • 首先使用阿里云Redis构建简单广告数据。

    $./bin/redis-cli -p 7197
    # 使用RPUSH插入一条广告ID

      127.0.0.1:7197> RPUSH  Home:Ad:List  Ad:hash:1
      (integer) 1

    # 使用HMSET插入该广告相关的信息

      127.0.0.1:7197> HMSET  Ad:hash:1  Id  12345 Title "Ad title" Pic "Ad picture url" Url "Ad url"
      OK

    # 使用RPUSH插入一条广告ID

      127.0.0.1:7197> RPUSH  Home:Ad:List  Ad:hash:2
      (integer) 1

    # 使用HMSET插入该广告相关的信息

      127.0.0.1:7197> HMSET  Ad:hash:2  Id  123456 Title "Ad2 title" Pic "Ad2 picture url" Url "Ad2 url"
      OK

    # 使用RPUSH插入一条广告ID

      127.0.0.1:7197> RPUSH  Home:Ad:List  Ad:hash:3
      (integer) 1

    # 使用HMSET插入该广告相关的信息

      127.0.0.1:7197> HMSET  Ad:hash:3  Id  1234567 Title "Ad3 title" Pic "Ad3 picture url" Url "Ad3 url"
      OK

    # 使用RPUSH插入一条广告ID

      127.0.0.1:7197> RPUSH  Home:Ad:List  Ad:hash:4
      (integer) 1

    # 使用HMSET插入该广告相关的信息

      127.0.0.1:7197> HMSET  Ad:hash:4  Id  12345678 Title "Ad4 title" Pic "Ad4 picture url" Url "Ad4 url"
      OK
            
    1. 每增加一条广告展示,在列表“Home:Ad:List”末尾使用"RPUSH"命令增加一个值(例如:ID值为4的广告,值为“Ad:hash:4”)。同时使用"HMSET"命令存储一条"hash"类型的广告数据。
    2. 每删除一条广告信息,使用"LREM"命令从列表“Home:Ad:List"中删除对应的广告ID(例如:"Ad:hash:5”),同时使用"DEL"命令删除本条广告对应的"hash"类型数据。
    3. 获取广告展示列表,先使用"LRANGE"命令从列表"Home:Ad:List"中获取广告ID集合(例如:LRANGE("Home:Ad:List", 0, 9))。循环遍历,使用"HGETALL"命令获取广告详细信息。

  • 广告的数据在Redis中的分布图为:

guanggaotupian2.png|center

使用阿里云Redis构建频次访问控制器

频次控制旨在控制某个用户接触到某创意的次数,以达到提高广告性价比的目的。一般来说,随着某个用户看到同一个创意频次的逐渐上升,点击率呈逐渐下降的趋势。因此在按照CPM采买流量时,广告主有时会要求根据频次控制某个用户接触到某次创意地次数。

  • 首先使用Redis的hash类型来构建用户,广告,频次访问限制。
  • 其次使用用户+广告id为key,来构建用户对某广告的访问频次统计。

         # HMSET userID adID reqFrequency,使用HMSET构建用户,广告和访问频次的关系
         # 127.0.0.1:7197> HMSET  12345 1 3
           OK
           
         # 初始化广告的访问频次
         # 127.0.0.1:7197> SET 12345_1  0
           OK
           
         # 设置访问频次的过期时间,该过期时间为绝对过期时间,为自然天的timestamp。
         # 127.0.0.1:7197> EXPIREAT  12345_1  1513239705
           (integer) 1
         
         # 增加广告访问频次
         # 127.0.0.1:7197> INCR  12345_1
           (integer) 1
         
         # 获取用户访问的某个广告的访问频次
         # 127.0.0.1:7197> HMGET 12345 1
           1) "3"
           

在线广告系统整体架构图

guanggaotupian4.png

下面介绍下List,Hash的使用方法

   # BLPOP key [key ...] timeout
     BLPOP是列表的阻塞式(blocking)弹出原语。
     
   # BRPOP key [key ...] timeout
     BRPOP 是列表的阻塞式(blocking)弹出原语。
     
   # BRPOPLPUSH source destination timeout
     BRPOPLPUSH 是 RPOPLPUSH 的阻塞版本,当给定列表 source 不为空时, BRPOPLPUSH 的表现和 RPOPLPUSH 一样。
     
   # LINDEX key index
     返回列表 key 中,下标为 index 的元素。
     
   # LINSERT key BEFORE|AFTER pivot value
     将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
     
   # LLEN key
     返回列表 key 的长度。
     
   # LPOP key
     移除并返回列表 key 的头元素。
     
   # LPUSH key value [value ...]
     将一个或多个值 value 插入到列表 key 的表头。
     
   # LPUSHX key value
     将值 value 插入到列表 key 的表头,当且仅当 key 存在并且是一个列表。
     
   # LRANGE key start stop
     返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。
     
   # LREM key count value
     根据参数 count 的值,移除列表中与参数 value 相等的元素。
     
   # LSET key index value
     将列表 key 下标为 index 的元素的值设置为 value。
     
   # LTRIM key start stop
     对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
     
   # RPOP key
     移除并返回列表 key 的尾元素。
     
   # RPUSH key value [value ...]
     将一个或多个值 value 插入到列表 key 的表尾(最右边)。
   
   # HMGET key field [field ...]
     返回哈希表 key 中,一个或多个给定域的值。
   
   # HMSET key field value [field value ...]
     同时将多个 field-value (域-值)对设置到哈希表 key 中。
     
   # HDEL key field [field ...]
     删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
   
   # HVALS key
     返回哈希表 key 中所有域的值。
  

总结

本文主要介绍了使用阿里云Redis构建在线广告系统模块的数据存储方式和使用方法。介绍了构建相关模块所使用的Redis命令。为了方便用户交流开源和Redis相关技术,我们也建立了Redis交流钉钉群,欢迎有兴趣的同学移步这里加入,另外也欢迎大家使用阿里云Redis服务。对于有兴趣从事云数据库内核或者管控相关工作可以移步这里,欢迎C++/JAVA/GOLANG/PYTHON等各种开发人才加盟。

相关实践学习
基于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
目录
相关文章
|
10天前
|
存储 消息中间件 缓存
Redis的高性能使得它非常适合用于实时分析场景
【5月更文挑战第15天】Redis在Python Web开发中扮演关键角色,常用于缓存系统,提高数据读取速度;会话管理,存储用户信息;分布式锁,确保数据一致性;排行榜和计数,利用有序集合和哈希结构;消息队列,基于列表结构实现异步处理;实时分析,高效处理实时数据。其丰富的数据结构和高性能使其在多种场景下应用广泛。
285 3
|
10天前
|
弹性计算 自然语言处理 开发工具
基于阿里云向量检索 Milvus 版和 LangChain 快速构建 LLM 问答系统
本文介绍如何通过整合阿里云Milvus、阿里云DashScope Embedding模型与阿里云PAI(EAS)模型服务,构建一个由LLM(大型语言模型)驱动的问题解答应用,并着重演示了如何搭建基于这些技术的RAG对话系统。
|
1天前
|
人工智能 弹性计算 监控
【阿里云云原生专栏】阿里云云原生与AI结合:智能应用的快速构建与部署
【5月更文挑战第24天】阿里云融合云原生和AI技术,助力快速构建智能应用。弹性伸缩、CI/CD、微服务和自动化运维带来优势。通过需求分析、环境准备、数据处理、模型开发到服务部署,阿里云提供容器服务、函数计算、服务网格等工具,支持自动化测试和监控,实现一站式智能应用开发。示例代码展示创建ACK集群和部署AI模型服务过程。
223 1
|
1天前
|
弹性计算 监控 安全
【阿里云弹性计算】ECS实例监控与告警系统构建:利用阿里云监控服务保障稳定性
【5月更文挑战第23天】在数字化时代,阿里云弹性计算服务(ECS)为业务连续性提供保障。通过阿里云监控服务,用户可实时监控ECS实例的CPU、内存、磁盘I/O和网络流量等指标。启用监控,创建自定义视图集中显示关键指标,并设置告警规则(如CPU使用率超80%),结合多种通知方式确保及时响应。定期维护和优化告警策略,利用健康诊断工具,能提升服务高可用性和稳定性,确保云服务的卓越性能。
8 1
|
4天前
|
弹性计算 关系型数据库 MySQL
【阿里云弹性计算】从零搭建:基于阿里云ECS的高性能Web服务部署实践
【5月更文挑战第21天】本文介绍了如何使用阿里云ECS搭建高性能Web服务。首先,注册阿里云账号购买ECS实例,选择合适配置。接着,通过SSH连接实例,更新系统并安装Apache、PHP和MySQL。创建网站目录,上传代码,配置数据库和PHP。然后,启用Gzip压缩和KeepAlive,调整Apache并发连接数以优化性能。此教程为在阿里云上构建高效Web服务提供了基础指南。
97 5
|
4天前
|
Cloud Native Java 关系型数据库
【阿里云云原生专栏】构建云原生应用:基于Spring Boot与阿里云服务的全栈指南
【5月更文挑战第21天】构建云原生应用是企业数字化转型的关键,本文提供了一份基于Spring Boot和阿里云的全栈指南。涵盖从阿里云账号注册、ECS与Docker搭建,到Spring Boot项目创建、业务代码编写和部署。此外,还介绍了如何集成阿里云OSS存储、RDS数据库服务以及ACK容器服务,助力打造高效、可扩展和易管理的云原生应用。
112 3
|
4天前
|
安全 小程序 网络安全
阿里云腾讯云免费SSL证书托管系统的开发初衷
由于Google等公司推动,互联网安全趋势将SSL证书期限统一缩短至3个月,阿里云和腾讯云相继跟进。对于管理多个站点的小公司而言,手动维护变得繁琐。为自动化此过程,作者探索使用API解决方案。通过研究腾讯云API,成功实现证书的自动创建、审核和下载。为应对无免费到期提醒服务,作者创建计划任务,在证书到期前7天发送提醒,初期采用短信提醒,并增设公众号模板消息作为备选方案,完成到期提醒系统的构建。接下来的文章将讨论SSL证书的申请和下载流程。
29 2
|
10天前
|
存储 缓存 监控
利用Redis构建高性能的缓存系统
在现今高负载、高并发的互联网应用中,缓存系统的重要性不言而喻。Redis,作为一款开源的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息代理。本文将深入探讨Redis的核心特性,以及如何利用Redis构建高性能的缓存系统,并通过实际案例展示Redis在提升系统性能方面的巨大潜力。
|
10天前
|
安全 Devops 测试技术
深入了解阿里云云效DevOps:构建高效软件开发实践
阿里云云效DevOps,集成CI/CD与自动化测试,提升开发效率。支持持续集成确保代码质量,自动化测试加速交付,多环境及灰度发布保障安全可靠性。助团队构建高效开发实践,增强竞争力。
31 1
|
10天前
|
存储 人工智能 自然语言处理
基于阿里云向量检索 Milvus 版与 PAI 搭建高效的检索增强生成(RAG)系统
阿里云向量检索 Milvus 版现已无缝集成于阿里云 PAI 平台,一站式赋能用户构建高性能的检索增强生成(RAG)系统。您可以利用 Milvus 作为向量数据的实时存储与检索核心,高效结合 PAI 和 LangChain 技术栈,实现从理论到实践的快速转化,搭建起功能强大的 RAG 解决方案。
基于阿里云向量检索 Milvus 版与 PAI 搭建高效的检索增强生成(RAG)系统

热门文章

最新文章