【问题标题】:Redis on Windows for Session State performance & protobufWindows 上的 Redis 用于会话状态性能和 protobuf
【发布时间】:2015-06-21 23:58:37
【问题描述】:

我目前正在通过 stackexchange.redis (1.0.4) 和 windows RedisSessionStateProvider (1.6.2) 提供程序成功使用 Windows 端口的 Redis (2.8.19 - MS Open Tech) 来存储本地会话。

将此配置与会话的 InProc 会话状态进行比较,我们注意到在高负载下性能下降了约 20%。为了减少性能差距,我想知道使用 protobuf-net 序列化会话是否可以提供帮助 - 模型具有必要的 proto 属性,但不完全确定如何配置 sessionStateProvider 以使用它进行序列化。

有人搞定这个吗?性能提高了吗?

此外,如果有任何其他建议可以缩小性能差距,那也很好。

编辑:这里是应用程序的会话键/大小(测量方法与此方法类似:How to find out size of session in ASP.NET from web application?

session key1 size: 38kB
session key2 size: 30kB
session key3 size: 37kB
session key4 size: 35kB
session key5 size: 35kB
session key6 size: 43kB
session key7 size: 33kB
session key8 size: 28kB
session key9 size: 42kB
session key10 size: 31kB
**TOTAL SESSION SIZE: 352kB**

提前谢谢你。

【问题讨论】:

    标签: .net redis session-state protobuf-net stackexchange.redis


    【解决方案1】:

    进程外存储比进程内存储要慢是正常且预期的:根据定义,进程内无事可做,而您现在需要构造命令,遍历 TCP,让服务器软件做它的事情,遍历 TCP 回到调用者,处理响应,反序列化。有很多东西!

    回答序列化问题很棘手,因为性能特征在很大程度上取决于您的模型。这里有 4 种利息成本:

    • 序列化 CPU
    • 负载大小(直接影响网络带宽)
    • 网络延迟
    • 反序列化 CPU

    如果现有提供程序使用BinaryFormatter,我不会感到惊讶,在这种情况下,使用不同的序列化程序(例如 protobuf-net)确实可能会降低 CPU 和带宽数量。如果主要因素是延迟:您将无能为力。

    顺便说一句:对于我们的一些内部使用,我们实际上使用了 protobuf-net 和 GZipStream:我们发现由于我们的数据往往包含相当多的文本,gzip 减少的带宽超过了额外的 CPU序列化/反序列化。

    但最重要的问题是:您的会话中有多少数据?

    为您的特定用途获得有意义的答案的唯一方法是:对其进行衡量。

    【讨论】:

    • 谢谢 Marc,我当然知道/理解,考虑到您提到的因素,进程外存储不能像 inProc 一样快 - 并不意味着 redis/providers 效率低下任何手段。我在上面的问题中添加了会话密钥的大小 - 如果有更多信息有帮助(例如实际模型),请告诉我 - 感谢您的帮助!
    • @Mikalee 在这种大小、带宽和(反)序列化方面都非常重要,所以我建议绝对值得尝试 protobuf-net;大多数会话提供者都知道通过byte[] 无需开销,所以通过MemoryStream 得到它
    • 谢谢你,如果你有时间,如果你有任何关于如何去做的指示,那就太好了,我不知道从哪里开始。再次感谢
    猜你喜欢
    • 2014-01-29
    • 2015-01-14
    • 2014-12-24
    • 1970-01-01
    • 2011-08-23
    • 2019-11-01
    • 2020-12-04
    • 2017-01-04
    • 2010-11-29
    相关资源
    最近更新 更多