1. 程式人生 > >Redis介紹使用及進階

Redis介紹使用及進階

目錄 subscribe 可能 並發 val .net core 原子 shel eve

目錄:

一、介紹

二、緩存問題

三、Redis內存濫用

四、鍵命名規範

五、Redis使用場景

六、持久化操作

七、.Net Core 使用redis 簡單介紹


一、介紹

1、 高性能-- Redis能讀的速度是110000次/s,寫的速度是81000次/s 、c語言實現距離系統更近、數據存儲在內存中、采用了epoll,非阻塞I/O,

2、 原子性-- Redis的所有操作都是原子性的

3、 特性—可設置過期鍵、支持publish/subscribe發布與訂閱、通知等

4、 數據類型—支持String(字符串)、Hash(哈希)、List(列表)、Set(集合)、 ZSet(有序集合)、Bitmaps(位圖)、HyperLogLog、Geo(地理信息定位)

5、 服務器簡單—底層代碼簡單優雅、不依靠操作系統類庫、單線程模型,避免並發問題

6、 支持持久化—RDB、AOF

二、緩存問題

緩存的更新客區分為三種方式—主動更新,被動更新,預加載更新

主動更新—開發人員操作更新或者通過定時任務自動更新

被動更新—當用戶操作觸發時進行數據緩存更新

預加載更新—通過後臺去點擊查找最新的數據進行覆蓋和刪除

三、Redis內存濫用

原因:

1、 數據一直累加,沒有自動清除也沒有手動清除,數據冗余

2、 儲存沒用的數據過多,有些可能只用到一個字段卻儲存了一個對象

3、 冷數據,根本不會用到的數據沒有去管理和清理

解決:

1、 每次存儲數據加上過期時間

2、 定期查看是否存在冷數據進行清除

3、 存儲對應數據,不應肆意存儲數據。存儲可用到的數據

4、 存儲的數據盡量從簡,簡化存儲的數據

四、鍵命名規範

1、 redis是非關系型數據庫,內存存儲數據,鍵名長度也會影響空間,盡量控制鍵名長度

2、 可考慮大小寫命名規範,根據業務命名,可加前綴,通俗易懂

五、Redis使用場景

1、 最主要用途可做緩存

2、 用redis的有序集合數據結構可做排行榜(ZSet)

3、 頻繁讀取數據庫會造成數據庫的巨大的壓力都可以采用redis(瀏覽量、在線人數、等等)

4、 publish/subscribe發布與訂閱可做簡單的消息隊列


六、持久化操作

持久化操作分為兩種:RDB與AOF持久化

RDB:

1、 效率更高

2、 性能最大化,因為開始持久化的時候是fork出一個子進程,然後子進程去完成持久化的工作

3、 會將數據都存儲在一個文件當中

持久化的配置

#持久化時間策略

save 900 1   #在900s至少有一條寫入就會觸發一次快照也就是一次備份

save 300 10  #300s內至少有10條寫入就會產生快照

save 60 10000   #60s內產生10000條寫入就會產生快照

#如果持久化出錯是否停止主進程的寫入

stop-writes-on-bgsave-error yes

#是否壓縮

rdbcompression yes

#導入時是否檢查文件

rdbchecksum yes

#保存的文件的名稱

dbfilename dump.rdb

#保存文件地址

dir ./   

stop-writes-on-bgsave-error yes --是一條很重要的命令,為了保證數據的完整性的

rdbcompression yes 沒必要開啟,開啟會導致cpu的消耗。劃不來,默認開啟的

在時間策略上面還有一個#save "",這行命令被註釋了,如果想要禁用RDB持久化就可以開啟這條命令。

RDB持久化是默認開啟的,而AOF是默認關閉的

AOF:

1、 三種持久化的策略:1、修改同步2、每秒同步3、不同步。

2、 寫入操作采用的是append模式,即使在操作數據到一半系統崩潰的情況下也可在啟動之前用redis-check-aof工具來完成數據的回復的一致性的問題。

#是否開啟aof

appendonly no

#文件的名稱

appendfilename "appendonly.aof"

#同步方式

# appendfsync always    #修改了就同步,比較消耗性能,慢但安全

appendfsync everysec     #每秒同步一次,比較折中,默認開啟,最多會損失1s的數據

