Redis常用命令入門——列表類型(一級二級緩存技術)


獲取列表片段

redis 127.0.0.1:6379> LRANGE KEY_NAME START END

lrange命令比較常用,返回從start到stop的所有元素的列表,start和stop都是從0開始。

(1)查詢所有(獲取全部列表):LRANGE KEY_NAME 0 -1

1.41.88.9:63789[1]> LRANGE myList2 0 -1
 1) "b"
 2) "e"
 3) "g"
 4) "b"
 5) "f"
 6) "e"
 7) "b"
 8) "d"
 9) "c"
10) "b"
11) "e"
12) "a"
13) "d"
14) "c"
15) "b"
16) "a"

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

12.4.8.2:63789[1]> LRANGE myList2 -2 -1
1) "b"
2) "a"

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

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

1.1.88.2:63789[1]> LRANGE myList2 -3 -1
1) "c"
2) "b"
3) "a"

這里有兩點要注意一下:

(1)如果start索引比stop索引位置靠后(這里說的是位置,不是索引值的大小),則會返回空列表(empty list or set)。

(2)如果stop大於實際的索引范圍,則會返回列表最后邊的元素。

刪除列表中指定值

redis 127.0.0.1:6379> LREM KEY_NAME COUNT VALUE

Redis Lrem 根據參數 COUNT 的值,移除列表中與參數 VALUE 相等的元素

COUNT 的值可以是以下幾種:

  • count > 0 : 從表頭開始向表尾搜索,移除與 VALUE 相等的元素,數量為 COUNT 。
  • count < 0 : 從表尾開始向表頭搜索,移除與 VALUE 相等的元素,數量為 COUNT 的絕對值。
  • count = 0 : 移除表中所有與 VALUE 相等的值。

返回值是刪除值的個數。

刪除倒數2個值:

11.1.88.9:63789[1]> LREM mylist -2 hello 
(integer) 2

刪除順序的1個值:

11.4.88.9:63789[1]> LREM mylist 1 hello 
(integer) 1

只保留列表中指定的片段

Redis Ltrim 對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。

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

redis 127.0.0.1:6379> LTRIM KEY_NAME START STOP

Ltrim 剪切注意事項:

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

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

查詢所有元素:

12.1.88.2:6389[1]> LRANGE mylist 0 -1
1) "33333333333"
2) "44444444444"
3) "4555555555555"
4) "66666666666"
5) "88888888888"
6) "9999999999"

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

3) "4555555555555"
4) "66666666666"

可以這么做:

11.4.88.209:6389[1]> LTRIM mylist 2 -3  左邊第三個元素開始和右邊第三個元素開始
OK
11.41.8.29:6389[1]> LRANGE mylist 0 -1
1) "4555555555555"
2) "66666666666"
11.1.88.9:6389[1]> 

 原始數據:

11.1.8.29:6389[1]> LRANGE mylist 0 -1
1) "4555555555555"
2) "66666666666"
3) "9999999999"
4) "7777777777"
5) "88888888888"
6) "555555555"
7) "4444444444"

只截取前面的5條數據:

11.1.8.209:6389[1]> LTRIM mylist 0 4 // 0~4 剛好5個元素
OK
11.41.88.209:6389[1]> LRANGE mylist 0 -1  //查看所有列表
1) "4555555555555"
2) "66666666666"
3) "9999999999"
4) "7777777777"
5) "88888888888"

利用鏈表實現文章列表頁緩存

通常的文章列表,每次都要訪問數據庫,數據庫壓力很大,一個分頁條件的不同頁面之間數據無法共享。一旦數據庫出問題時,整個頁面隨之無法訪問。

怎么辦?可以增加memcache緩存。每一頁做一個緩存,例如10分鍾。但是多頁之間,可能你先緩存,我后緩存,數據就會出現不一致的情況。而且每一頁的緩存創建都需要訪問數據庫。如果將所有結果緩存起來,每次讀取出整個緩存再分析出分頁數據,不僅性能不高,服務器網卡也將承受巨大的流量壓力。

而redis的鏈表功能,能基本完美的解決這些問題。

將mysql查詢出的列表的全部文章id都保存到一個鏈表里,需要訪問第N頁時,只需要lrange出對應的PAGE_SIZE個文章id,然后再從緩存中讀取這PAGE_SIZE個文章的信息。列表就完成了。下次訪問的時候,就完全不需要數據庫,直到緩存失效。並且一次讀取,所有分頁都共用該緩存。不僅提高了效率,還保證了分頁間的數據一致。文章信息,也再從數據庫讀取之后,保存到redis中。

對於訪問頻繁且從數據庫讀取代價比較大的數據,一旦緩存失效,將有多個並發去請求數據庫,給數據庫帶來很大的壓力。這時可以給列表緩存(命名為list)再加個存活緩存(命名為live)。list永不過期,而live存活時間只有10分鍾。每次先lrange請求出需要的數據,再檢測live是否存在。如果不存在就先重新設置live,然后再從數據庫讀取列表,重新設置list。這樣的好處就是,只有第一個檢測到live失效的請求會訪問數據庫,其他並發請求訪問的是緩存數據。

這個方法帶來的另一個好處是,即使數據庫宕機,列表仍然能正常訪問

獲取Redis數據批量的保存到Redis中去解析Redis數據的json格式

 public function RedisSaveToMysqlJsonAction()
    {
        $redis = RedisInstance::getInstance();
        $redis->select(1);
        $redisInfo = $redis->lRange('message01',0,9);
        $dataLength = $redis->lLen('message01');
        $redis->set('dataLength_front',$dataLength);
        while($dataLength > 20) {
            try {
                $this->db->begin();
                foreach ($redisInfo as $action) {
                    $sql = "INSERT INTO stream_name (name,createTime,userId,content) VALUES (?, ? ,? ,?)";
                    $this->db->execute($sql, array(
                        json_decode($action,true)['userName'],
                        json_decode($action,true)['createTime'],
                        json_decode($action,true)['userId'],
                        json_decode($action,true)['content'],
                    ));
                }
                $redis->set('message_insert_success', '00000');
                $redis->lTrim('message01', 10, -1);
                $redisInfo = $redis->lRange('message01',0,9);
                $dataLength = $redis->lLen('message01');
                $redis->set('dataLength_backenk', $dataLength);
                $this->db->commit();
            } catch (\Exception $e) {
                $redis->set('message_catch', json_encode($e));
                $this->db->rollback();
            }
        }
        var_dump($redisInfo);
        die;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM