gpt4 book ai didi

caching - 如何使用redis缓存更新页面计数器?

转载 作者:可可西里 更新时间:2023-11-01 11:12:20 24 4
gpt4 key购买 nike

为了提高我的应用程序的性能,我想尽可能避免访问数据库。因此,要更新页面访问计数器,我想使用 redis 缓存并且它能够使键过期。

有数千个页面,每个页面每秒可以访问几次。

这是我想到的伪代码:

- Define key: `pagetimer:<id>` as timer, which expires after 10 minutes 
- Define key: `page:<id>:<visits>` as the page.visits counter
- After each page visit, If `pagetimer:<id>` exits:
page:<id>:<visits>++
else:
//`pagetimer:<id>` has expired so:
flush page:<id>:<visits> value to database's page.visits
define new pagetimer:<id>`
set page:<id>:<visits> to the value obtained from database's page.visits
page:<id>:<visits> ++

我想知道这种策略的缺陷是什么?对此是否有更好的解决方案?

最佳答案

what could be the flaws of such strategy

它有以下缺陷:

  • 您的代码不是原子的,它有竞争条件。因此,您可能会丢失一些访问次数,并且访问数据库的次数可能超出您的预期。

  • 如果您尝试使代码原子化,例如使用事务或 Lua 脚本,你会遇到性能问题:当你读取或写入数据库时​​,它会阻塞 Redis。

  • 如果在计时器过期后页面从未被访问过,则计数器不会刷新到数据库。

whether there is a better solution for this

是的,有。但是,它要复杂得多,需要解决上述问题。我会给你一些点击。

  • 您需要为每个页面设置多个计数器,例如每 10 分钟或每 1000 个计数创建一个新计数器。

  • 您需要在另一个线程或进程中更新数据库。

关于caching - 如何使用redis缓存更新页面计数器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57728017/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com