Redis介紹使用及進階

目錄:redis

1、介紹數據庫

2、緩存問題緩存

3、Redis內存濫用安全

4、鍵命名規範服務器

5、Redis使用場景數據結構

6、持久化操做併發

7、.Net Core 使用redis 簡單介紹app


 

1、介紹ide

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

二、 原子性--  Redis的全部操做都是原子性的

三、 特性—可設置過時鍵、支持publish/subscribe發佈與訂閱、通知等

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

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

六、 支持持久化—RDB、AOF

2、緩存問題

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

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

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

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

3、Redis內存濫用

緣由:

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

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

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

解決:

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

二、 按期查看是否存在冷數據進行清除

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

四、 存儲的數據儘可能從簡,簡化存儲的數據

4、鍵命名規範

一、 redis是非關係型數據庫,內存存儲數據,鍵名長度也會影響空間,儘可能控制鍵名長度

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

5、Redis使用場景

一、 最主要用途可作緩存

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

三、 頻繁讀取數據庫會形成數據庫的巨大的壓力均可以採用redis(瀏覽量、在線人數、等等)

四、 publish/subscribe發佈與訂閱可作簡單的消息隊列


 

6、持久化操做

持久化操做分爲兩種:RDB與AOF持久化

RDB:

一、 效率更高

二、 性能最大化,由於開始持久化的時候是fork出一個子進程,而後子進程去完成持久化的工做

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

持久化的配置

#持久化時間策略

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:

一、 三種持久化的策略:一、修改同步二、每秒同步三、不一樣步。

二、 寫入操做採用的是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的設置只適合很是低延遲的環境。

 


 

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

一、引用包  StackExchange.Redis

二、創建一個Redis管理連接類

 

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

 

 

三、創建一個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);
        }
}
相關文章
相關標籤/搜索