2020-10-04
REDIS

Redis 基本資料形態

Redis 基本資料形態介紹。

Redis

這篇是比較多人整理過的入門文章,不過最近正好在重新學,就把筆記也隨筆記錄在這裡。

本篇主要是參考 https://www.tutorialspoint.com/redis/index.htm 裡的教學, 我所使用到的英文單字、範例都是參考這篇而來! 這是一篇非常棒的入門教學,有一定程式基礎但是沒有 Redis 經驗的人是可以非常順的一次讀完的。 請一定要加到您的必讀清單內!


Redis 的形態有以下幾種

  • Strings ( 字串 )
  • Hashes ( 鍵值 [Key ⇒ Value] 型式 )
  • Lists ( 陣列 )
  • Sets ( 不重複的陣列 )
  • Sorted Sets ( 有順序的不重複陣列 )
Strings

這是最基本的形態,顧名思義,就是字串。

127.0.0.1:6379> SET name "Wayne Chang"
OK

127.0.0.1:6379> GET name
"Wayne Chang"

這邊使用到的 Redis Command 是 SetGET,他們是 Redis 中對字串形態資料最基本的指令了。

  • name 是我們要設定進去的 key
  • "Wayne Chang" 是字串的 Value

Redis 最高可以支援到 512 megabytes ( 5MB ) 在一個 Strings 的欄位內 ( 真是夠大了 )

Hashes

其實就很像 Java 的 HashMap 那種資料形態,裡面存放這一個一個 Key ⇒ Value 這種 Pair 集合。

他的資料類型像是這樣,一個 user001 裡面是一個 Hash,一個 Hash 裡面又有 name, phone, gender 等等的資訊。

這邊使用到的 Redis Command 是 HSETHGET

127.0.0.1:6379> HSET user001 name "Wayne"
(integer) 1

127.0.0.1:6379> HSET user001 phone "0911234567"
(integer) 1

127.0.0.1:6379> HSET user001 gender "M"
(integer) 1
# HSET 會回傳有多少新的欄位被建立

127.0.0.1:6379> HGET user001 gender
"F"
# 可以使用 HGET 來取得對應 Key 的欄位值
# 此範例為取得 user001 這個 Hash 物件的 gender 欄位值

有些教學會這樣做:

127.0.0.1:6379> HSET user002 name "Wayne" phone "0911234567" gender "F"
(integer) 3
# 可以看到一次對 3 個欄位動作

一次對 user001 中設定三個欄位值,回傳 3 代表新增了三個欄位,個人不太喜歡這樣,因為我的眼睛會看花掉 XDD ( 老了 )。

Lists

這就是很常見的 List 結構。 這邊使用到的 Redis Command 是 LPUSH 跟 LRANGE:

127.0.0.1:6379> LPUSH applelist aa bb cc bb
(integer) 4

127.0.0.1:6379> LRANGE applelist 0 10
1) "bb"
2) "cc"
3) "bb"
4) "aa"
Sets

其實跟 List 一樣,就是資料的集合,只是 Sets 有多一層限制是集合中的值不會重複。 這邊使用到的 Redis Command 是 SADD 跟 SMEMBER 指令:

127.0.0.1:6379> SADD appleset "Red Delicious" "Gala" "Fuji" "Gala" "Granny Smith" "Honeycrisp"
(integer) 5

127.0.0.1:6379> SMEMBERS appleset
1) "Fuji"
2) "Red Delicious"
3) "Granny Smith"
4) "Gala"
5) "Honeycrisp"

# 可以看到,它把我重複設定進去的 "Gala" 拿掉了
Sorted Sets

顧名思義,就是有排序的 Sets 結構,一樣是不重複值的集合,它跟 Sets 的差別在於,Sorted Sets 結構會多一個數字值去作為排序的權重來決定先後順序。

這邊使用到的 Redis Command 是 ZADD、ZRANGEBYSCORE 來操作:

# 1
127.0.0.1:6379> ZADD sortedset 2 "Red Delicious"
(integer) 1
# 2
127.0.0.1:6379> ZADD sortedset 1 "Wayne Change"
(integer) 1
# 3
127.0.0.1:6379> ZADD sortedset 2 "Wayne Zhange"
(integer) 1
# 4
127.0.0.1:6379> ZADD sortedset 1 "Andy Wang"
(integer) 1
# 5
127.0.0.1:6379> ZADD sortedset 1 "Tom Hank"
(integer) 1
# 6
127.0.0.1:6379> ZADD sortedset 2 "Tom Lee"
(integer) 1
# 7
127.0.0.1:6379> ZADD sortedset 100 "Chris Ruby"
(integer) 1
# 8
127.0.0.1:6379> ZADD sortedset 50 "Nico Yazawa"
(integer) 1
# 9
127.0.0.1:6379> ZADD sortedset 0 "Untyped"
(integer) 1

127.0.0.1:6379> ZRANGEBYSCORE sortedset 0 100
1) "Untyped"
2) "Andy Wang"
3) "Tom Hank"
4) "Wayne Change"
5) "Red Delicious"
6) "Tom Lee"
7) "Wayne Zhange"
8) "Nico Yazawa"
9) "Chris Ruby"

# 可以看到在取出來的時候並不是依照寫入的順序,而是依照所指定數字的權重去排序的!

127.0.0.1:6379> ZRANGEBYSCORE sortedset 1 100
1) "Andy Wang"
2) "Tom Hank"
3) "Wayne Change"
4) "Red Delicious"
5) "Tom Lee"
6) "Wayne Zhange"
7) "Nico Yazawa"
8) "Chris Ruby"

# 小補充 如果 ZRANGEBYSCORE 的值範圍外的是不會被查詢出來的哦。

重新整理一次發現自己之前在用的時候真的少看了很多東西,就是直接別人用 Jedis 之類的函式庫包好直接拿來用而已,自己身為使用者也就這樣傻傻的用下去了。 倒也不是說不能用,只是不瞭解背後的實際語法,實在是太不求甚解了。