【问题标题】:Get a list of active session from RedisSessionStateProvider从 RedisSessionStateProvider 获取活动会话列表
【发布时间】:2016-10-29 04:16:08
【问题描述】:

在我的 Azure ASP.NET MVC 网站中,我想显示有多少客户端连接到 Redis 会话状态提供程序以及它们处于活动状态的时间。我使用 Azure Github 上的 aspnet-redis-providers 库。

在 Redis 中,它会创建一个 {[app_name]_[sessionkey}_Internal 键,其中的 SessionTimeout 键具有配置的会话超时值。该密钥的 EXPIRE 设置为该时间,当您检查密钥的 TTL 时,您会看到会话访问。

如何使用会话状态提供程序库来访问这些信息?如果这不可能,我可以使用任何其他库来安全地查询此信息,而不会干扰会话状态提供程序吗?

【问题讨论】:

  • 获取所有密钥就足够了吗?我的意思是它可能无法为您提供使用的客户端的确切数量。(一个客户端可以存储许多键值对)
  • 我是这么认为的,但是如果您可以访问密钥,您也可以获得我猜的值。它更多地与会话状态提供者已经与锁定等建立了开放连接,我想重用它来做我的查询
  • 它是一个键值存储。我不确定是否会有可以锁定的各种实时连接。如果客户端拥有连接到 redis 缓存的凭据,他们总是可以使用它。

标签: c# asp.net-mvc session azure redis


【解决方案1】:

这是我能够做到的。我创建了自己的会话对象集合并获取了所有键(我将其放入 DB 1),然后循环遍历所有键并获取 TTL。

using StackExchange.Redis;
using StackExchange.Redis.Extensions.Newtonsoft;
using StackExchange.Redis.Extensions.Core;
using System.Linq;

    private static Lazy<ConnectionMultiplexer> conn = new Lazy<ConnectionMultiplexer>(
       () => ConnectionMultiplexer.Connect(ConfigurationManager.AppSettings["RedisServerMaster"]
         + "," + ConfigurationManager.AppSettings["RedisServerSlave"]
         + "," + ConfigurationManager.AppSettings["RedisOptions"])

    public class SessionObjects
    {
        public string SessionId { get; set; }
        public TimeSpan? TTL { get; set; }
    }

    List<SessionObjects> lso = new List<SessionObjects>();
    var serializer = new NewtonsoftSerializer();
    StackExchangeRedisCacheClient cacheClient;
    cacheClient = new StackExchangeRedisCacheClient(rConn, serializer, 1);
    IEnumerable<string> keys = cacheClient.SearchKeys("*");
    var db = rConn.GetDatabase(1);
    foreach (var s in keys)
    {
        SessionObjects so = new SessionObjects();
        so.SessionId = s;
        so.TTL = db.KeyTimeToLive(s);
        lso.Add(so);
    }

【讨论】:

  • 感谢 Jeff,因为我们完全从 Redis 中移出了 sessionstateprovider,因为连续会话请求(从 asp 端)之间的最短时间可能会导致排队延迟的峰值,尤其是当您使用诸如 Angular 之类的 SPA 来执行大量 ajax 请求。
  • 在看到延迟之前,您设法处理了多少请求?您的系统配置和网络设置是什么?您使用的是哪个版本的 Redis?
  • @Rogier 您如何解决 SPA 中大型 ajax 请求队列的问题
  • @ShaktiShrestha 禁用会话锁定应该可以解决该问题(如果您的版本支持)。检查此链接(无锁会话状态部分):github.com/Azure/aspnet-redis-providers/wiki/Configuration
猜你喜欢
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
  • 2011-09-20
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多