基于分数的PHP内存缓存
我正在尝试制作基于分数的
PHP内存缓存,但我的性能有问题(如何计算分数和删除低分记录).
目标 我有大约1000万条记录. 我想设置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 要快速总结一下, 另一种选择是使用“memcached”,它是一个内存键值存储,默认情况下配置为LRU缓存. 如果你想亲自跟踪分数,并且已经为你的项目设置了某种评分机制,你可以使用Redis,你可以将一个SortedSet与一个Hash一起保存以对你的缓存项进行排名. 哈希会保留您的缓存数据,而SortedSet会保持您的项目排名. 你需要这些SortedSet命令: >您可以使用“ZADD”添加和更改项目分数 每次插入后,您都必须手动检查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" (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |