1. 程式人生 > 實用技巧 >C#redis快取應用

C#redis快取應用

Redis

  redis是一種非關係型資料庫(關係型資料庫即SQL server,MySQL等),但多用於快取技術.因為它是一種記憶體告訴快取資料庫,儲存資料的方式為Key-value,即鍵值對.而且redis還支援多種資料型別,如:string、list、set、zset(sorted set)、hash。

  redsi特點:

①redis以記憶體作為儲存的介質,讀寫速率極高,遠超過資料庫,

②redis跟memcache不同,redis儲存的資料是持久化的,不會因為斷電重啟造成的資料丟失.(reids的儲存分為記憶體儲存,磁碟儲存和log檔案三部分,重啟後,redis從磁碟重新將資料載入到記憶體中,再通過配置檔案對其進行配置,持久化的原因)

③redis可以配置叢集,就像一些大公司的伺服器一樣,它可以建立多個redis用來快取,而且redis不在客戶端,也不再服務端,是一個獨立的部分

  redis兩種檔案格式:

①全量資料:是把記憶體中的資料寫入磁碟,便於下次讀取檔案進行夾雜

②增量請求:是將記憶體中的資料序列化為操作請求,用於讀取檔案進行replay得到資料,序列化的操作包括SET,RPUSH,SADD,ZADD

Redis的安裝:

  包地址:https://files.cnblogs.com/files/lbjlbj/Redis3.7z

執行->cmd->CD C:\redis(C:\redis CD 進入到碟符(記得有空格),上面那個解壓後把它改名為redis,放到了C盤,也可以放其他盤

)

redis-server.exeredis.windows.conf,等出現如圖的例項,就證明成功了(這個控制檯先不要關) 再開一個控制檯,同樣:CD C:\redis redis-cli.exe-h127.0.0.1-p6379 setmyKeyabc(myKey即Key,abc即value,set存) getmyKey(get讀)

set auth 密碼名,是用來設定密碼.(如果忘記了密碼:redis資料夾下redis.windows-service.conf記事本開啟CTRL+F requirepass 即可)

redis在C#中的實際用法:

******在使用redis快取時,須先啟動伺服器,CD C:\redis redis-server.exeredis.windows.conf

dll檔案:https://files.cnblogs.com/files/lbjlbj/dll.7z

可能會存在ConfigurationManager會報錯,還需自行搜尋新增引用

  

奉上一個封裝好的Helper類

using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace ConsoleApp1
{
    /// <summary>
    /// Redis 操作類
    /// </summary>
    public class RedisHelper
    {
        /// <summary>
        /// 連線字串
        /// </summary>
        private static readonly string ConnectionString = ConfigurationManager.ConnectionStrings["RedisConnectionString"].ConnectionString;
        /// <summary>
        /// 鎖
        /// </summary>
        private readonly object _lock = new object();
        /// <summary>
        /// 連線物件
        /// </summary>
        private volatile IConnectionMultiplexer _connection;
        /// <summary>
        /// 資料庫
        /// </summary>
        private IDatabase _db;
        public RedisHelper()
        {
            _connection = ConnectionMultiplexer.Connect(ConnectionString);
            _db = GetDatabase();
        }
        /// <summary>
        /// 獲取連線
        /// </summary>
        /// <returns></returns>
        protected IConnectionMultiplexer GetConnection()
        {
            if (_connection != null && _connection.IsConnected)
            {
                return _connection;
            }
            lock (_lock)
            {
                if (_connection != null && _connection.IsConnected)
                {
                    return _connection;
                }

                if (_connection != null)
                {
                    _connection.Dispose();
                }
                _connection = ConnectionMultiplexer.Connect(ConnectionString);
            }

            return _connection;
        }
        /// <summary>
        /// 獲取資料庫
        /// </summary>
        /// <param name="db"></param>
        /// <returns></returns>
        public IDatabase GetDatabase(int? db = null)
        {
            return GetConnection().GetDatabase(db ?? -1);
        }
        /// <summary>
        /// 設定
        /// </summary>
        /// <param name="key">鍵</param>
        /// <param name="data">值</param>
        /// <param name="cacheTime">時間</param>
        public virtual void Set(string key, object data, int cacheTime)
        {
            if (data == null)
            {
                return;
            }
            var entryBytes = Serialize(data);
            var expiresIn = TimeSpan.FromMinutes(cacheTime);

            _db.StringSet(key, entryBytes, expiresIn);
        }
        /// <summary>
        /// 根據鍵獲取值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        public virtual T Get<T>(string key)
        {

            var rValue = _db.StringGet(key);
            if (!rValue.HasValue)
            {
                return default(T);
            }

            var result = Deserialize<T>(rValue);

            return result;
        }
        /// <summary>
        /// 反序列化
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="serializedObject"></param>
        /// <returns></returns>
        protected virtual T Deserialize<T>(byte[] serializedObject)
        {
            if (serializedObject == null)
            {
                return default(T);
            }
            var json = Encoding.UTF8.GetString(serializedObject);
            return JsonConvert.DeserializeObject<T>(json);
        }
        /// <summary>
        /// 判斷是否已經設定
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public virtual bool IsSet(string key)
        {
            return _db.KeyExists(key);
        }
        /// <summary>
        /// 序列化
        /// </summary>
        /// <param name="data"></param>
        /// <returns>byte[]</returns>
        private byte[] Serialize(object data)
        {
            var json = JsonConvert.SerializeObject(data);
            return Encoding.UTF8.GetBytes(json);
        }
    }
}

AppConfig中配置:

 <connectionStrings>
    <add name="RedisConnectionString" connectionString="localhost"/>
  </connectionStrings>

最後功能實現:

class Program
    {
        static void Main(string[] args)
        {
            var s = "a";
            //RedisCacheHelper.Add("abc",s,DateTime.Now.AddDays(1));

            //Console.WriteLine("ok");

            //Console.WriteLine(RedisCacheHelper.Get<string>("abc"));
            new RedisHelper().Set("abc", s, 10);
            Console.WriteLine("ok");
            Console.ReadKey();
        }
    }