2016-06-27 8 views
0

In meiner Azure ASP.NET MVC-Website möchte ich zeigen, wie viele Clients mit einem Redis-Sitzungsstatusanbieter verbunden sind und wie lange sie aktiv sind. Ich benutze die Aspnet-Redis-Provider-Lib auf dem Azure Github.Eine Liste der aktiven Sitzung von RedisSessionStateProvider abrufen

In Redis wird ein {[app_name] _ [sessionkey} _Interner Schlüssel mit einem SessionTimeout-Schlüssel mit dem Wert des konfigurierten Sitzungszeitlimits erstellt. Der EXPIRE für diesen Schlüssel wird auf diese Zeit gesetzt, und wenn Sie für den Schlüssel auf TTL überprüfen, wird der Sitzungszugriff angezeigt.

Wie kann ich die Sitzungsstatusanbieterbibliothek verwenden, um auf diese Informationen zuzugreifen? Wenn das nicht möglich ist, gibt es eine andere Bibliothek, die ich verwenden kann, um diese Informationen sicher abzufragen, ohne den Sitzungszustandsanbieter zu stören?

+0

Willen alle Schlüssel bekommen würde genügen? Ich meine es nicht Sie können geben Sie die genaue Anzahl von Clients. (Ein Client viele Schlüssel-Wert-Paare speichern kann) – Aravind

+0

Ich denke schon, aber wenn Sie den Zugriff auf Schlüssel, können Sie auch die Werte erhalten, die ich denke. Es hat mehr damit zu tun, dass der Session-State-Provider bereits eine offene Verbindung mit Locking etc. hat, ich würde das gerne wiederverwenden, um meine Abfragen auszuführen – Rogier

+0

es ist ein Schlüsselwertspeicher. Ich bin nicht sicher, ob es eine Live-Verbindung von Arten geben würde, die Sie sperren können. Wenn ein Client über die Anmeldeinformationen für die Verbindung zum Redis-Cache verfügt, kann er sie immer verwenden. – Aravind

Antwort

1

Hier ist, was ich tun konnte. Ich habe meine eigene Sammlung von Sitzungsobjekten erstellt und alle Schlüssel (die ich in DB 1 ablege) gegriffen, dann habe ich alle Schlüssel durchlaufen und die TTL gepackt.

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

Dank Jeff, da wir von Redis insgesamt als sessionstateprovider weggezogen sind, weil es eine minimale Zeit zwischen aufeinanderfolgenden Sitzungsanforderungen gibt (von der Asp-Seite), die Spikes einer Warteschlangenverzögerung verursachen können, besonders wenn Sie SPAs wie Angular verwenden viele Ajax-Anfragen. – Rogier

+0

Wie viele Anfragen haben Sie bearbeitet, bevor Verzögerungen aufgetreten sind? Was war Ihre Systemkonfiguration und Netzwerkeinrichtung? Welche Version von Redis hast du benutzt? – Jeff

Verwandte Themen