婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > 詳解用Redis實(shí)現(xiàn)Session功能

詳解用Redis實(shí)現(xiàn)Session功能

熱門標(biāo)簽:天音通信電話機(jī)器人 400電話申請(qǐng)?jiān)趺纯?/a> 杭州400電話如何申請(qǐng)的 高德地圖標(biāo)注商家在哪 隨州營(yíng)銷電話機(jī)器人怎么樣 機(jī)器人電話機(jī)創(chuàng)意繪畫 江西南昌百應(yīng)電話機(jī)器人 400電話從哪里申請(qǐng)濱州 hbuilder地圖標(biāo)注

0.什么是Redis

Redis是一個(gè)開源的使用ANSI C語(yǔ)言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的API

1.與其他用戶狀態(tài)保存方案比較

一般開發(fā)中用戶狀態(tài)使用session或者cookie,兩種方式各種利弊。

Session:在InProc模式下容易丟失,并且引起并發(fā)問題。如果使用SQLServer或者SQLServer模式又消耗了性能

Cookie則容易將一些用戶信息暴露,加解密同樣也消耗了性能。

Redis采用這樣的方案解決了幾個(gè)問題,

①.Redis存取速度快。

②.用戶數(shù)據(jù)不容易丟失。

③.用戶多的情況下容易支持集群。

④.能夠查看在線用戶。

⑤.能夠?qū)崿F(xiàn)用戶一處登錄。(通過代碼實(shí)現(xiàn),后續(xù)介紹)

⑥.支持持久化。(當(dāng)然可能沒什么用)

2.實(shí)現(xiàn)思路

1.我們知道session其實(shí)是在cookie中保存了一個(gè)sessionid,用戶每次訪問都將sessionid發(fā)給服務(wù)器,服務(wù)器通過ID查找用戶對(duì)應(yīng)的狀態(tài)數(shù)據(jù)。

在這里我的處理方式也是在cookie中定義一個(gè)sessionid,程序需要取得用戶狀態(tài)時(shí)將sessionid做為key在Redis中查找。

2.同時(shí)session支持用戶在一定時(shí)間不訪問將session回收。

借用Redis中Keys支持過期時(shí)間的特性支持這個(gè)功能,但是在續(xù)期方面需要程序自行攔截請(qǐng)求調(diào)用這個(gè)方法(demo有例子)

下面開始代碼說明 

3.Redis調(diào)用接口

首先引用ServiceStack相關(guān)DLL。

在web.config添加配置,這個(gè)配置用來設(shè)置Redis調(diào)用地址每臺(tái)服務(wù)用【,】隔開。主機(jī)寫在第一位 

 appSettings> 
  !--每臺(tái)Redis之間用,分割.第一個(gè)必須為主機(jī)-->
  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,每臺(tái)Redis之間用,分割.第一個(gè)必須為主機(jī)");
      }

      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,//“寫”鏈接池鏈接數(shù)
        MaxReadPoolSize = writeReadCount,//“讀”鏈接池鏈接數(shù)
        AutoStart = true
      });
    }

 為了控制方便寫了一個(gè)委托

 /// summary>
    /// 寫入
    /// /summary>
    /// typeparam name="F">/typeparam>
    /// param name="doWrite">/param>
    /// returns>/returns>
    public F TryRedisWriteF>(FuncIRedisClient, 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();
        }
      }
    }

 一個(gè)調(diào)用的例子其他的具體看源碼

   /// summary>
    /// 以Key/Value的形式存儲(chǔ)對(duì)象到緩存中
    /// /summary>
    /// typeparam name="T">對(duì)象類別/typeparam>
    /// param name="value">要寫入的集合/param>
    public void KSet(Dictionarystring, T> value)
    {
      FuncIRedisClient, bool> fun = (IRedisClient client) =>
      {
        client.SetAllT>(value);
        return true;
      };

      TryRedisWrite(fun);
    }

4.實(shí)現(xiàn)Session

按上面說的給cookie寫一個(gè)sessionid

  /// summary>
  /// 用戶狀態(tài)管理
  /// /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>
    /// 獲取當(dāng)前用戶信息
    /// /summary>
    /// typeparam name="T">/typeparam>
    /// returns>/returns>
    public object GetT>() where T:class,new()
    {
      return new RedisClientT>().KGet(SessionId);
    }

    /// summary>
    /// 用戶是否在線
    /// /summary>
    /// returns>/returns>
    public bool IsLogin()
    {
      return new RedisClientobject>().KIsExist(SessionId);
    }

    /// summary>
    /// 登錄
    /// /summary>
    /// typeparam name="T">/typeparam>
    /// param name="obj">/param>
    public void LoginT>(T obj) where T : class,new()
    {
      new RedisClientT>().KSet(SessionId, obj, new TimeSpan(0, Managers.TimeOut, 0));
    }
 

 6.續(xù)期

默認(rèn)用戶沒訪問超過30分鐘注銷用戶的登錄狀態(tài),所以用戶每次訪問都要將用戶的注銷時(shí)間推遲30分鐘

