基于分数的PHP内存缓存

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了基于分数的PHP内存缓存脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试制作基于分数的 PHP内存缓存,但我的性能有问题(如何计算分数和删除低分记录).

目标

我有大约1000万条记录.
我想只在内存中缓存0.1%的最常见记录,而不是在光盘上.

我想设置10,000个缓存插槽(0.1%),我想只保留这些插槽中最常用的插槽.

尝试/问题

我尝试了基于文件的缓存,它非常慢.

我尝试过MysqL和Postgresql,但它的计算成绩和删除低分记录的性能成本太高.

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

找到了redis,但似乎没有任何得分或类似的东西.

我的问题:

应该使用什么缓存方法进行基于分数的缓存?

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

Fastest PHP memory cache/hashtable

In-memory cache with LRU expiration

In-memory cache architecture/technology?

@L_403_4@

解决方法

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

快速总结一下,
你可以使用“allkeys-lru”驱逐政策,并将“maXMemory”设置为你想要的东西.一旦达到内存限制,redis将释放最近最少使用的项目,并将内存使用量保持在“maxmemory”下.

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

如果你想亲自跟踪分数,并且已经为你的项目设置了某种评分机制,你可以使用Redis,你可以将一个SortedSet与一个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内存缓存所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。