42

我目前正在开发一个由 Redis 使用 Booksleeve 支持的 ASP.NET SessionState 自定义提供程序。Redis 似乎非常适合 SessionState(如果您必须使用它),因为:

  • Redis 可以像 RDBMS 一样持久存储,但速度要快得多。
  • Key/Value 数据存储更适合 SessionState 的接口。
  • 由于数据没有存储在进程中(如默认的 Session 提供程序),SessionState 可以在 Web 服务器重启、崩溃等情况下存活。
  • 如果需要,Redis 很容易水平分片。

所以,我想知道这是否对任何人有用,因为我们(我的公司)正在考虑在 GitHub 上开源它。想法?

更新:


我昨天确实发布了这个的第一个版本:https ://github.com/angieslist/AL-Redis/blob/master/AngiesList.Redis/RedisSessionStateStore.cs

4

2 回答 2

16

我创建了一个基于 Redis 的程序SessionStateStoreProvider可以在 GitHub 上找到,使用ServiceStatck.Redis它作为客户端(而不是 Booksleeve)。

它可以通过 NuGet 与Install-Package Harbour.RedisSessionStateStore.

我发现@NathanD 的方法有一些怪癖。在我的实现中,锁会话值一起存储,而不是存储在单独的键中(较少往返 Redis)。此外,因为它使用ServiceStack.Redis,它可以使用池连接。

最后,它被测试了。这是我对@NathanD 方法的最大反感。如果不手动运行每个用例,就无法真正知道它是否有效。

于 2012-06-11T11:41:25.287 回答
3

它不仅有用,而且我强烈认为如果您打算走这条路,请仔细查看 Redis 的 Hash 数据类型。在我们的应用程序中,会话基本上是键和值的小集合(即{user_id: 7, default_timezone: 'America/Chicago', ...}:),整个用户会话存储在单个 Redis 哈希中。

如果会话数据相似,使用 Hash 不仅可以简化数据映射,而且 Redis 使用这种方法可以更有效地使用空间。

我们的应用程序是用 ruby​​ 编写的,但您可能仍然会从我们编写的内容中找到一些用处。

于 2011-11-10T21:25:32.597 回答