stackexchange redis缓存性能

时间:2017-03-11 04:25:00

标签: c# performance redis stackexchange.redis

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

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

  1. 使用事务 - 这将阻止服务器端的任何操作。所以这不应该是正确的解决方案
  2. 使用批处理 - 这将阻止客户端的任何操作,直到所有批处理操作完成。这不应该是正确的解决方案。
  3. 使用流水线技术 - 这不会阻止客户端和服务器端的任何操作。但它可以发送多个请求(小于N的数据包)可能消耗更多的网络但可能会增加客户端的内存消耗,这可能会导致延迟。
  4. 使用fire and forget - 这也不会阻止客户端和服务器端的任何操作。但是它会发送多个请求(比流水线更多的数据包),这可能会消耗更多的网络带宽,但客户端没有内存消耗。
  5. 哪个应该是最好的方法? 我假设竞争操作意味着2个插入,并且一个get和insert不能一起使用,尽管它们可能正在访问不同的键。我在这方面是否正确,否则是什么意思?

2 个答案:

答案 0 :(得分:0)

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

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

除非您希望在应用程序层出现问题时损坏数据,否则无法避免Redis MULTI。实际上,如果您想避免向Redis发出许多请求,则应使用Lua scripts代替。

另一方面,Redis的目的是尝试进行许多操作,但要确保这些操作尽可能小,因为Redis是单线程的。没错,除非你执行一个花费太多时间的操作,否则速度非常快。

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

最后,我会看看这个Redis教程:Redis latency problems troubleshooting

答案 1 :(得分:0)

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

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