目錄: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); } }