Lassen Sie uns Redis kurz vorstellen.
Redis (Remote Dictionary Server), der Remote-Wörterbuchdienst, ist eine Open-Source-Schlüsselwertdatenbank vom Protokolltyp, die in der ANSI-C-Sprache geschrieben ist, das Netzwerk unterstützt, speicherbasiert und persistent sein kann und APIs in mehreren Sprachen bereitstellt. Seit dem 15. März 2010 wird die Entwicklung von Redis von VMware gehostet. Seit Mai 2013 wird die Entwicklung von Redis von Pivotal gesponsert.
1. Vergleich mit anderen Lösungen zum Speichern des Benutzerstatus
Im Allgemeinen werden in der Entwicklung Sitzungen oder Cookies verwendet. Beide Methoden haben Vor- und Nachteile.
Sitzung: Im InProc-Modus geht man leicht verloren und verursacht Parallelitätsprobleme. Wenn Sie SQLServer oder den SQLServer-Modus verwenden und Leistung verbrauchen, können Cookies leicht einige Benutzerinformationen preisgeben, und die Verschlüsselung und Entschlüsselung verbrauchen ebenfalls Leistung.
Redis nutzt diese Lösung, um mehrere Probleme zu lösen,
1.
2. Benutzerdaten gehen nicht so leicht verloren.
3. Es ist einfach, Cluster zu unterstützen, wenn es viele Benutzer gibt.
4. Möglichkeit, Online-Benutzer anzuzeigen.
5. Benutzer können sich an einem Ort anmelden. (Erreicht durch Code, später eingeführt)
6. Unterstützung der Persistenz. (Natürlich kann es nutzlos sein)
2. Implementierungsideen
1 Wir wissen, dass die Sitzung bei jedem Besuch eine Sitzungs-ID an den Server sendet Finden Sie die entsprechenden Statusdaten des Benutzers.
Mein Ansatz besteht darin, eine Sitzungs-ID im Cookie zu definieren. Wenn das Programm den Benutzerstatus abrufen muss, wird die Sitzungs-ID als Schlüssel für die Suche in Redis verwendet.
2. Gleichzeitig unterstützt die Sitzung Benutzer dabei, die Sitzung wiederzuverwenden, wenn sie über einen bestimmten Zeitraum nicht darauf zugreifen.
Ausleihen der Ablaufzeitfunktion von Keys in Redis, um diese Funktion zu unterstützen, aber im Hinblick auf die Erneuerung muss das Programm die Anfrage abfangen und diese Methode selbst aufrufen (Demo enthält Beispiele)
Beginnen Sie mit der Codebeschreibung unten
3 . Redis-Aufrufschnittstelle
Erstes Zitat der ServiceStack-bezogenen DLL.
Konfiguration in web.config hinzufügen. Diese Konfiguration wird verwendet, um die Redis-Aufrufadresse festzulegen. Jeder Dienst wird durch [,] getrennt. Der Host wird an erster Stelle geschrieben
<appSettings> <!--每台Redis之间用,分割.第一个必须为主机--> <add key="SessionRedis" value="127.0.0.1:6384,127.0.0.1:6384"/> </appSettings>
Anfängliche Konfiguration
static Managers() { string sessionRedis= ConfigurationManager.AppSettings["SessionRedis"]; string timeOut = ConfigurationManager.AppSettings["SessionRedisTimeOut"]; if (string.IsNullOrEmpty(sessionRedis)) { throw new Exception("web.config 缺少配置SessionRedis,每台Redis之间用,分割.第一个必须为主机"); } if (string.IsNullOrEmpty(timeOut)==false) { TimeOut = Convert.ToInt32(timeOut); } var host = sessionRedis.Split(char.Parse(",")); var writeHost = new string[] { host[0] }; var readHosts = host.Skip(1).ToArray(); ClientManagers = new PooledRedisClientManager(writeHost, readHosts, new RedisClientManagerConfig { MaxWritePoolSize = writeReadCount,//“写”链接池链接数 MaxReadPoolSize = writeReadCount,//“读”链接池链接数 AutoStart = true }); }
Ein Delegat wird zu Kontrollzwecken geschrieben
/// <summary> /// 写入 /// </summary> /// <typeparam name="F"></typeparam> /// <param name="doWrite"></param> /// <returns></returns> public F TryRedisWrite<F>(Func<IRedisClient, F> doWrite) { PooledRedisClientManager prcm = new Managers().GetClientManagers(); IRedisClient client = null; try { using (client = prcm.GetClient()) { return doWrite(client); } } catch (RedisException) { throw new Exception("Redis写入异常.Host:" + client.Host + ",Port:" + client.Port); } finally { if (client != null) { client.Dispose(); } } }
/// <summary> /// 以Key/Value的形式存储对象到缓存中 /// </summary> /// <typeparam name="T">对象类别</typeparam> /// <param name="value">要写入的集合</param> public void KSet(Dictionary<string, T> value) { Func<IRedisClient, bool> fun = (IRedisClient client) => { client.SetAll<T>(value); return true; }; TryRedisWrite(fun); }
4. Implementieren Sie die Sitzung Cookies wie oben erwähnt. Eine Sitzungs-ID um 30 Minuten verschoben
Dies erfordert den Aufruf der Erneuerungsmethode von Redis
/// <summary> /// 用户状态管理 /// </summary> public class Session { /// <summary> /// 初始化 /// </summary> /// <param name="_context"></param> public Session(HttpContextBase _context) { var context = _context; var cookie = context.Request.Cookies.Get(SessionName); if (cookie == null || string.IsNullOrEmpty(cookie.Value)) { SessionId = NewGuid(); context.Response.Cookies.Add(new HttpCookie(SessionName, SessionId)); context.Request.Cookies.Add(new HttpCookie(SessionName, SessionId)); } else { SessionId = cookie.Value; } } }
Nach der Kapselung
/// <summary> /// 获取当前用户信息 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public object Get<T>() where T:class,new() { return new RedisClient<T>().KGet(SessionId); } /// <summary> /// 用户是否在线 /// </summary> /// <returns></returns> public bool IsLogin() { return new RedisClient<object>().KIsExist(SessionId); } /// <summary> /// 登录 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="obj"></param> public void Login<T>(T obj) where T : class,new() { new RedisClient<T>().KSet(SessionId, obj, new TimeSpan(0, Managers.TimeOut, 0)); }
Hier verwende ich den ActionFilter in MVC3, um alle Benutzeranfragen abzufangen
/// <summary> /// 延期 /// </summary> /// <param name="key"></param> /// <param name="expiresTime"></param> public void KSetEntryIn(string key, TimeSpan expiresTime) { Func<IRedisClient, bool> fun = (IRedisClient client) => { client.ExpireEntryIn(key, expiresTime); return false; }; TryRedisWrite(fun); }
/// <summary> /// 续期 /// </summary> public void Postpone() { new RedisClient<object>().KSetEntryIn(SessionId, new TimeSpan(0, Managers.TimeOut, 0)); }
5 . Aufrufmethode
Um das Aufrufen und Ausleihen der neuen Funktionen in 4.0 zu erleichtern, fügen Sie dem Controller ein erweitertes Attribut hinzu
namespace Test { public class SessionFilterAttribute : ActionFilterAttribute { /// <summary> /// 每次请求都续期 /// </summary> /// <param name="filterContext"></param> public override void OnActionExecuting(ActionExecutingContext filterContext) { new Session(filterContext.HttpContext).Postpone(); } } }
6. Code-Download
Folgen -up
Redis-Datenbank-Tutorial
Das obige ist der detaillierte Inhalt vonSo verwenden Sie Redis zum Implementieren der Sitzungsfunktion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!