這需要調(diào)用Redis的續(xù)期方法 

 

    /// summary>
    /// 延期
    /// /summary>
    /// param name="key">/param>
    /// param name="expiresTime">/param>
    public void KSetEntryIn(string key, TimeSpan expiresTime)
    {
      FuncIRedisClient, bool> fun = (IRedisClient client) =>
      {
        client.ExpireEntryIn(key, expiresTime);
        return false;
      };

      TryRedisWrite(fun);
    }

 封裝以后
/// summary>
/// 續(xù)期
/// /summary>
public void Postpone()
{
new RedisClientobject>().KSetEntryIn(SessionId, new TimeSpan(0, Managers.TimeOut, 0));
}

這里我利用了MVC3中的ActionFilter,攔截用戶的所有請(qǐng)求

namespace Test
{
  public class SessionFilterAttribute : ActionFilterAttribute
  {
    /// summary>
    /// 每次請(qǐng)求都續(xù)期
    /// /summary>
    /// param name="filterContext">/param>
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
      new Session(filterContext.HttpContext).Postpone();
    }
  }
}

在Global.asax中要注冊(cè)一下

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
      filters.Add(new SessionFilterAttribute());
    }

    protected void Application_Start()
    {
      RegisterGlobalFilters(GlobalFilters.Filters);
    } 

 5.調(diào)用方式

為了方便調(diào)用借用4.0中的新特性,把Controller添加一個(gè)擴(kuò)展屬性 

public static class ExtSessions
{public static Session SessionExt(this Controller controller)
  {
    return new Session(controller.HttpContext);
  }
}

調(diào)用方法

  public class HomeController : Controller
  {
    public ActionResult Index()
    {
      this.SessionExt().IsLogin();
      return View();
    }
  }

6.代碼下載

點(diǎn)擊下載

7.后續(xù)

SessionManager包含 獲取用戶列表數(shù)量,注銷某個(gè)用戶,根據(jù)用戶ID獲取用戶信息,在線用戶對(duì)象列表,在線用戶SessionId列表等方法

后續(xù)將實(shí)現(xiàn)用戶一處登錄功能

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • django session完成狀態(tài)保持的方法
  • django框架之cookie/session的使用示例(小結(jié))
  • django進(jìn)階之cookie和session的使用示例
  • django項(xiàng)目搭建與Session使用詳解
  • Django中redis的使用方法(包括安裝、配置、啟動(dòng))
  • django之狀態(tài)保持-使用redis存儲(chǔ)session的例子

