Redis快取詳解

2021-09-26 13:37:51 字數 4179 閱讀 1392

redis是一款記憶體快取記憶體資料庫;

資料模型為:key - value,非關係型資料庫使用的儲存資料的格式;

可持久化:將記憶體資料在寫入之後按照一定格式儲存在磁碟檔案中,宕機、斷電後可以重啟redis時讀取磁碟中檔案恢復快取資料;

分布式:當前任務被多個節點切分處理,叫做分布式處理乙個任務。單個伺服器記憶體,磁碟空間有限,無法處理海量的快取資料,必須支援分布式的結構;

nosql:not only structured query language 不僅僅結構化查詢語言

結構化資料:有規律的一類資料;例如:人的資訊,動物資訊,考試資訊

非結構化資料:海量的不具備任何共同特性的資料集合;例如:網頁,日誌;

關係型資料庫:體現不同類結構化資料之間的關係的資料,例如oracle mysql

非關係型資料庫:儲存的是非結構化的海量資料;無法體現資料的關係;例如 mongodb redis

資料庫快取

sql語句時key值,查詢結果resultset是value,當同乙個查詢語句訪問時(select * from t_product),只要曾經查詢過,呼叫快取直接返回resultset,節省了資料庫讀取磁碟資料的時間。

持久層快取

減少了連線資料庫的時間;減少了resultset封裝成物件的過程。

業務層和控制層的快取

減少呼叫層次。

描述快取在業務層的邏輯

查詢商品資訊

判斷當前查詢在快取是否有資料

如果有資料,直接返回,當前請求結束;

如果沒有資料,查詢持久層資料庫資料,獲取資料儲存再快取乙份,供後續訪問使用;

快取雪崩/快取擊穿

海量請求訪問伺服器,伺服器的效能由快取支撐,一旦一定範圍的快取資料未命中,請求的資料訪問湧入資料庫;承受不了壓力造成宕機–重啟–海量請求並未消失–宕機–重啟,系統長時間不可用;這種情況就是快取的雪崩。

redis五種資料結構和內部編碼

redis支援五種資料型別:string(字串),hash(雜湊),list(列表),set(集合)及zset(sorted set:有序集合)

string(字串)

string 是 redis 最基本的型別,你可以理解成與 memcached 一模一樣的型別,乙個 key 對應乙個 value。

string 型別是二進位制安全的。意思是 redis 的 string 可以包含任何資料。比如jpg或者序列化的物件。

string 型別是 redis 最基本的資料型別,string 型別的值最大能儲存 512mb。

例項:複製**

127.0.0.1:6379> keys *

(empty list or set)

127.0.0.1:6379> set name hanlaoshi

ok127.0.0.1:6379> set location beijing

ok127.0.0.1:6379> keys *

1) "location"

2) "name"

hash(雜湊)

redis hash 是乙個鍵值(key=>value)對集合。

redis hash 是乙個 string 型別的 field 和 value 的對映表,hash 特別適合用於儲存物件。

例項:

redis> hmset myhash field1 "hello" field2 "world"

"ok"

redis> hget myhash field1

"hello"

redis> hget myhash field2

"world"

list(列表)

redis 列表是簡單的字串列表,按照插入順序排序。你可以新增乙個元素到列表的頭部(左邊)或者尾部(右邊)。

127.0.0.1:6379> lpush mylist01 100 200 300

(integer) 3

127.0.0.1:6379> lrange mylist01 0 1

1) "300"

2) "200"

set(集合)

redis的set是string型別的無序集合。

集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是o(1)。

sadd 命令

新增乙個 string 元素到 key 對應的 set 集合中,成功返回1,如果元素已經在集合中返回 0,如果 key 對應的 set 不存在則返回錯誤。

例項:複製**

redis 127.0.0.1:6379> sadd runoob redis

(integer) 1

redis 127.0.0.1:6379> sadd runoob mongodb

(integer) 1

redis 127.0.0.1:6379> sadd runoob rabitmq

(integer) 1

redis 127.0.0.1:6379> sadd runoob rabitmq

(integer) 0

redis 127.0.0.1:6379> smembers runoob

1) "redis"

2) "rabitmq"

3) "mongodb"

複製**

注意:以上例項中 rabitmq 新增了兩次,但根據集合內元素的唯一性,第二次插入的元素將被忽略。

集合中最大的成員數為 232 - 1(4294967295, 每個集合可儲存40多億個成員)。

zset(sorted set:有序集合)

redis zset 和 set 一樣也是string型別元素的集合,且不允許重複的成員。

不同的是每個元素都會關聯乙個double型別的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。

zset的成員是唯一的,但分數(score)卻可以重複。

zadd 命令

新增元素到集合,元素在集合中存在則更新對應score

例項:複製**

redis 127.0.0.1:6379> zadd runoob 0 redis

(integer) 1

redis 127.0.0.1:6379> zadd runoob 0 mongodb

(integer) 1

redis 127.0.0.1:6379> zadd runoob 0 rabitmq

(integer) 1

redis 127.0.0.1:6379> zadd runoob 0 rabitmq

(integer) 0

redis 127.0.0.1:6379> > zrangebyscore runoob 0 1000

1) "mongodb"

2) "rabitmq"

3) "redis"

複製**

內部編碼

實際上每種資料結構都有自己底層的內部編碼實現,而且是多種實現,這樣redis會在合適的場景選擇合適的內部編碼。

可以看到每種資料結構都有兩種以上的內部編碼實現,例如string資料結構就包含了raw、int和embstr三種內部編碼。

同時,有些內部編碼可以作為多種外部資料結構的內部實現,例如ziplist就是hash、list和zset共有的內部編碼。

我們可以通過object encoding命令查詢內部編碼:

複製**

127.0.0.1:6379> set set:1 hello

ok127.0.0.1:6379> object encoding set:1

"embstr"

127.0.0.1:6379> hset user:1 name kebi

(integer) 1

127.0.0.1:6379> object encoding user:1

"ziplist"

希望以上對您有所幫助!

Redis快取詳解

主要是從兩個角度去考慮 效能和併發。一 效能 如下圖所示,我們在碰到需要執行耗時特別久,且結果不頻繁變動的sql,特別適合將執行結果放入快取。這樣,後面的請求就去快取中讀取,使得請求迅速響應。二 併發 如上圖所示,在大併發的情況下,所有的請求都直接訪問資料庫,資料庫會出現超時或者連線異常。這個時候,...

快取 redis 快取穿透

哪一些因素 考慮使用redis,畢竟 redis 也要增加成本 1 熱點資料 2 讀的成本非常大 3 讀多寫少 4 對資料一致性要求 沒有那麼嚴格 可以出現資料與資料庫不一致 1 秒殺場景 3 物流查詢軌跡 熱點資料 啟用的資料是被快取到redis 當中 快取key 乙個時間點過期的時候,如果快取資...

Redis快取穿透 快取雪崩

把redis作為快取使用已經是司空見慣,但是使用redis後也可能會碰到一系列的問題,尤其是資料量很大的時候,經典的幾個問題如下 一 快取和資料庫間資料一致性問題 分布式環境下 單機就不用說了 非常容易出現快取和資料庫間的資料一致性問題,針對這一點的話,只能說,如果你的專案對快取的要求是強一致性的,...