【发布时间】:2016-01-11 17:02:12
【问题描述】:
我有一个相当复杂的 asp.net 站点,它可以即时构建页面(我想像 WordPress)。它在很大程度上依赖于缓存来保持美观和活泼(0.5 秒的响应时间)。
我最近自己承担了对应用程序进行负载平衡的任务,这样做需要将缓存放入分布式环境中(我已经在使用 SQL Server 会话状态)。所以我做了研究,选择了 redis,并选择了 StackExchange.Redis 客户端。
我使我的对象非常简单,使用“type_dbIndex”键命名约定的小对象,然后使用集合链接所有具有关系的对象。我委托了一个专门用于 redis 的 Ubuntu 盒子,并且非常兴奋地打开了开关。不幸的是,我被严重压垮了。事实证明,我的 redis 缓存平均比内存缓存慢 3 倍(1.5 秒)。
现在我要第一个承认我不是 redis 专家,只是基本的安装和设置,但我也没有时间成为 redis 调优大师来尝试从中挤出一秒。我可以想象真正的罪魁祸首是网络延迟。每个请求平均从缓存中加载大约 100-200 个对象,所有这些对象都需要序列化/反序列化并通过网络推送(服务器位于使用本地网络的同一 DMZ 中)。
所以对于我的问题,我得到的结果是否异常糟糕,还是这是常态?我需要为我的所有对象编写自定义序列化程序吗?我应该使用 ProtoBuf 而不是标准序列化程序。我是否需要在两台机器之间创建一个内部网络(专用网卡,就像我们过去在 SQL 和 Web Server 之间所做的那样)?基本上,有没有希望达到黄金半秒标记,因为管理负载平衡服务器之间的进程内内存缓存是一场噩梦,以至于完全不切实际。我是否错误地使用了缓存?
感谢任何建议/帮助/战争故事。
编辑:我想我会在此处粘贴一个 miniprofiler 输出,以便您进一步了解我的难题...
【问题讨论】:
-
应用和 Redis 服务器之间的平均网络延迟是多少?缓存对象的平均大小是多少?
-
@ItamarHaber - 不幸的是我不知道实际的网络延迟。 (告诉我如何测量,我会测量),但缓存中的对象相对较小,可能 20 个属性都是简单类型(没有列表等)
-
如您所见,我对一个简单的按键调用 Get 的响应时间平均为 100 毫秒...我希望低于 10 毫秒
-
尝试 ping 你的 Redis 服务器,或者更好地使用 redis-cli --latency
标签: c# asp.net caching redis stackexchange.redis