1. 基礎
記憶體資料庫
Redis是一個key-value型的資料庫(相比較之下,MySQL是關聯資料庫),也就是說,一個key對應一個value,這是保證高效的手段之一,另外,Redis的所有資料在使用時都存放在記憶體中,2021Java面試寶典
這包含了兩層含義:
-
單臺Redis能存放多少資料,取決于其記憶體的大小(假設所有記憶體都給Redis用),如果需要存放更多資料,可以增加記憶體或做集群,
-
Redis支持將資料持久化到磁盤中,
但是,不會直接對磁盤進行讀寫,這種持久化,一般是用于在服務器重啟時,先把資料持久化,重啟后再從磁盤中讀取到記憶體,
資料結構
Redis支持五種資料結構,分別是String,List,Hash,Set,Zset,即字串,串列,哈希,集合,有序集合,
String是Redis最基本的型別,一個key對應一個value,
一般情況下,大部分的內容都可以通過序列化后,再存在到Redis中,比如圖片或物件等,每個key對就的value存盤的內容最大為512M,
Hash即哈希表,即key-value對集合,
是不是很奇怪?Redis的資料本身不就是key-value型的嗎?其實不奇怪,我們這里在說資料結構的時候,單指的是key-value中的value,也就是說,value是一個key-value對集合,想象一下這種資料結構,特別適合存盤物件,并且,Redis支持像資料庫中update一樣,單獨修改物件的某個屬性,
List即串列,
value是一個字串的串列,也就是說,一個value可以存放多個字串,可以按照順序,添加到頭或尾,它就是一個雙向鏈表,很適合做如朋友圈動態串列或訊息佇列等,
Set即集合,
它的value和串列的value一樣,也是一個字串串列,只是Set是無序的,并且,value中的元素是不重復的,和Java中的Set差不多,它的基礎原理也是基于Hash實作的,所以添加、洗掉、查找等的效率等都很快,Redis還為Set提供了多個集合操作的API,如交集、并集、差集等,可以利用來做統計,有多少個共同好友等,
Zset即有序集合,
它在Set的基礎上,給value中的每個字串關聯了一個score屬性,即得分,Zset通過計算得分,將字串進行從小到大的排序,字串的得分可以相同,Zset的排序是在插入時直接就做好的,可以用來做排行榜等,
2. Redis常出現的應用場景
快取——熱資料
熱點資料(經常會被查詢,但是不經常被修改或者洗掉的資料),首選是使用redis快取,畢竟強大到冒泡的QPS和極強的穩定性不是所有類似工具都有的,而且相比于memcached還提供了豐富的資料型別可以使用,另外,記憶體中的資料也提供了AOF和RDB等持久化機制可以選擇,要冷、熱的還是忽冷忽熱的都可選,
結合具體應用需要注意一下:很多人用spring的AOP來構建redis快取的自動生產和清除,程序一般如下:step1-> Select 資料庫前查詢redis,有的話使用redis資料,放棄select 資料庫,沒有就select 資料庫,然后將資料插入redis; srep2-> update或者delete資料庫錢,查詢redis是否存在該資料,存在的話先洗掉redis中資料,然后再update或者delete資料庫中的資料, 這種操作,如果并發量很小的情況下基本沒問題,但是高并發的情況請注意下面場景:
為了update先刪掉了redis中的該資料,這時候另一個執行緒執行查詢,發現redis中沒有,瞬間執行了查詢SQL,并且插入到redis中一條資料,回到剛才那個update陳述句,這個悲催的執行緒壓根不知道剛才那個該死的select執行緒犯了一個彌天大錯!于是這個redis中的錯誤資料就永遠的存在了下去,直到下一個update或者delete,
計數器
諸如統計點擊數等應用,由于單執行緒,可以避免并發問題,保證不會出錯,而且100%毫秒級性能,
佇列
相當于訊息系統,與ActiveMQ,RocketMQ等工具類似,但是覺得簡單用一下還行,如果對于資料一致性要求高的話還是用RocketMQ等專業系統,
由于redis把資料添加到佇列是回傳添加元素在佇列的第幾位,所以可以做判斷用戶是第幾個訪問這種業務,佇列不僅可以把并發請求變成串行,并且還可以做佇列或者堆疊使用,
位操作(大資料處理)
用于資料量上億的場景下,例如幾億用戶系統的簽到,去重登錄次數統計,某用戶是否在線狀態等等,騰訊10億用戶,要幾個毫秒內查詢到某個用戶是否在線,能怎么做?
千萬別說給每個用戶建立一個key,然后挨個記(你可以算一下需要的記憶體會很恐怖,而且這種類似的需求很多,這里要用到位操作——使用setbit、getbit、bitcount命令,原理是:
redis內構建一個足夠長的陣列,每個陣列元素只能是0和1兩個值,然后這個陣列的下標index用來表示用戶id(必須是數字哈),那么很顯然,這個幾億長的大陣列就能通過下標和元素值(0和1)來構建一個記憶系統,
最新串列
例如新聞串列頁面的最新的新聞串列,如果總數量很大的情況下,盡量不要使用select a from A limit 10這種low貨,嘗試redis的 LPUSH命令構建List,一個個順序都塞進去就可以啦,不過萬一記憶體清掉了咋辦?也簡單,查詢不到存盤key的話,用mysql查詢并且初始化一個List到redis中就好了,2021Java面試寶典
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/254333.html
標籤:其他
上一篇:redis主從復制