# appendfsync no          #不開啟同步,交給os處理,快但不安全

#aof重寫期間是否同步

no-appendfsync-on-rewrite no

#重寫觸發的配置

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

#加載aof時有錯是否繼續加載,遇見錯誤會寫入一個log然後繼續執行,如果是no的話會終止執行

aof-load-truncated yes

定時任務:

# The range is between 1 and 500, however a value over 100 is usually not

# a good idea. Most users should use the default of 10 and raise this up to

# 100 only in environments where very low latency is required.

hz 10

表示1s內執行10次,可設置1-500之間的數字,通常超過100不是好的想法,100的設置只適合非常低延遲的環境。


七、.Net Core 使用redis 簡單介紹

1、引用包 StackExchange.Redis

2、建立一個Redis管理鏈接類

 public class RedisManager
    {
        static RedisManager()
        {
            if (!string.IsNullOrEmpty(redis連接字符串))
                redisHelp = new RedisHelp(redis連接字符串);
        }
        public static RedisHelp redisHelp { get; set; }
    }

3、建立一個Redis幫助類

     public class RedisHelp
          {
        private ConnectionMultiplexer redis { get; set; }

        private IDatabase db { get; set; }

        public RedisHelp(string connection)
        {
            redis = ConnectionMultiplexer.Connect(connection);
        }
        /// <summary>
        /// 增加/修改string  字符串類型
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public bool SetValue(string key, string value,int timeSpan=0,int indexDb = 0)
        {
            var db = redis.GetDatabase(indexDb);
            //var a = TimeSpan.Parse(timeSpan.ToString());
            var result= db.StringSet(key, value);
            if (timeSpan>0)
            {
                db.KeyExpire(key, DateTime.Now.AddSeconds(timeSpan));
            }
            return result;
        }

        /// <summary>
        ///  查詢  字符串類型
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public string GetValue(string key, int indexDb = 0)
        {
            var db = redis.GetDatabase(indexDb);
            return db.StringGet(key);
        }
      /// <summary>
        /// 刪除
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public bool DeleteKey(string key, int indexDb = 0)
        {
            var db = redis.GetDatabase(indexDb);
            return db.KeyDelete(key);
        }
        /// <summary>
        /// 鍵是否存在
        /// </summary>
        /// <param name="key"></param>
        /// <param name="indexDb"></param>
        /// <returns></returns>
        public bool KeyExist(string key,int indexDb=0)
        {
            var db = redis.GetDatabase(indexDb);
            var result = db.KeyExists(key);
            return result;
        }
        /// <summary>
        /// 哈希寫入字符串
        /// </summary>
        /// <param name="key"></param>
        /// <param name="field"></param>
        /// <param name="value"></param>
        /// <param name="timeSpan"></param>
        /// <param name="indexDb"></param>
        public void HashSetString(string key, string field, string value, int timeSpan = 0, int indexDb = 0)
        {
            var db = redis.GetDatabase(indexDb);
            db.HashSet(key, field, value);
            if (timeSpan>0)
            {
                db.KeyExpire(key,DateTime.Now.AddSeconds(timeSpan));
            }
        }
        /// <summary>
        /// 獲取哈希值(單個字符串類型)
        /// </summary>
        /// <param name="key"></param>
        /// <param name="field"></param>
        /// <param name="indexDb"></param>
        /// <returns></returns>
        public string HashGetString(string key, string field, int indexDb = 0)
        {
            var db = redis.GetDatabase(indexDb);
            if (!string.IsNullOrWhiteSpace(key)&&!string.IsNullOrWhiteSpace(field))
            {
                RedisValue result = db.HashGet(key, field);
                if (!string.IsNullOrWhiteSpace(result))
                {
                    return result;
                }
            }
            return string.Empty;
        }
        /// <summary>
        /// 刪除哈希
        /// </summary>
        /// <param name="key"></param>
        /// <param name="field"></param>
        /// <param name="indexDb"></param>
        /// <returns></returns>
        public bool DeleteHash(string key, string field, int indexDb = 0)
        {
            var db = redis.GetDatabase(indexDb);
            return db.HashDelete(key,field);
        }
}

Redis介紹使用及進階