目錄:
一、介紹
二、緩存問題
三、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); } }
歡迎大家掃描下方二維碼,和我一起學習更多的知識😊