1.什么是redis
Redis 是一個基于記憶體的高性能key-value資料庫,整個資料庫統統加載在記憶體當中進行操作,定期通過異步操作把資料庫資料flush到硬碟上進行保存,因為是純記憶體操作,Redis的性能非常出色,每秒可以處理超過 10萬次讀寫操作,是已知性能最快的Key-Value DB,
2.為什么用redis/為什么用快取
(1)高性能
假如用戶第一次訪問資料庫中某些資料,這個程序會比較慢,因為是從硬碟上讀取的,將用戶訪問的資料存放在快取中,這樣下一次訪問這些資料的時候就會直接從快取中獲取,操作快取是直接操作記憶體,所以速度相當快,如果資料庫中的資料對應的資料改變后,同步改變快取中相應的資料即可,
(2)高并發
直接操作快取能夠承受的請求是遠遠大于直接訪問資料庫的,所以把資料庫中的部分資料轉移到快取中去,這樣用戶的一部分請求會直接到快取中而不會經過資料庫,
3.redis支持資料型別
Redis 有 5 種基礎資料結構,分別為:string (字串)、list (串列)、set (集合)、hash (哈希) 和 zset (有序集合),
String字串:
格式: set key value
string型別是二進制安全的,意思是redis的string可以包含任何資料,比如jpg圖片或者序列化的物件 ,
string型別是Redis最基本的資料型別,一個鍵最大能存盤512MB,
Hash(哈希)
格式: hmset name key1 value1 key2 value2
Redis hash 是一個鍵值(key=>value)對集合,
Redis hash是一個string型別的field和value的映射表,hash特別適合用于存盤物件,
List(串列)
Redis 串列是簡單的字串串列,按照插入順序排序,你可以添加一個元素到串列的頭部(左邊)或者尾部(右邊)
格式: lpush name value
在 key 對應 list 的頭部添加字串元素
格式: rpush name value
在 key 對應 list 的尾部添加字串元素
格式: lrem name index
key 對應 list 中洗掉 count 個和 value 相同的元素
格式: llen name
回傳 key 對應 list 的長度
Set(集合)
格式: sadd name value
Redis的Set是string型別的無序集合,
集合是通過哈希表實作的,所以添加,洗掉,查找的復雜度都是O(1),
zset(sorted set:有序集合)
格式: zadd name score value
Redis zset 和 set 一樣也是string型別元素的集合,且不允許重復的成員,
不同的是每個元素都會關聯一個double型別的分數,redis正是通過分數來為集合中的成員進行從小到大的排序,
zset的成員是唯一的,但分數(score)卻可以重復,
4.什么是Redis持久化?Redis持久化有哪幾種持久方式?優缺點是什么?
Redis是基于記憶體操作的,記憶體斷電即失,redis持久化就是把記憶體的資料寫到磁盤中去,防止服務器宕機,記憶體資料丟失,Redis持久化提供兩個兩種方式RDF(默認)和AOF,
RDB:
Redis把資料快照存放在磁盤上的二進制檔案中,檔案名為dump.rdb,你可以配置Redis的持久化策略,例如資料集中每N秒鐘有超過M次更新,就將資料寫入磁盤;或者你可以手工呼叫命令SAVE或BGSAVE,
當redis意外宕機,會丟失部分資料,
AOF:
AOF(Append-Only-File)持久化即記錄所有變更資料庫狀態的指令,以append的形式追加保存到AOF檔案中,在服務器下次啟動時,就可以通過載入和執行AOF檔案中保存的命令,來還原服務器關閉前的資料庫狀態,
對于相同的資料來說,AOF檔案大小通常要大于RDB檔案,AOF持久化以日志的形式記錄服務器所處理的每一個寫、洗掉操作,查詢操作不會記錄,以文本的方式記錄,可以打開檔案看到詳細的操作記錄,所以redis意外宕機,redis只會丟失最后一次資料,
5.什么是快取穿透?如何避免?
一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去后端系統查找(比如DB),一些惡意的請求會故意查詢不存在的key,請求量很大,就會對后端系統造成很大的壓力,這就叫做快取穿透,
如何避免?
1:對查詢結果為空的情況也進行快取,快取時間設定短一點,或者該key對應的資料insert了之后清理快取,
2:對一定不存在的key進行過濾,可以把所有的可能存在的key放到一個大的Bitmap中,查詢時通過該bitmap過濾,
6.什么是快取擊穿?如何避免
對于設定了過期時間的 key,快取在某個時間點過期的時候,恰好這時間點對這個 Key 有大量的并發請求過來,這些請求發現快取過期一般都會從后端 DB 加載資料并回設到快取,這個時候大并發的請求可能會瞬間把 DB 壓垮,
解決方案:
i.使用互斥鎖:當快取失效時,不立即去 load db,先使用如 Redis 的 setnx 去設定一個互斥鎖,當操作成功回傳時再進行 load db 的操作并回設快取,否則重試 get 快取的方法,
同時保證對于每個key同時只有一個執行緒去查詢后端,其他執行緒沒有獲得鎖的權限,只需要等待即可,
ii 永遠不過期:物理不過期,但邏輯過期(后臺異步執行緒去重繪),
7.什么是快取雪崩?如何避免
設定快取時采用了相同的過期時間,導致快取在某一時刻同時失效,請求全部轉發到 DB, DB 瞬時壓力過重雪崩,與快取擊穿的區別:雪崩是很多 key,擊穿是某一個key 快取,
解決方案:
將快取失效時間分散開,比如可以在原有的失效時間基礎上增加一個隨機值,比如 1-5 分鐘隨機,這樣每一個快取的過期時間的重復率就會降低,就很難引發集體失效的事件,
8.Redis為什么單執行緒還這么快?
redis是將所有資料全部放在記憶體中的,所以說使用單執行緒去操作效率就是最高的,多執行緒會產生CPU背景關系切換,將會是比較耗時的操作,對于記憶體系統來說,如果沒有背景關系切換效率就是最高的,
9、Redis記憶體淘汰機制(mySQL里有2000w資料,redis中只存20w的資料,如何保證redis中的資料都是熱點資料)
redis 記憶體資料集大小上升到一定大小的時候,就會施行資料淘汰策略(回收策略),redis 提供 6種資料淘汰策略:
volatile-lru:從已設定過期時間的資料集(server.db[i].expires)中挑選最近最少使用的資料淘汰
volatile-ttl:從已設定過期時間的資料集(server.db[i].expires)中挑選將要過期的資料淘汰
volatile-random:從已設定過期時間的資料集(server.db[i].expires)中任意選擇資料淘汰
allkeys-lru:從資料集(server.db[i].dict)中挑選最近最少使用的資料淘汰
allkeys-random:從資料集(server.db[i].dict)中任意選擇資料淘汰
no-enviction(驅逐):當記憶體資料不足以容納新寫入的資料時,新寫入操作時就會報錯,
10.Redis主從復制
是指將一臺Redis服務器的資料,復制到其他的Redis服務器,前者稱為主節點(master/leader),后者稱為從結點(slave/follower);資料的復制是單向的,只能由主節點到從結點,Master以寫為主,slave以讀為主,
11.Redis事務
Redis事務的本質是一組命令的集合,一個事務中所有命令都會被序列化,在事務執行程序中,會按照順序執行,
Redis單條命令保證原子性,但是Redis事務中不保證原子性,不并且redis事務沒有隔離級別的概念,
Redis事務命令:
開啟事務(multi)
執行事務(exec)
放棄事務(discard)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/272458.html
標籤:NoSQL
上一篇:提問 我用超引數網格搜索 出來best score是0.4幾 但是test集跑出來分數有0.9幾 有人知道原因么
下一篇:Redis常見面試題
