gpt4 book ai didi

php - 基于分数的 PHP 内存缓存

转载 作者:可可西里 更新时间:2023-10-31 23:39:08 27 4
gpt4 key购买 nike

我正在尝试制作基于分数的 PHP 内存缓存,但我遇到了性能问题(如何计算分数和删除低分记录)。

目标

我有大约 1000 万条记录。而且我只想在内存中缓存最频繁记录的 0.1%,而不是在磁盘上。

我想设置 10,000 个缓存槽 (0.1%),并且我想只保留这些槽中最常访问的槽。

尝试/问题

我试过基于文件的缓存,但速度很慢。

我试过MySQL和PostgreSQL,但是统计分数和删除低分记录的性能开销太大。

我试过基于时间的缓存,例如。 xcache,但是由于我的项目数据太多,写的太多了。删除最低分数记录和列出所有缓存槽也存在问题,因为它是“key->value”。

我找到了Redis,但是好像没有score之类的东西。

我的问题:

对于基于分数的缓存,我应该使用什么缓存方法?

请注意,所有这些帖子都很相似,但不包含任何可用的答案:

Fastest PHP memory cache/hashtable

In-memory cache with LRU expiration

In-memory cache architecture/technology?

Need a php caching recommendation

最佳答案

听起来 LRU 缓存应该可以满足您的需求。您可以像 LRU 缓存一样配置 Redis。可能它会很好地处理你的情况。以下是 redis 文档的一些引用:http://redis.io/topics/lru-cache

为了快速总结,您可以使用“allkeys-lru”驱逐策略,并将“maxmemory”设置为您喜欢的值。一旦达到内存限制,redis 将释放最近最少使用的项目并将内存使用量保持在“maxmemory”以下。

另一种选择是使用“memcached”,它是一个内存中的键值存储,默认情况下配置为 LRU 缓存。

如果你真的想自己跟踪分数,并且已经为你的项目设置了某种评分机制,你可以使用 Redis,你可以将 SortedSet 和 Hash 放在一起来对你的缓存项目进行排序。

Hash 将保留您的缓存数据,而 SortedSet 将保留您的项目排名。

您需要这些 SortedSet 命令:

  • 您可以使用“ZADD”添加和更改项目分数
  • 您还可以使用“ZINCRBY”来更改项目分数。
  • 您可以使用“ZCARD”命令来获取排序集的总数。
  • 您可以使用 ZRANGE 获取得分最低的项目。
  • 并且您可以使用 ZREM 删除项目。

每次插入后,您必须手动检查 SortedSet 的计数并限制缓存中的项目数。总的来说,算法是这样的:

缓存插入:

HSET "cacheKey" "itemName" "itemValue"
ZADD "rankingKey" "itemScore" "itemName"
count = ZCARD "rankingKey"
if (count > limit)
lowestRankedItem = ZRANGE "rankingKey" 0 0
ZREM "rankingKey" lowestRankedItem
HDEL "cacheKey" lowestRankedItem

查找将是:

itemValue = HGET "cacheKey" "itemName"

关于php - 基于分数的 PHP 内存缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31729359/

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