標(biāo)簽:保定 石嘴山 鶴崗 葫蘆島 沈陽(yáng) 昆明 招商 常德

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解用Redis實(shí)現(xiàn)Session功能》,本文關(guān)鍵詞  詳解,用,Redis,實(shí)現(xiàn),Session,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解用Redis實(shí)現(xiàn)Session功能》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于詳解用Redis實(shí)現(xiàn)Session功能的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    精品精品国产高清a毛片牛牛 | 国产精品麻豆久久久| 午夜精品久久一牛影视| 99国产精品99久久久久久| 亚洲色图一区二区三区| 国产宾馆实践打屁股91| 亚洲精品乱码久久久久久久久| 国产精品无遮挡| 欧美大尺度电影在线| 欧美电影一区二区三区| 久久精品99久久久| 丁香六月综合激情| 欧美激情一区二区三区不卡| 欧美美女激情18p| 99久久久久免费精品国产| 一区二区日韩av| 成人黄色在线网站| 成人97人人超碰人人99| 美女网站视频久久| 国产99久久久久| 69堂亚洲精品首页| 欧美男人的天堂一二区| 天堂影院一区二区| 国产欧美日韩不卡| 天天综合天天综合色| 99国产精品久久久久久久久久 | 五月婷婷久久丁香| 日韩欧美一区二区三区在线| 日韩三级中文字幕| 亚洲天天做日日做天天谢日日欢| 亚洲高清免费一级二级三级| 久久国产精品99久久人人澡| 91原创在线视频| 欧美日韩中文国产| 亚洲视频一区二区在线| 国产一区二区精品久久| 粗大黑人巨茎大战欧美成人| 久久久久久久久蜜桃| 婷婷国产在线综合| 欧美一区二区三区四区高清| 欧美精品色综合| 亚洲精品自拍动漫在线| 成人在线综合网站| 国产亚洲一区二区三区| 国产一区日韩二区欧美三区| 在线观看国产一区二区| 中文字幕佐山爱一区二区免费| 激情久久久久久久久久久久久久久久| 91国偷自产一区二区开放时间 | 国产精品888| 精品国产乱子伦一区| 亚洲福利电影网| 在线观看一区不卡| 一区二区国产盗摄色噜噜| av成人动漫在线观看| 欧美一区二区视频免费观看| 亚洲国产wwwccc36天堂| 欧美一区二区三区四区久久 | 蜜桃av一区二区| 5858s免费视频成人| 国产原创一区二区三区| 亚洲国产精品av| 欧美一区二区三区电影| 成人午夜看片网址| 日本aⅴ免费视频一区二区三区| 欧美大片拔萝卜| 欧美日韩激情一区二区三区| 国产不卡视频一区| 久久99国产精品免费| 午夜精品久久久久久久蜜桃app| 久久久夜色精品亚洲| 欧洲视频一区二区| 国产精品久久久久久久久免费相片 | 激情久久久久久久久久久久久久久久| 亚洲妇女屁股眼交7| 国产精品美女久久久久高潮| 欧美不卡一区二区三区四区| 色综合天天综合| 99久久国产综合精品女不卡| 激情图区综合网| 国精品**一区二区三区在线蜜桃| 一二三区精品福利视频| 中文字幕不卡在线播放| 中文字幕中文字幕一区| 欧美成人一区二区三区片免费 | 欧美一区二区三区免费观看视频 | 欧美高清激情brazzers| 91国偷自产一区二区三区成为亚洲经典| 免费观看一级欧美片| 免费视频最近日韩| 亚洲视频小说图片| 国产成人高清视频| 97成人超碰视| 精品视频1区2区3区| 欧美日韩一卡二卡| 日韩一区二区免费在线观看| 欧美三级资源在线| 精品国内二区三区| 亚洲欧美日韩成人高清在线一区| 国产精品女主播在线观看| 一区二区三区在线播| 欧美欧美欧美欧美首页| 91精品国产91久久久久久一区二区 | 波多野结衣中文字幕一区 | 国产精品一二三在| 日韩亚洲欧美成人一区| 国产成人一区二区精品非洲| 国产在线观看免费一区| 在线观看一区不卡| 国产精品久久久久久久久快鸭| 91视频91自| 国产精品色哟哟网站| 亚洲精品国产成人久久av盗摄| 亚洲在线观看免费| 成人黄色a**站在线观看| 91色porny在线视频| 久久久久国产精品麻豆 | 一区二区高清在线| 国产suv精品一区二区三区| 亚洲成人av一区| 国产成人亚洲精品青草天美| 欧美剧在线免费观看网站| 国产精品久久毛片av大全日韩| 五月天久久比比资源色| 成人高清在线视频| 亚洲精品一区二区三区香蕉| 精品黑人一区二区三区久久| 日本成人在线一区| 欧美亚洲综合另类| 亚洲第一在线综合网站| 免费在线观看精品| 欧美精品一区二区三区很污很色的| 亚洲成人午夜电影| 正在播放亚洲一区| 国产欧美一区二区精品性色| 成人国产精品免费观看动漫| 91在线播放网址| 中文字幕制服丝袜一区二区三区 | 欧美美女激情18p| 日韩精品电影一区亚洲| 欧美人成免费网站| 国内成人免费视频| 久久久www成人免费毛片麻豆| 成人性视频网站| 午夜精品福利一区二区三区蜜桃| 在线精品视频小说1| 免费人成精品欧美精品| 亚洲日本在线观看| 色综合久久综合网欧美综合网| 专区另类欧美日韩| 中文字幕字幕中文在线中不卡视频| 《视频一区视频二区| 精品乱人伦一区二区三区| 色狠狠综合天天综合综合| 国产一区二区不卡在线| 婷婷国产v国产偷v亚洲高清| 国产精品网站在线播放| 欧美mv和日韩mv国产网站| 欧美日韩国产综合草草| 99精品欧美一区| 国产成人午夜精品5599| 欧美日韩一级视频| 欧美日韩中文一区| 麻豆久久久久久久| 日本网站在线观看一区二区三区| 国产精品国产三级国产普通话三级| 欧美一区二区三区在线看| 欧美人妖巨大在线| 91麻豆精品国产自产在线观看一区| 成人av高清在线| 99国产精品久久久久| 欧洲一区二区三区免费视频| 在线看国产一区二区| 国产日韩欧美不卡在线| 欧美一区二区三区的| 欧美变态口味重另类| 久久―日本道色综合久久| 国产清纯在线一区二区www| 国产精品久久久久久久久久免费看| 国产精品久99| 日本不卡视频在线| 国产91精品精华液一区二区三区 | 欧美一级欧美三级在线观看| 国产成人免费9x9x人网站视频| 成人免费观看av| 欧美日韩精品一区二区天天拍小说 | 精品剧情v国产在线观看在线| 中文一区一区三区高中清不卡| 亚洲免费观看高清完整版在线| 夜夜操天天操亚洲| 久久精品国产第一区二区三区| 日韩一区二区三区免费观看| 色婷婷久久久亚洲一区二区三区| 欧美老女人第四色| 亚洲欧洲性图库| 国产在线播放一区二区三区| 欧美精品v国产精品v日韩精品| 国产欧美一区二区三区在线老狼| 午夜视频一区二区三区| 91香蕉视频在线|