<ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>


      目錄

      * 前言 <https://www.cnblogs.com/AprilBlank/p/11571365.html#前言>
      * Redis <https://www.cnblogs.com/AprilBlank/p/11571365.html#redis>
      * 使用 <https://www.cnblogs.com/AprilBlank/p/11571365.html#使用>
      * RedisUtil <https://www.cnblogs.com/AprilBlank/p/11571365.html#redisutil>
      * 測試 <https://www.cnblogs.com/AprilBlank/p/11571365.html#測試>
      * 小結(jié) <https://www.cnblogs.com/AprilBlank/p/11571365.html#小結(jié)>
      @

      前言

      中秋過完不知不覺都已經(jīng)快兩周沒動這個工程了,最近業(yè)務(wù)需要總算開始搞后臺云服務(wù)了,果斷直接net
      core搞起,在做的中間遇到了不少問題,這個后續(xù)會一點點列出來包括解決方法,今天就先把之前挖的坑填一個。

      Redis

      之前在緩存那篇提到過,Cookie,Session,Cache
      這幾個不同的緩存方式,Cookie是存在客戶端瀏覽器的,Session實質(zhì)上也是客戶端的存儲,至于Cache是服務(wù)端的,但是如果是分布式的話,這幾個方式可能除了Cookie其他兩個都要有點兒問題,畢竟一臺服務(wù)只存儲自身一臺,如果多臺的話,需要涉及到多服務(wù)的交互,比如一臺服務(wù)做了Cache存儲,需要給其他服務(wù)發(fā)送內(nèi)部信號或是http請求,其他服務(wù)根據(jù)請求執(zhí)行對應(yīng)操作。

      當然這是在沒有用到Redis
      的前提下,Redis是解決分布式緩存的神器,相當于是自身一臺服務(wù)器專門處理數(shù)據(jù)的讀寫,可以理解為數(shù)據(jù)服務(wù)器(個人感覺。。。),至于自己業(yè)務(wù)的分布式只是為了業(yè)務(wù)需要去執(zhí)行,需要用到數(shù)據(jù)緩存即可直接調(diào)用Redis的讀寫操作(當然,各個服務(wù)的Redis配置要保持一致)。

      Redis的安裝和配置在Linux配置部署_新手向(四)——Redis安裝與配置
      <https://www.cnblogs.com/AprilBlank/p/11514472.html>已經(jīng)說過,當時就是為了使用Redis而做了個小鋪墊。

      使用

      首先,只要是類庫肯定是引入Nuget包了,我們在April.Util引入Microsoft.Extensions.Caching.Redis,當然其他也有
      StackExchange.Redis,CSRedisCore,這里先試試官方的吧,官方擴展包地址
      <https://github.com/aspnet/Extensions/tree/9bc79b2f25a3724376d7af19617c33749a30ea3a>
      。

      引入完之后,我們在appsettings.json來配置下地址目錄。

      之后我們看下Redis的方法,畢竟調(diào)用第三方都是看看然后根據(jù)自己需要裹一下。


      也是先要初始化配置信息,然后創(chuàng)建實體對象,調(diào)用方法,這里說明下,默認的value值是byte[],當然官方也有擴展方法。

      好了,看完了方法,我們來開始Util吧。

      RedisUtil

      首先,我們還是要先做配置信息,前面已經(jīng)在appsettings寫過配置信息,這里直接在AprilConfig中添加上。
      private static string _IsOpenCache = string.Empty; /// <summary> /// 是否使用Redis
      /// </summary> public static bool IsOpenCache { get { if
      (string.IsNullOrEmpty(_IsOpenCache)) { _IsOpenCache =
      Configuration["Redis:IsOpenRedis"]; } if (_IsOpenCache.ToLower() == "true") {
      return true; } return false; } } private static string _RedisConnectionString =
      string.Empty; /// <summary> /// Redis默認連接串 /// </summary> public static string
      RedisConnectionString { get { if (string.IsNullOrEmpty(_RedisConnectionString))
      { _RedisConnectionString = Configuration["Redis:ConnectionString"]; } return
      _RedisConnectionString; } }
      配置信息設(shè)置完成之后,開始初始化Redis的方法。
      private static RedisCache _redisCache = null; private static
      RedisCacheOptions options = null; /// <summary> /// 初始化Redis /// </summary>
      public static void InitRedis() { if (AprilConfig.IsOpenCache) { _redisCache =
      new RedisCache(GetOptions()); } } /// <summary> /// 獲取配置項信息 /// </summary> ///
      <returns></returns> protected static RedisCacheOptions GetOptions() { options =
      new RedisCacheOptions(); options.Configuration =
      AprilConfig.RedisConnectionString; options.InstanceName = "April.Redis"; return
      options; } /// <summary> /// 添加數(shù)據(jù) /// </summary> /// <param
      name="key">鍵</param> /// <param name="value">值</param> /// <param
      name="ExprireTime">過期時間</param> public static void Add(string key, object
      value, int ExprireTime = 10) { if (string.IsNullOrEmpty(key)) { return; }
      string strValue = string.Empty; try { strValue =
      JsonConvert.SerializeObject(value); } catch (Exception ex) {
      LogUtil.Error($"Redis.Add轉(zhuǎn)換失敗:{ex.Message}"); } if
      (!string.IsNullOrEmpty(strValue)) { _redisCache.SetString(key, strValue, new
      Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions() {
      AbsoluteExpiration = DateTime.Now.AddMinutes(ExprireTime) }); } } /// <summary>
      /// 獲取數(shù)據(jù)(對象) /// </summary> /// <typeparam name="T">對象類型</typeparam> /// <param
      name="key">鍵</param> /// <returns></returns> public static T Get<T>(string key)
      { string value = Get(key); if (string.IsNullOrEmpty(value)) { return
      default(T); } T obj = default(T); try { obj =
      JsonConvert.DeserializeObject<T>(value); } catch (Exception ex) {
      LogUtil.Error($"Redis.Get轉(zhuǎn)換失敗:{ex.Message},數(shù)據(jù):{value}"); } return obj; } ///
      <summary> /// 移除數(shù)據(jù) /// </summary> /// <param name="key">鍵</param> public static
      void Remove(string key) { if (!string.IsNullOrEmpty(key)) {
      _redisCache.Remove(key); } } /// <summary> /// 重置數(shù)據(jù) /// </summary> /// <param
      name="key">鍵</param> /// <param name="value">值</param> /// <param
      name="expireTime">過期時間</param> public static void Replace(string key, object
      value, int expireTime = 10) { if (!string.IsNullOrEmpty(key)) { Remove(key);
      Add(key, value, expireTime); } }
      具體使用的方法,這里不多寫了,代碼地址見net core Webapi 總目錄
      <https://www.cnblogs.com/AprilBlank/p/11282181.html>
      ,感覺代碼貼的多了,自己也習慣了復制粘貼,看一個封裝好的方法,就要去看他的源碼(如果只是用的話就算了),這樣對方法的使用以及自身的業(yè)務(wù)需要封裝會有很好的幫助,畢竟會用是第一步,會改是第二步,封裝是第三步,自己寫那就是最終級了(這句純屬自勉)。

      測試

      好了,寫完之后,習慣來一遍測試,不想自己整理的東西最終還是不能用,千篇一律不可怕,可怕的是不知道最終的效果。
      新增



      獲取



      覆蓋
      ps:說是覆蓋,其實就是刪除然后新增-,-|||



      刪除



      小結(jié)


      寫到這里基本上都結(jié)束了,簡單的說明了Redis的使用,后續(xù)還是會不斷更新,比如那么多database,如果隨意切換,redis存儲之后會不會有什么其他問題等等,
      學以致用,用方知錯,錯而能改,改了就行。

      友情鏈接
      ioDraw流程圖
      API參考文檔
      OK工具箱
      云服務(wù)器優(yōu)惠
      阿里云優(yōu)惠券
      騰訊云優(yōu)惠券
      京東云優(yōu)惠券
      站點信息
      問題反饋
      郵箱:[email protected]
      QQ群:637538335
      關(guān)注微信

        <ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>
          成人综合网站导航 | 厨房脱岳裙子在后面挺进视频 | 久久久黄色 | 美女A片视频 | 国产AV无码电影 | 少妇裸体按摩做爰hd | 最新操逼片 | 亚洲欧美成人在线 | www.xxxx国产 | 看一级黄色录像片 |