2016-06-27 60 views
0

在我的Azure ASP.NET MVC網站中,我想要顯示有多少客戶端連接到Redis會話狀態提供程序以及它們處於活動狀態的時間。我使用Azure Github上的aspnet-redis-providers lib。從RedisSessionStateProvider獲取活動會話的列表

在Redis中,它創建一個帶有SessionTimeout密鑰的{[app_name] _ [sessionkey} _Internal密鑰,其值爲配置的會話超時值。該密鑰的EXPIRE被設置爲那個時間,當您檢查密鑰的TTL時,您會看到會話訪問。

如何使用會話狀態提供程序庫來訪問此信息?如果這是不可能的,是否有任何其他庫可以用來安全地查詢這些信息,而不會干擾會話狀態提供程序?

+0

意志讓所有的鑰匙就足夠了?我的意思是使用它可能不會給你的客戶的具體數量。(一個客戶端可以存儲許多鍵值對) – Aravind

+0

我是這麼認爲的,但如果你可以訪問鍵,你也可以得到我猜的值。它有更多的與會議狀態提供商已經與鎖等打開連接,我想重複使用,以執行我的查詢 – Rogier

+0

它是一個關鍵的價值商店。我不確定是否會有可以鎖定的種類的實時連接。如果客戶端擁有連接到Redis緩存的憑據,他們可以隨時使用它。 – Aravind

回答

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); 
    } 
+0

感謝Jeff,因爲我們完全從Redis中移除了sessionstateprovider,因爲在連續的會話請求(從asp端)之間有一個可能導致排隊延遲尖峯的最小時間,特別是當您使用諸如Angular這樣的SPA時很多Ajax請求。 – Rogier

+0

在您看到延遲之前,您有多少次要求處理一秒?你的系統配置和網絡設置是什麼?你使用的是什麼版本的Redis? – Jeff