脚本宝典收集整理的这篇文章主要介绍了基于分数的PHP内存缓存,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
目标
我有大约1000万条记录.
我想只在内存中缓存0.1%的最常见记录,而不是在光盘上.
我想设置10,000个缓存插槽(0.1%),我想只保留这些插槽中最常用的插槽.
尝试/问题
我尝试了基于文件的缓存,它非常慢.
我尝试过MysqL和Postgresql,但它的计算成绩和删除低分记录的性能成本太高.
我试过基于时间的缓存,例如. xcache,但是因为我的项目中的数据太多,所以写得太多了.此外,删除最低分记录并列出所有缓存槽也存在问题,因为它是“key-> value”.
我的问题:
请注意,所有这些帖子都相似,但不包含任何可用的答案:
Fastest PHP memory cache/hashtable
In-memory cache with LRU expiration
In-memory cache architecture/technology?
@L_403_4@
要快速总结一下,
你可以使用“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,请注明来意。