加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

基于分数的PHP内存缓存

发布时间:2020-12-13 15:57:32 所属栏目:PHP教程 来源:网络整理
导读:我正在尝试制作基于分数的 PHP内存缓存,但我的性能有问题(如何计算分数和删除低分记录). 目标 我有大约1000万条记录. 我想只在内存中缓存0.1%的最常见记录,而不是在光盘上. 我想设置10,000个缓存插槽(0.1%),我想只保留这些插槽中最常用的插槽. 尝试/问题
我正在尝试制作基于分数的 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?

Need a php caching recommendation

解决方法

听起来像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"

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读