目录
需求描述
需求分析
提取关键词
数据库分析
思考
具体实现
第1步、项目启动时先把页面广告配置信息存入Redis
第2步、给前端写接口查询页面广告
第3步、刷新加载
进一步优化
首页 数据库 Redis redis怎么实现页面实时更新自动上线

redis怎么实现页面实时更新自动上线

Jun 03, 2023 pm 08:56 PM
redis

需求描述

某些页面需要配置广告或活动宣传图,广告或活动需满足随时上下线、过期自动下线及到时自动上线。

如:现在时间2019-2-22 16:16:13,要在支付完成页面配置领奖活动,活动要在2019-3-10 00:00:00准时上线,在2019-3-30 23:59:59结束活动。

因此,期望实现的效果是在活动上线前的任何时间配置完活动后,页面会在指定时间自动上线该活动。也可能会是其他的多个活动或广告,每个页面广告的个数可变,不同上下线时间可不同,其他页面也需要实现这样的功能,页面与页面之间的活动不一定一样。

需求分析

需求简单的几句话,那么我们来具体的分析一下。

提取关键词

  • 广告或活动宣传图

  • 随时上下线、过期自动下线及到时自动上线

  • 每个页面广告的个数可变

  • 不同广告上下线时间可不同

  • 页面与页面之间的活动不一定一样

数据库分析

1、【广告或活动宣传图】

要为不同页面设置不同的广告,有的页面广告可能一样,也就是广告会复用,所有要有广告表。

2、【每个页面广告的个数可变】【不同广告上下线时间可不同】【页面与页面之间的活动不一定一样】

页面可配置多个广告,所有要有页面配置表,以及广告和页面的关系表,即页面广告表。

页面配置表主要配置页面的广告个数,实现【每个页面广告的个数可变】,页面广告表主要配置页面的每个广告上下线时间,实现【不同广告上下线时间可不同】

根据简单的分析,我得出以下表格构造:广告表(adv),页面配置表(page_config)和页面广告表(page_adv)

redis怎么实现页面实时更新自动上线

思考

这些页面配置的广告在一段时间内是不会变的,如果页面请求次数较多,广告查询次数就会很频繁,对数据库造成不必要的压力。所以可以引入缓存,降低数据库请求次数,缓解数据库压力。这里使用的Redis。

何时入缓存?

可以选择在服务启动时异步把已在上下线时间区间内的广告先加载至缓存,或选择在请求时取缓存,缓存内没有时再查库然后放缓存。缓存时间视情况而定。

这里选择的是,项目启动时异步把符合条件的页面广告配置信息存入Redis,那些还没到指定时间的先不放Redis,等到访问页面加载广告时,先查Redis,若无则按条件(>=nowtime)查库,查到后存Redis。

在接口中拿到广告配置信息后,判断当前时间是否在配置的时间区间内,由于一个页面配置多个广告,不同广告时间也不同,所以要迭代,把符合的返回,有过期的就做标记,然后把整个页面的配置信息在Redis里删除。(或者不选择在启动时加载,就在用户请求时加入缓存,但是下面的第1步的方法在刷新加载时会用到,故不能删)

具体实现

第1步、项目启动时先把页面广告配置信息存入Redis

a、查询所有pageId

SELECT pageId FROM page_config page_adv WHERE nowtime<=endtime AND GROUP BY pageId
登录后复制

两个表内连接,得List,得到的都是配置的有广告的并且广告还没过期的pageId。

b、查询pegeId对应的广告图片及跳转链接

