在Heroku雲端平台使用Redis記憶體資料庫(二):操作串列資料

Redis資料類型

Redis具有下列幾種資料類型,完整的說明可參閱官網“An introduction to Redis data types and abstractions”這篇文章。

  • 字串
  • 串列(list):有序儲存多筆資料元素。Redis的串列是一種鏈結串列(linked list)資料結構,而Python語言的list(列表)類型相當於C或JavaScript等語言的陣列(array)。 鏈結串列和陣列的主要差別如下圖,陣列元素存放在連續的記憶體空間;串列則離散存放。陣列存取每個元素的時間都一樣,但是插入資料的速度比較慢(因為要重新調整後面元素的存放位置);鏈結串列則是元素越接近頭、尾兩端,存取速度就越快,但是透過索引編號方式存取的速度比較慢。鏈結串列和陣列的主要差別

    用排列骨牌來比喻存取串列資料,取出前面或後面三、五個牌很簡單,但若要取出第10個牌,就要重頭開始數。串列元素的編號從0開始,也可以從後頭由-1倒數。

    用排列骨牌來比喻存取串列資料

    一個串列可儲存超過40億個(232 – 1,即:4,294,967,295)元素。

  • 雜湊(hash):相當於Python的「字典(dict)」或JavaScript的「物件(Object)」類型,以「鍵∕值」(key/value)的型式儲存結構化的多筆資料。「鍵名」也稱為「欄位(field)」。一個雜湊可儲存超過40億組鍵∕值對。
  • 集合(set):無序儲存多筆唯一(無重複值)資料元素,並提供求取交集、聯集和差集的操作指令。一個集合可儲存超過40億個元素。
  • 有序集合(sorted set):有序存放多筆唯一資料元素。
  • HyperLogLogs:一種估算資料集當中的唯一值數量的統計演算法,相關說明請參閱對岸「大数据算法:基数统计」這一篇文章。

操作串列資料

串列就是一組字串資料的儲存空間,使用LPUSH(原意為“Left Push”,從左邊推入)或者RPUSH(代表“Right Push”,從右邊推入)建立串列並依序存入元素值。

操作遠端Redis Labs資料庫之前,記得先連線到Redis Labs主機:

連線到Redis Labs主機

接著執行LPUSH和RPUSH新增串列:

執行LPUSH和RPUSH新增串列

上面兩道指令將建立如下的she串列:

she串列

讀取指定索引的元素的指令是LINDEX(代表“list index”,串列索引)

讀取指定索引的元素

透過LRANGE(代表“list range”,串列範圍)可讀取指定範圍的串列元素,從「起始索引」取到「結束索引」,有頭有尾:

讀取指定範圍的串列元素

執行結果如下:

LRANGE執行結果

透過LSET(代表“list set”,設定串列)指令,可改變指定索引的串列元素值。底下指令將把索引編號5的元素改成“小菁”:

改變指定索引的串列元素值

LPOP和RPOP分別用於移除並傳回串列開頭(最左邊)和結尾(最右邊)的元素;執行LLEN(代表“list length”,串列長度)指令可得知元素數量:

LPOP和RPOP指令

執行之後的she串列剩下4個元素:

LPOP和RPOP執行結果

在串列中插入元素的指令是LINSERT(“insert”代表「插入」),若要在“小雅”元素後面插入一個“小雪”:

在串列中插入元素

指令語法如下,用AFTER(之後)BEFORE(之前)指定「新值」插入「目標元素」的後面或前面。

LINSERT執行結果

從串列中刪除指定元素的指令是LREM(REM代表“remove”,移除),底下的敘述將刪除所有“小雪”元素:

從串列中刪除指定元素

其中的「數量」參數:

  • 大於0,例如:2,代表從頭開始刪除2個吻合的元素。
  • 小於0,例如:-2,代表從尾端開始刪除2個吻合的元素。
  • 等於0,代表刪除所有吻合的元素。

刪除元素之後的結果:

LREM執行結果

最後,「保留」指定範圍元素的指令是LTRIM(”trim”代表「修剪」),底下兩道敘述將新增資料,接著修剪資料:

「保留」指定範圍元素的指令

執行之後,she串列剩下“小雅”和“小萱”兩個元素:

LTRIM執行結果

Posts created 483

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top