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失效的請求會通路資料庫,其他并發請求通路的是緩存資料。
這個方法帶來的另一個好處是,即使資料庫當機,清單仍然能正常通路