Heim > Datenbank > Redis > Hauptteil

So verwenden Sie Redis zum Implementieren der Sitzungsfunktion

王林
Freigeben: 2021-02-22 09:26:04
nach vorne
7979 Leute haben es durchsucht

So verwenden Sie Redis zum Implementieren der Sitzungsfunktion

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>
Nach dem Login kopieren

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
            });
        }
Nach dem Login kopieren

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();
                }
            }
        }
Nach dem Login kopieren

Ein Aufrufbeispiel finden Sie im Quellcode

/// <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);
        }
Nach dem Login kopieren

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 dem Login kopieren

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));
        }
Nach dem Login kopieren

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);
        }
Nach dem Login kopieren

Registrieren Sie ihn in Global.asax

/// <summary>
/// 续期
/// </summary>
public void Postpone()
{
new RedisClient<object>().KSetEntryIn(SessionId, new TimeSpan(0, Managers.TimeOut, 0));
}
Nach dem Login kopieren

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();
        }
    }
}
Nach dem Login kopieren

6. Code-Download

Folgen -up

SessionManager umfasst das Abrufen der Anzahl der Benutzerlisten, das Abmelden eines Benutzers, das Abrufen von Benutzerinformationen basierend auf der Benutzer-ID, der Online-Benutzerobjektliste, der Online-Benutzer-SessionId-Liste und anderen Methoden.

Die Benutzeranmeldefunktion wird an einer Stelle implementiert in der Zukunft

Verwandte Empfehlungen:

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!

Verwandte Etiketten:
Quelle:cnblogs.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage