Below you will find pages that utilize the taxonomy term “Redis”
Posts
Redis - Setup redis cluster
這邊紀錄一下如何不透過 create-cluster 腳本一步一步建立 Redis cluster。
首先安裝 Redis,這邊為了方便筆者是直接使用 Docker 去起 Redis 容器。
docker run -it redis bash 這邊為了測試方便,會讓六個 Redis instance 放在同一個容器。所以這邊筆者建立一個目錄便於後續操作。
mkdir cluster-test cd cluster-test 接著為每個 Redis instance 建立目錄。
mkdir 7000 7001 7002 7003 7004 7005 每個 Redis instance 放置對應的 Redis 設定。
cd 7000 apt-get update && apt-get install vim vim redis.conf 設定檔內記得設定 Redis instance 的 port 號與 cluster。
port 7000 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes 調用 redis-server 命令,指定設定檔,啟動 Redis instance。
read morePosts
Redis - Redis cluster with docker and create-cluster script
透過 Docker 去起 Redis cluster,多半網路上的做法都是用多個容器去做,這邊筆者考量測試與開發上的便利性,試著用一個容器搭配 create-cluster 腳本去起 Redis cluster。
為了整合 Docker,create-cluster 腳本筆者做了些調整。只留下本來腳本中的 create 與 start 兩個步驟,將兩個步驟合併,並支援透過環境變數帶入 Host 與 Port,另外因為 Redis 不支援 Domain,所以 Host 帶入後會在容器內解析為 IP 後使用。
#!/bin/bash # Settings HOSTNAME=${HOSTNAME} PORT=${PORT} TIMEOUT=2000 NODES=6 REPLICAS=1 CLUSTER_HOST=$(getent hosts $HOSTNAME | awk '{ print $1 }') # Create & start HOSTS="" ENDPORT=$((PORT+NODES)) CURRENTPORT=$PORT while [ $((CURRENTPORT < ENDPORT)) != "0" ]; do echo "Starting $CURRENTPORT" redis-server --port $CURRENTPORT --cluster-enabled yes --cluster-config-file nodes-${CURRENTPORT}.conf --logfile ${CURRENTPORT}.
read morePosts
Redis - Redis cluster with create-cluster script
Redis 安裝完後 utils/create-cluster 目錄下有提供現成的腳本可以用來起 Redis cluster 做些測試。
使用方式可參閱目錄下的 README。
或是直接調用命令參考命令的說明。
./create-cluster 簡單來說,可以用 start 將要組成 Redis cluster 的節點都先運行起來。
./create-cluster start 再用 create 將運行起來的 Redis 連結組成 Cluster。
./create-cluster create 若有需要,可用 watch 監看 Redis 的輸出。
./create-cluster watch 如 Redis log 過多,可用 clean-logs 清除 Redis log。
./create-cluster clean-logs 不使用時可用 stop 停止 Redis 服務。
./create-cluster stop 再用 clean 將 Redis 的 資料、設定、Log 都清除。
./create-cluster clean
read morePosts
Redis - Install on Linux
要在 Linux 安裝 Redis,可先將 Redis 下載下來。
wget http://download.redis.io/redis-stable.tar.gz 解壓縮下載下來的檔案。
tar xvzf redis-stable.tar.gz 進到解壓縮後產出的目錄。
cd redis-stable 進行編譯(若無法編譯,請安裝 Make 與 gcc 套件)。
Make 編譯完成使用 utils 下的內建腳本進行 Redis 服務的設定與啟用。
./utils/install_server.sh 最後實際用 redis-cli 測試確認一下 Redis 服務正常運行即可。
src/redis-cli ping
read morePosts
Redis - Generate Snowflake generator id with client info
在做分散式系統時,有些情境下免不了要給節點維一的識別號,像是在用 Snowflake 分散式 Id 演算法時會需要給予 10 bit 長的 Generator id,用以避免 Id 碰撞。
識別號有的會直接取 IP 某段,或是 Process no,這樣並不能確保值的唯一。要確保維一只能依賴自行靠設定將設定值錯開,或是設計一個演算法配給。
若是搭配 Redis 使用,最直覺的演算法可能就是在每個服務實體啟動時去 Redis 註冊一個唯一的識別值,服務實體與識別值的資訊都放置在 Redis 中,並設有過期時間。每個服務定時到 Redis 延長過期時間,如果資訊過期,則對應的識別碼要釋出給新服務用。
上面的演算法很直覺,但有兩點較大的問題,一個是實作上很麻煩,一個是定時到 Redis 延長過期時間的做法對系統來說不是很好。好在 Redis 有維護每個連線的 Client 資訊,也都取的到,透過 Redis client 的資訊實作上會簡單許多,對系統來說處理也比較沒那麼吃重。
舉個例子來說,假設我用 Redis 的 Hash 來實作,Key 假定為 generator,裡面的 field 用來放 Generator id,value 用來放 Redis client 的 Id。
generator => { {$generator-id, $redis-client-id}, ... } 這樣在第一個服務上線時,Redis 內的資料是空的。
generator => { } 這時透過 Redis 命令 CLIENT LIST 取得所有連線的 Id,與 CLIENT ID 命令取得當前連線的 Id,就可以去更新並配給 Generator id。像是所有連線 Id 問回來只有一個連線,且連線 Id 跟當前連線 Id 一樣都是 0,就會將 Generator id 0 配給 Redis client 0。
read morePosts
Redis - A simple syntax to describe how data stored
在使用 redis 時,資料怎樣在 redis 內存放常會需要設計,或是需要拿出來跟團隊溝通討論。用畫圖表述或是列表有點不方便,redis 資料結構豐富也不是很好表示。
這邊筆者嘗試定義簡易的表示方式。
String 型態表示方式…
$string-key => $string-value Hash 型態表示方式…(設計概念為 Dictionary)
$hash-key => { {$field-key, $field-value}, ... } List 型態表示方式…(設計概念為 Array)
$list-key => [ $list-value, ... ] Set 型態表示方式…(設計概念為 Set)
$set-key => { $set-value, ... } SortedSet 表示方式…(設計概念為 Tuple set)
$sorted-set-key => { ($score, $set-value), ... } 像是 Redis reliable queue 那篇的設計…
用這樣的表示方式設計就會變成這樣:
pending => [$data-id, ...] working:$worker-id => [$data-id, ...] value => { {$data-id, $data}, .
read morePosts
Redis - Reliable queue pattern
系統中如果有使用到 Redis,有時會碰到要將 Redis 內資料落地的情境。這時可能會用 Redis 的 List 做一個簡單的 Queue,將資料以先進先出的方式處理。
這樣的做法看似運作良好,但隱藏著一個潛在的問題。如果今天從 Redid 取出資料還未處理就發生錯誤,可能是機器當機重啟那種錯誤,就會有丟失資料的現象發生。
為了解決這樣的問題,可以套用 Reliable queue pattern,當資料確實被處理完才從 Redis 內移除。
簡單的說就是把資料的 Id 放在 List 之類的結構,實際的資料放在 Value,當你 Deque 時將 Id 從 Pendding 放到 Working,處理完才從 Working 清掉,順帶將 Value 對應的資料刪掉。
實作上通常 Pending 與 Working 會用 List 結構去實作,Value 會用 Hash 結構。
當資料要從 Redis 取出處理時,會先查看 Working 是否已經有資料,如果 Working 已經有資料,可能代表之前處理到一半之類的,這時資料直接由 Working 反查 Value 後吐回。如果 Working 沒資料,會從 Pending 將需要處理的 Id 透過 rpoplpush 命令轉到 Working,然後反查 Value 吐回。
資料處理完要將資料從 Redis 移除時,會將 Working 與 Value 中對應的資料移除。
read morePosts
Iedis - Client list
在 Redis Servers Tool Window 內的連線設定上按下滑鼠右鍵,點選滑鼠右鍵快顯選單上的 Client List 選單選項。
可開啟 Client List 視窗,透過該視窗可查閱所有連到 Redis 的 Client。
也可以刪除指定的 Client 連線。
read morePosts
Iedis - Advanced console
在 Redis Servers Tool Window 內的連線設定上按下滑鼠右鍵,點選滑鼠右鍵快顯選單上的 Open Terminal 選單選項,或是透過上方的工具列,抑或者是熱鍵 ⌘ + ⇧ + F10。
即可開啟 Terminal 視窗,可在 Terminal 視窗撰寫並調用 Redis 命令。
Link Iedis: Advanced Console
read morePosts
Iedis - Slow log
在 Redis Servers Tool Window 的 Redis 連線上按下滑鼠右鍵,在滑鼠右鍵快顯選單中有個 Slow Log 選單選項,點選該選單選項。
可看到 Redis 執行比較慢的記錄,會有命令名稱、執行時間等。
Link Iedis: Config Monitor
read morePosts
FastoRedis - Install on MAC
FastoRedis 是一跨平台的 Redis GUI 管理工具,可在 FastoRedis 的下載頁面下載該軟體。
下載要安裝的作業系統版本。
筆者這邊下載的是 MAC 的版本,下載後點選下載下來的 dmg 檔,按下 Agree 按鈕同意 License。
將 FastoRedis 拖進 Application 目錄。
就可以透過啟動台將 FastoRedis 軟體啟動來使用。
Link FastoRedis - cross-platform client for Redis, supported main Redis database features like: modules, cluster, sentinel, ssh tunneling.
read morePosts
Redis - LREM command
LREM 命令可以用來移除 Redis List 中指定的元素值。
其語法如下:
LREM key count value LREM 後面帶入 List 的 Key、要刪除的元素個數、要刪除的元素值,回傳值為被移除的元素數量。
其中 count 值如果為正則會從頭到尾找尋符合指定值的元素移除、如果為負則會從尾到頭移除符合指定值的元素、如果為 0 則會移除所有符合指定值的元素。
LREM 命令的時間複雜度為 O(N),N 為 List 的長度。
雖然時間複雜度為 O(N),但是因為該命令會由指定的方向遍巡,且當移除了足夠的元素數量後就會停止遍巡,因此在某些情境下命令使用恰當的話效率其實不會到 O(N) 那麼糟。
像是如果準備 1 - 10000 的 List,然後用 LREM 將資料從尾部移除 1 - 10000。
for i=1,10000 do redis.call('lpush', 'Test123', i) end for i=1, 10000 do redis.call('lrem', 'Test123', -1, i) end 這樣運行起來會是 0.23 s。
如果反過來用 LREM 將資料從頭部移除 1 - 10000。
... for i=1, 10000 do redis.
read morePosts
Redis on Windows
要在 Windows 使用 Redis,可以到這邊下載 Windows 的 Porting 版本。
點擊安裝檔進行安裝。
勾選同意授權。
設定要安裝的位置,這邊也可以勾選順帶設定環境變數。
設定 Redis 要使用的 Port 號,這邊也可以勾選順帶設定防火牆。
設定記憶體使用上限。
安裝完後在指定的安裝位置會看到 Redis 的設定檔,以及 Redis 附帶的一些 CLI Tool,像是 redis-cli、redis-server、redis-benchmark 等。
查看服務也可以看到安裝的 Redis 服務正在背後運行。
更進一步可以使用 Telnet。
或是自帶的 redis-cli 工具進行一下 Redis 的連線測試。
Link MSOpenTech/redis: Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes
read more