天天看點

Redis常用指令入門——清單類型(一級二級緩存技術)

lrange指令比較常用,傳回從start到stop的所有元素的清單,start和stop都是從0開始。

(1)查詢所有(擷取全部清單):LRANGE KEY_NAME 0 -1

(2)查詢前兩個:LRANGE KEY_NAME 0 2

(3)lrange還支援負值索引,這裡是負值大家可以把負号加值直接了解成從從右數第多少個,要是執行lrange numbers -2 -1,就會得到最後兩個值。

(4)查詢倒數3個:LRANGE KEY_NAME  -3 -1

這裡有兩點要注意一下:

(1)如果start索引比stop索引位置靠後(這裡說的是位置,不是索引值的大小),則會傳回空清單(empty list or set)。

(2)如果stop大于實際的索引範圍,則會傳回清單最後邊的元素。

Redis Lrem 根據參數 COUNT 的值,移除清單中與參數 VALUE 相等的元素。

COUNT 的值可以是以下幾種:

count > 0 : 從表頭開始向表尾搜尋,移除與 VALUE 相等的元素,數量為 COUNT 。

count < 0 : 從表尾開始向表頭搜尋,移除與 VALUE 相等的元素,數量為 COUNT 的絕對值。

count = 0 : 移除表中所有與 VALUE 相等的值。

傳回值是删除值的個數。

删除倒數2個值:

删除順序的1個值:

隻保留清單中指定的片段

Redis Ltrim 對一個清單進行修剪(trim),就是說,讓清單隻保留指定區間内的元素,不在指定區間之内的元素都将被删除。

下标 0 表示清單的第一個元素,以 1 表示清單的第二個元素,以此類推。 你也可以使用負數下标,以 -1 表示清單的最後一個元素, -2 表示清單的倒數第二個元素,以此類推。

Ltrim 剪切注意事項:

【1】從左邊開始剪切是從:0 開始 ,這樣的話可以按照數組下标的方式去擷取存儲就可以了。0就是第一個元素哦

【2】從右邊剪切是從:-1 開始的,-1就是倒數第一個元素哦!

查詢所有元素:

例如:隻截取中間的兩個值:

可以這麼做:

 原始資料:

隻截取前面的5條資料:

通常的文章清單,每次都要通路資料庫,資料庫壓力很大,一個分頁條件的不同頁面之間資料無法共享。一旦資料庫出問題時,整個頁面随之無法通路。

怎麼辦?可以增加memcache緩存。每一頁做一個緩存,例如10分鐘。但是多頁之間,可能你先緩存,我後緩存,資料就會出現不一緻的情況。而且每一頁的緩存建立都需要通路資料庫。如果将所有結果緩存起來,每次讀取出整個緩存再分析出分頁資料,不僅性能不高,伺服器網卡也将承受巨大的流量壓力。

而redis的連結清單功能,能基本完美的解決這些問題。

将mysql查詢出的清單的全部文章id都儲存到一個連結清單裡,需要通路第N頁時,隻需要lrange出對應的PAGE_SIZE個文章id,然後再從緩存中讀取這PAGE_SIZE個文章的資訊。清單就完成了。下次通路的時候,就完全不需要資料庫,直到緩存失效。并且一次讀取,所有分頁都共用該緩存。不僅提高了效率,還保證了分頁間的資料一緻。文章資訊,也再從資料庫讀取之後,儲存到redis中。

對于通路頻繁且從資料庫讀取代價比較大的資料,一旦緩存失效,将有多個并發去請求資料庫,給資料庫帶來很大的壓力。這時可以給清單緩存(命名為list)再加個存活緩存(命名為live)。list永不過期,而live存活時間隻有10分鐘。每次先lrange請求出需要的資料,再檢測live是否存在。如果不存在就先重新設定live,然後再從資料庫讀取清單,重新設定list。這樣的好處就是,隻有第一個檢測到live失效的請求會通路資料庫,其他并發請求通路的是緩存資料。

這個方法帶來的另一個好處是,即使資料庫當機,清單仍然能正常通路