SELECT 字段名 FROM page_adv adv WHERE begintime<=nowtime<=endtime AND pageId={#pageId}
登录后复制

然后把查到的配置信息List(为空时不做操作),以pageId为KEY放入缓存。

第2步、给前端写接口查询页面广告

按标准的控制层,业务层,数据访问层写,第一步中的逻辑就是在业务层完成的。

控制层:

控制层接参pageId,调用业务层查询对应页面配置的广告信息,判空,直接返回状态码0,即无广告前端不展示。

不为空就根据业务逻辑处理数据(如img的URL加域名),然后返回状态码1,前端展示广告。这里控制层还可以加逻辑,迭代广告list,把当前时间在广告起始时间内的返回,不在的不返回,并且只要有一个广告过期,就把这个页面的广告list缓存清掉。这个逻辑是把过期的清掉。

业务层:

先取缓存,没有再查库判断不为空(本页面配置的有广告),放入缓存(pageId为KEY),然后返回。

数据访问层:

SQL:

SELECT 字段名 FROM page_config adv page_adv WHERE begintime<=nowtime<=endtime AND pageId=#{pageId}
登录后复制

三表联查,根据pageId查询当前页面配置的广告活动信息(已在广告活动时间内)

第3步、刷新加载

为什么使用刷新加载?

因为有这样的场景:给页面A配置了一个广告(当前时间在广告的起始时间内),那么这个页面的广告已经在缓存里了,假如此时A页面要新加一个广告,在后台配置后如果不做其他操作,这个广告不会显示(假设缓存时间较长,为一天),因为库更新了,缓存没有同步更新。

解决方案

使用Redis的发布订阅机制实现缓存的刷新加载,使新配置的广告及时能够显示。刷新加载的回调方法即第1步中的方法。

进一步优化

想一想,目前的实现存在什么问题?

存在的问题

假如有页面需要配置广告,但是还没有配(前端已经开发完上线,每次都会调接口查广告信息),那么数据库肯定查不到,缓存也没有。如果这个页面访问量很大,那么缓存没命中就查库,这样对库的压力就会很大,这就是缓存穿透,请求上来了很容易击垮数据库。那怎么办呢?

解决方案

当页面没有配置广告时,在缓存存标志,查询时先看标志,在决定是否往下走。

具体方案

这时,上面的第1步就要改了。

1、首先改第1步的步骤a的SQL,把所有的pageId都查询出来。

使用左连接

SELECT pageId FROM page_config LEFT JOIN page_adv ON ...  GROUP BY pageId
登录后复制

或者干脆查page_config

SELECT pageId FROM page_config
登录后复制

目的是把已在page_config表中配置,但关系表中page_adv未配置广告的pageId也查出来,这样才能给未配置广告的pageId在缓存里放标志

2、第1步的步骤b的SQL改为

SELECT 字段名 FROM page_adv adv WHERE nowtime<=endtime AND pageId={#pageId}
登录后复制

然后把查到的配置信息放入缓存之前判断【为空时的不做操作】改为【为空时存入一个标志】假如这个标志KEY为pageId+"_EMPTY_FLAG",value为"DB_IS_NULL"

为什么只判断小于结束时间

因为如果该页面配置的广告开始时间大于当前时间,那么这个是查不到的,会被处理为DATABASE_IS_NULL,如果在这个标志还没失效之前就到了配置的开始时间了,那么这个广告不会被展示。所有要让未到开始时间的也放入缓存,然后让控制层去判断在不在时间区间。

3、所以要在第2步也修改一下

在业务层里取缓存中的广告列表之前,先从缓存取pageId+"EMPTY_FLAG"的value判断为"DB_IS_NULL"直接返回空,这样就能避免缓存穿透的问题了。

继续修改第2步的业务层,查库的SQL同样要改:

SELECT 字段名 FROM page_config adv page_adv WHERE nowtime<=endtime AND pageId=#{pageId}
登录后复制

然后判断为空的话,同上面的黄字那样处理。

4、最后,第3步的刷新加载调的是第1步的方法,不用改。

当然这个缓存穿透的优化方案只是其中一种。还可以这样:

1、控制层拦截:根据pageId查询page_adv表,查不到说明没配置,直接返回。

2、page_config 表增加字段,表示当前页面已经配置的广告个数,默认0,每配置一个该字段加1,把大于0的pageId缓存起来,调接口时前判断在不在缓存里。

以上是redis怎么实现页面实时更新自动上线的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Windows11安装10.0.22000.100跳出0x80242008错误解决办法 Windows11安装10.0.22000.100跳出0x80242008错误解决办法 May 08, 2024 pm 03:50 PM

1、启动【开始】菜单,输入【cmd】,右键点击【命令提示符】,选择以【管理员身份】运行。2、依次输入下面命令(可小心复制贴上):SCconfigwuauservstart=auto,按回车SCconfigbitsstart=auto,按回车SCconfigcryptsvcstart=auto,按回车SCconfigtrustedinstallerstart=auto,按回车SCconfigwuauservtype=share,按回车netstopwuauserv,按回车netstopcryptS

剖析 PHP 函数瓶颈,提升执行效率 剖析 PHP 函数瓶颈,提升执行效率 Apr 23, 2024 pm 03:42 PM

PHP函数瓶颈导致性能低下,通过以下步骤解决:定位瓶颈函数,使用性能分析工具。缓存结果以减少重新计算。并行处理任务,提高执行效率。优化字符串连接,使用内建函数替代。利用内建函数代替自定义函数。

Golang API缓存策略与优化 Golang API缓存策略与优化 May 07, 2024 pm 02:12 PM

GolangAPI中的缓存策略可提升性能和减轻服务器负载,常用策略有:LRU、LFU、FIFO和TTL。优化技巧包括:选择合适的缓存存储、分级缓存、失效管理以及进行监控和调整。实操案例中,使用LRU缓存优化从数据库获取用户信息的API,可从缓存中快速检索数据,否则从数据库中获取后再更新缓存。

PHP开发中的缓存机制与应用实战 PHP开发中的缓存机制与应用实战 May 09, 2024 pm 01:30 PM

在PHP开发中,缓存机制通过将经常访问的数据临时存储在内存或磁盘中来提升性能,从而减少数据库访问次数。缓存类型主要包括内存、文件和数据库缓存。PHP中可以使用内置函数或第三方库实现缓存,如cache_get()和Memcache。常见的实战应用包括缓存数据库查询结果以优化查询性能,以及缓存页面输出以加快渲染速度。缓存机制有效改善网站响应速度,提升用户体验并降低服务器负载。

PHP数组分页中如何使用Redis缓存? PHP数组分页中如何使用Redis缓存? May 01, 2024 am 10:48 AM

使用Redis缓存可以大幅优化PHP数组分页的性能。可通过以下步骤实现:安装Redis客户端。连接到Redis服务器。创建缓存数据,将每页数据存储到Redis哈希中,密钥为"page:{page_number}"。从缓存中获取数据,避免对大型数组进行昂贵的操作。

Win11英文21996怎么升级到简体中文22000_Win11英文21996升级到简体中文22000的方法 Win11英文21996怎么升级到简体中文22000_Win11英文21996升级到简体中文22000的方法 May 08, 2024 pm 05:10 PM

首先你需要将系统语言设置为简体中文显示并重启。当然,之前已经改为简体中文显示语言的直接跳过这一步即可。下面开始操作注册表,regedit.exe,左侧导航栏或上方地址栏直接定位到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlNlsLanguage,然后将其中的InstallLanguage键值、Default键值全部修改为0804(如果想改为英文的en-us,需要先将系统显示语言设置为en-us,重启系统再全部修改为0409)进行到这里必须重启系

navicat能连接redis吗 navicat能连接redis吗 Apr 23, 2024 pm 05:12 PM

是的,Navicat 可以连接 Redis,它允许用户管理键、查看值、执行命令、监视活动和诊断问题。要连接 Redis,请在 Navicat 中选择“Redis”连接类型,并输入服务器详细信息。

Win11下载的更新文件怎么找_Win11下载的更新文件位置分享 Win11下载的更新文件怎么找_Win11下载的更新文件位置分享 May 08, 2024 am 10:34 AM

1、首先双击打开桌面上的【此电脑】图标。2、接着双击鼠标左键进入【c盘】,系统文件一般都会自动存放在c盘。3、然后再c盘中找到【windows】文件夹,同样双击进入。4、进入【windows】文件夹后,找到其中的【SoftwareDistribution】文件夹。5、进入之后再找到【download】文件夹,里面存放的就是所有的win11下载更新文件了。6、如果我们想要删除这些文件的话,直接在这个文件夹中将他们删除就可以了。

See all articles