iT邦幫忙

2024 iThome 鐵人賽

DAY 22
1
Python

Python 錦囊密技系列 第 22

【Python錦囊㊙️技22】Redis Cache Server

  • 分享至 

  • xImage
  •  

Redis是知名的快取伺服器(Cache Server),可以安裝在獨立的電腦上,與Python內建的Cache比較,提供更多的功能及資料結構,更提供佇列(Queue),可以建構非同步的服務,進一步提升系統效能。

安裝

官方網頁提供各種平台的安裝說明,其中WIndows作業系統有3種方式:

  1. WSL。
  2. Docker。
  3. 官方不保證的本地安裝:筆者試過大致上還OK,只是有一點點缺陷,不影響大局。

為模擬在獨立的電腦上運作,因此筆者採用WSL安裝,安裝指令如下:

curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list

sudo apt-get update
sudo apt-get install redis

啟動與關閉Server

以下內容主要是參閱官方文件

  1. 啟動Server:
sudo service redis-server start
  1. 關閉Server:
sudo service redis-server stop

測試

  1. 啟動命令行(CLI)程式:
redis-cli
  1. 測試連線:
ping
  1. 執行結果:會得到【PONG】訊息。
(base) root@bigpc:/mnt/c/Users/xxx# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
  1. 建立一對key/value,key為【mykey】,value為【Hello\nWorld】:
SET mykey "Hello\nWorld"
  1. 查詢:
GET mykey
  1. 執行結果:會得到【Hello\nWorld】訊息。

  2. 關閉CLI:

quit
  1. 關閉Server,再啟動Server:
sudo service redis-server stop
sudo service redis-server start
  1. 查詢:
GET mykey
  1. 執行結果:仍會得到【Hello\nWorld】訊息,表示儲存至redis的訊息會落地(Persistent),不會遺失,這非常重要,意味系統不會因為redis當機,造成交易訊息消失,導致嚴重後果。

  2. 要顯示所有key:

KEYS *
  1. 執行結果:顯示所有key。
1) "foo"
2) "mykey"
3) "user-session:123"
  1. 刪除key:
DEL mykey
  1. 刪除所有key:
FLUSHALL
  1. 再輸入【KEYS *】,執行結果:
(empty array)

資料結構(Data structure)

Redis強項是支援許多種資料結構,包括:

  1. 字串:如上一節所示。
  2. 集合(Set):一個Key可儲存多個值,例如表格。
  3. 排序集合(Sorted Set):排序的集合,也支援聯集(union)/交集(intersection)/差集(difference)。
  4. 清單(List):可以實現queue/stack,提供佇列及索引的功能。
  5. 雜湊(Hash):可儲存JSON,快速搜尋資料。
  6. 點陣圖(Bitmap):可儲存二進位資料,也支援And/Or/Xor等操作。
  7. Bitfield:支援多個計時器,可根據位置遞增/遞減特定計時器。
  8. HyperLogLog:支援固定大小的記憶體。
  9. 地理索引(Geospatial index):可儲存地理資料。
  10. 串流(Stream):可瞬間接收大量資料,支援分割(partitioning)、複製(replication)及資訊落地(persistence)。

完全支援各種應用系統的需求,非常令人讚賞。

清單(List)測試

由於篇幅關係,我們只介紹清單(List),因為它實務上非常有用,可以實現queue/stack機制,建構非同步服務,適合瞬間會湧進大量訂單或詢問的行業使用。

清單(List)操作指令包括:

  1. LPUSH:在List的前面填入資料。
  2. RPUSH:在List的後面填入資料。
  3. LPOP:自List的前面取出資料。
  4. RPOP:自List的後面取出資料。
  5. LLEN:回傳List長度。
  6. LMOVE:將資料由一個List移至另一個List。
  7. LRANGE:查詢特定範圍的多個資料。
  8. LTRIM:一次刪除多個資料。
  9. BLPOP:自List的前面一次取出多個資料。
  10. BLMOVE:一次將多個資料由一個List移至另一個List。

以下同樣使用CLI指令測試。

  1. 填入資料,List名稱為【ikes:repairs】,可以使用【:】作為連接符號,類似【_】。
LPUSH bikes:repairs bike:5
  1. CLI回應:目前List的長度。
(integer) 1
  1. 一次填入多個資料:
LPUSH bikes:repairs bike:2 bike:10
  1. CLI回應:目前List的長度。
(integer) 3
  1. 自List的前面取出資料:回傳【bike:10】,因為它是最後填入的資料。
LPOP bikes:repairs
  1. 自List的後面取出資料:回傳【bike:5】,因為它是最先填入的資料。
RPOP bikes:repairs
  1. 可自List取出多筆資料:回傳【bike:2】,List內只剩1筆資料。
RPOP bikes:repairs 10
  1. List資料轉移:一次填入多個資料,將bikes:repairs轉移到另一個List【bikes:finished】。
LPUSH bikes:repairs bike:1 bike:2
# CLI回應:(integer) 2

# 從bikes:repairs的前面(LEFT)移出1筆資料,並填入bikes:finished前面
LMOVE bikes:repairs bikes:finished LEFT LEFT 
# CLI回應:"bike:2"
  1. LRANGE:查詢特定範圍的多個資料,【-1】表最後一筆,不會取出資料。
LRANGE bikes:repairs 0 -1
# CLI回應:"bike:1"
LRANGE bikes:finished 0 -1
# CLI回應:"bike:2"
  1. BLPOP:可自多個List取出資料,並可設定逾時秒數。依序由【bikes:finished】或【bikes:repairs】取出一筆資料。
BLPOP bikes:finished bikes:repairs 0
  1. CLI回應:bikes:finished有一筆資料被取出。
1) "bikes:finished"
2) "bike:2"
  1. BLPOP逾時秒數測試:Lists均無資料,故會等候,直到逾時秒數超過,指令執行才會結束。
BLPOP list1 list2 list3 2
  1. CLI回應:bikes:finished有一筆資料被取出。
(nil)
(2.05s)

更多的指令用法可參閱【Redis lists】

List實務應用

List實務應用的場景包括:

  1. List可自後面填入,後面取出,即Stack,後進先出(LIFO)。
  2. List可自後面填入,前面取出,即Queue,先進先出(FIFO)。
  3. 多個List操作:像上面範例所述,可建立多條的服務窗口,待修的自行車放入bikes:repairs Queue,修好後轉移到bikes:finished list,人來取車時,可先使用【LRANGE bikes:finished 0 -1】查詢,再使用【LTRIM bikes:finished 6 6】取出第6筆資料。
  4. 也可以分為不同服務等級的佇列(Priority queues),例如普通件/急件或VIP客戶/一般客戶。
  5. BLPOP非常適合客服中心(Help desk)的運作,客服人員取件可設定逾時秒數,不必一直按【取件】鈕,既可方便客服人員操作,又可提升系統效能。

結語

開發應用系統的目標不只要求正確性,也要追求穩定性及高效能,本篇介紹的Redis cache server入門,正是提升系統效能的有效方法,下一篇要進一步討論Python/Django如何使用Redis API,在應用系統中使用cache。


上一篇
【Python錦囊㊙️技21】快取(Cache)
下一篇
【Python錦囊㊙️技23】Python/Django與Redis 整合
系列文
Python 錦囊密技30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言