Redis란 무엇입니까
Redis는 오픈 소스 로그 기반 키-값 데이터베이스이며 여러 언어로 API를 제공합니다. 🎜#
, 세션 또는 쿠키는 개발 시 사용자 상태에 사용됩니다. 두 방법 모두 장단점이 있습니다.Session: InProc 모드에서는 패배하기 쉽고 동시성 문제가 발생합니다. SQLServer나 SQLServer 모드를 사용하여 성능을 소모하는 경우
Cookies로 인해 일부 사용자 정보가 쉽게 노출될 수 있으며, 암호화 및 복호화에도 성능이 소모됩니다.
Redis는 이 솔루션을 사용하여 여러 문제를 해결합니다.
1 Redis는 빠른 액세스 속도를 제공합니다.
2. 사용자 데이터는 쉽게 손실되지 않습니다.
4. 온라인 사용자를 볼 수 있는 기능.
5. 사용자가 한 곳에서 로그인할 수 있습니다.
6. 끈기를 지원합니다.
2. 구현 아이디어 1. 우리는 세션이 실제로 쿠키에 세션 ID를 저장한다는 것을 알고 있습니다. 모든 접속은 sessionid를 서버로 전송하고 서버는 ID를 통해 사용자에 해당하는 상태 데이터를 찾습니다. 여기서 내 접근 방식은 프로그램이 사용자 상태를 가져와야 할 때 세션 ID를 쿠키에 정의하는 것입니다. 이 세션 ID는 Redis에서 검색하는 키로 사용됩니다.2 동시에, 세션은 사용자가 일정 기간 동안 접속하지 않을 경우 세션을 재활용할 수 있도록 지원합니다.
Redis에서 Keys의 만료 시간 기능을 빌려 이 기능을 지원하지만 갱신 측면에서 프로그램이 요청을 가로채서 이 메서드를 자체적으로 호출해야 합니다(데모에 예제가 있음) )
#🎜🎜 #아래 코드 설명 시작
3.Redis 호출 인터페이스
#🎜🎜 #
먼저 ServiceStack 관련 DLL을 인용해 보세요.
web.config에 구성 추가 이 구성은 각 서비스에 대한 Redis 호출 주소를 [,]로 구분하여 설정하는 데 사용됩니다. 호스트가 애초에 써져있다
<appSettings> <!--每台Redis之间用,分割.第一个必须为主机--> <add key="SessionRedis" value="127.0.0.1:6384,127.0.0.1:6384"/> </appSettings>
초기설정
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 }); }
/// <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. Session
#🎜 🎜#위에서 언급한 대로 쿠키를 작성합니다. sessionid
/// <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; } } }
사용자 액세스 방법
/// <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)); }
#🎜🎜 ## 🎜🎜#6.갱신
기본적으로 사용자는 30분 이상 접속하지 않으면 로그아웃되므로 사용자의 로그아웃 시간을 연기해야 합니다. 방문할 때마다 30분씩.#🎜🎜 #
Redis의 갱신 메소드를 호출해야 합니다/// <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)); }
여기서 모든 사용자 요청을 가로채기 위해 MVC3의 ActionFilter를 사용했습니다 #🎜🎜 #
namespace Test { public class SessionFilterAttribute : ActionFilterAttribute { /// <summary> /// 每次请求都续期 /// </summary> /// <param name="filterContext"></param> public override void OnActionExecuting(ActionExecutingContext filterContext) { new Session(filterContext.HttpContext).Postpone(); } } }
Global.asax에 등록해야 합니다
public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new SessionFilterAttribute()); } protected void Application_Start() { RegisterGlobalFilters(GlobalFilters.Filters); }
5. #
For 4.0의 새로운 기능을 쉽게 호출하고 빌리려면 컨트롤러에 확장 속성을 추가하세요.
public static class ExtSessions {public static Session SessionExt(this Controller controller) { return new Session(controller.HttpContext); } }
Calling 방법
public class HomeController : Controller { public ActionResult Index() { this.SessionExt().IsLogin(); return View(); } }
위 내용은 Redis가 세션을 대체합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!