繁体   English   中英

stackexchange redis缓存性能

[英]stackexchange redis cache performance

我必须使用stackexhange.redis C#经常在redis缓存中添加N(独立)项目,每个C#都有不同的到期时间,这样客户端的最小时间和服务器端的最小阻塞和成本。 Redis服务器每秒会收到数百个获取请求,所以我根本不想弄乱获取时间。

我在这里阅读了文档并 这里回答。 我找不到执行此操作的单个方法。 考虑不同的选择:

  1. 使用事务 - 这将阻止服务器端的任何操作。 所以这不应该是正确的解决方案
  2. 使用批处理 - 这将阻止客户端的任何操作,直到所有批处理操作完成。 这不应该是正确的解决方案。
  3. 使用流水线技术 - 这不会阻止客户端和服务器端的任何操作。 但它可以发送多个请求(小于N的数据包)可能消耗更多网络,但可能会增加客户端的内存消耗,这可能会导致延迟。
  4. 使用fire和forget - 这也不会阻止客户端和服务器端的任何操作。 但它会发送多个请求(比流水线更多的数据包),这可能会消耗更多的网络带宽,但客户端没有内存消耗。

哪个应该是最好的方法? 我假设竞争操作意味着2个插入,并且一个get和insert不能一起使用,尽管它们可能正在访问不同的键。 我在这方面是否正确,否则是什么意思?

Redis在数据库上读取或写入时是单线程的。

您的案例中最好的解决方案是什么? 谁知道,它可能取决于很多变量,每个用例都应该单独分析以实现正确的解决方案。

Redis MULTI无法避免,除非您想在应用程序层出现问题时破坏您的数据。 实际上,如果你想避免对Redis的许多请求,你应该使用Lua脚本

另一方面,Redis的目的是尝试进行许多操作,但由于Redis的单线程特性,确保它们尽可能小。 是的,它非常快,除非你执行一个花费太多时间的操作。

总而言之,我不会太担心将许多请求作为内存数据库发送并在光速下工作。 此外,考虑Redis Cluster (即分片 )的奇迹,以便能够优化您的场景。

最后,我将看看这个Redis教程: Redis延迟问题故障排除

您应该添加到选项列表Lua脚本。 EVAL

另外,请考虑您将使用的数据结构。 例如,您可以使用MSET通过一跳在Redis中发送多个值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM