0.ä»ä¹æ¯Redis
Redisæ¯ä¸ä¸ªå¼æºç使ç¨ANSI Cè¯è¨ç¼åãæ¯æç½ç»ãå¯åºäºå
å亦å¯æä¹
åçæ¥å¿åãKey-Valueæ°æ®åºï¼å¹¶æä¾å¤ç§è¯è¨çAPI
---ç»´åºç¾ç§
1.ä¸å
¶ä»ç¨æ·ç¶æä¿åæ¹æ¡æ¯è¾
ä¸è¬å¼åä¸ç¨æ·ç¶æ使ç¨sessionæè
cookieï¼ä¸¤ç§æ¹å¼åç§å©å¼ã
Session:å¨InProc模å¼ä¸å®¹æ丢失ï¼å¹¶ä¸å¼èµ·å¹¶åé®é¢ãå¦æ使ç¨SQLServeræè
SQLServer模å¼åæ¶èäºæ§è½
Cookieå容æå°ä¸äºç¨æ·ä¿¡æ¯æ´é²ï¼å 解å¯åæ ·ä¹æ¶èäºæ§è½ã
Rediséç¨è¿æ ·çæ¹æ¡è§£å³äºå 个é®é¢ï¼
1.Redisååé度快ã
2.ç¨æ·æ°æ®ä¸å®¹æ丢失ã
3.ç¨æ·å¤çæ
åµä¸å®¹ææ¯æé群ã
4.è½å¤æ¥çå¨çº¿ç¨æ·ã
5.è½å¤å®ç°ç¨æ·ä¸å¤ç»å½ãï¼éè¿ä»£ç å®ç°ï¼åç»ä»ç»ï¼
6.æ¯ææä¹
åãï¼å½ç¶å¯è½æ²¡ä»ä¹ç¨ï¼
2.å®ç°æè·¯
1.æ们ç¥ésessionå
¶å®æ¯å¨cookieä¸ä¿åäºä¸ä¸ªsessionidï¼ç¨æ·æ¯æ¬¡è®¿é®é½å°sessionidåç»æå¡å¨ï¼æå¡å¨éè¿IDæ¥æ¾ç¨æ·å¯¹åºçç¶ææ°æ®ã
å¨è¿éæçå¤çæ¹å¼ä¹æ¯å¨cookieä¸å®ä¹ä¸ä¸ªsessionidï¼ç¨åºéè¦åå¾ç¨æ·ç¶ææ¶å°sessionidå为keyå¨Redisä¸æ¥æ¾ã
2.åæ¶sessionæ¯æç¨æ·å¨ä¸å®æ¶é´ä¸è®¿é®å°sessionåæ¶ã
åç¨Redisä¸Keysæ¯æè¿ææ¶é´çç¹æ§æ¯æè¿ä¸ªåè½ï¼ä½æ¯å¨ç»ææ¹é¢éè¦ç¨åºèªè¡æ¦æªè¯·æ±è°ç¨è¿ä¸ªæ¹æ³ï¼demoæä¾åï¼
ä¸é¢å¼å§ä»£ç 说æ
3.Redisè°ç¨æ¥å£
é¦å
å¼ç¨ServiceStackç¸å
³DLLã
å¨web.configæ·»å é
ç½®ï¼è¿ä¸ªé
ç½®ç¨æ¥è®¾ç½®Redisè°ç¨å°åæ¯å°æå¡ç¨ãï¼ãéå¼ã主æºåå¨ç¬¬ä¸ä½
1 <appSettings>
2
3 <!--æ¯å°Redisä¹é´ç¨,åå².第ä¸ä¸ªå¿
须为主æº-->
4 <add key="SessionRedis" value="127.0.0.1:6384,127.0.0.1:6384"/>
5
6 </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
æä¸é¢è¯´çç»cookieåä¸ä¸ª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.è°ç¨æ¹å¼
为äºæ¹ä¾¿è°ç¨åç¨4.0ä¸çæ°ç¹æ§ï¼æControlleræ·»å ä¸ä¸ªæ©å±å±æ§
public static class ExtSessions
{public static Session SessionExt(this Controller controller)
{
return new Session(controller.HttpContext);
}
}
è°ç¨æ¹æ³
public class HomeController : Controller
{
public ActionResult Index()
{
this.SessionExt().IsLogin();
return View();
}
}
温馨提示:答案为网友推荐,仅供参考