iT邦幫忙

2021 iThome 鐵人賽

DAY 14
0
Software Development

Redis還在學系列 第 14

Day14 Redis應用實戰-Hash操作

Redis 資料型態Hash

  • Hash是用來儲存多組欄位值,可以是數字或字串.使用者可以對值進行操作,跟資料結構中的dictionary概念很像.

  • 可用指令

    • HSET
    • HSETNX
    • HGET
    • HEXISTS
    • HDEL
    • HLEN
    • HSTRLEN
    • HINCRBY
    • HINCRBYFLOAT
    • HMSET
    • HMGET
    • MKEYS
    • HVALS
    • HGETALL
    • HSCAN
  • 資料結構

    • Hash如果欄位值個數 < 512且總長度 < 64 bytes,則使用ziplist,其餘使用hashtable.

HSET

設定hash可以有多個field and value 組成.

127.0.0.1:6379> hset books name abc price 10
(integer) 2

# 底層資料結構為ziplist
127.0.0.1:6379> object encoding books
"ziplist"

HKEYS

取得hash中所有的field.

127.0.0.1:6379> hset books name abc price 10
(integer) 2

127.0.0.1:6379> hkeys books
1) "name"
2) "price"

HVALS

取得hash中所有的value.

127.0.0.1:6379> hset books name abc price 10
(integer) 2

127.0.0.1:6379> hvals books
1) "abc"
2) "10"

HGETALL

取得hash中所有的field and value.

127.0.0.1:6379> hset books name abc price 10
(integer) 2

127.0.0.1:6379> hgetall books
1) "name"
2) "abc"
3) "price"
4) "10"

HGET

取得hash中指定field的value.

127.0.0.1:6379> hset books name abc price 10
(integer) 2

127.0.0.1:6379> hget books name
"abc"

127.0.0.1:6379> hget books price
"10"

127.0.0.1:6379> hget books no
(nil)

HINCRBY

設定hash中指定的field的value依照設定數值進行遞增.

127.0.0.1:6379> hset books name abc price 10
(integer) 2

127.0.0.1:6379> hincrby books price 1
(integer) 11

127.0.0.1:6379> hget books price
"11"

HINCRBYFLOAT

設定hash中指定的field的value依照設定浮點數值進行遞增.

127.0.0.1:6379> hset books name abc price 10 discountrate 0.2
(integer) 3

127.0.0.1:6379> hincrbyfloat books discountrate 0.5
"0.7"

127.0.0.1:6379> hget books discountrate
"0.7"

HDEL

刪除hash中指定field.

127.0.0.1:6379> hset books name abc price 10 discountrate 0.2
(integer) 3

127.0.0.1:6379> hget books discountrate
"0.7"

127.0.0.1:6379> hdel books discountrate
(integer) 1

127.0.0.1:6379> hget books discountrate
(nil)

HMGET

取得hash中多個指定field的value.

127.0.0.1:6379> hset books name abc price 10
(integer) 2

127.0.0.1:6379> hmget books name price
1) "abc"
2) "10"

HMSET

設定hash中key的多個指定field的value.

127.0.0.1:6379> hset books name abc price 10
(integer) 2

127.0.0.1:6379> hmget books name price
1) "abc"
2) "10"

127.0.0.1:6379> hmset books name def price 33
OK

127.0.0.1:6379> hmget books name price
1) "def"
2) "33"

HSETNX

設定hash中key的field和value但需要不存在既有的fiels時才寫入field與value.

127.0.0.1:6379> hset books name abc price 10
(integer) 2

# 目前設定books所有的field and value
127.0.0.1:6379> hgetall books
1) "name"
2) "abc"
3) "price"
4) "10"

# 需要設定books中field name的value會失敗
127.0.0.1:6379> hsetnx books name def
(integer) 0

127.0.0.1:6379> hgetall books
1) "name"
2) "abc"
3) "price"
4) "10"

# 需要設定books中field discountrate的value因此field不存在所以成功
127.0.0.1:6379> hsetnx books discountrate 0.2
(integer) 1

127.0.0.1:6379> hgetall books
1) "name"
2) "abc"
3) "price"
4) "10"
5) "discountrate"
6) "0.2"


HEXISTS

確認hash中key指定的field是否存在.

127.0.0.1:6379> hset books name abc price 10
(integer) 2

127.0.0.1:6379> hgetall books
1) "name"
2) "abc"
3) "price"
4) "10"

# books中的field name 存在
127.0.0.1:6379> hexists books name
(integer) 1

# books中的field discountrate 不存在
127.0.0.1:6379> hexists books discountrate
(integer) 0

HLEN

取得hash key中的field個數.

127.0.0.1:6379> hset books name abc price 10
(integer) 2

127.0.0.1:6379> hlen books
(integer) 2

HSTRLEN

取得hash key中指定field的value字串長度.

127.0.0.1:6379> hset books name abc price 10
(integer) 2

127.0.0.1:6379> hstrlen books name
(integer) 3

HSCAN

掃描hash key中指定field 特定match pattern與次數.

# 存在name
127.0.0.1:6379> hscan books 0 match name count 1
1) "0"
2) 1) "name"
   2) "abc"

# 不存在discountrate
127.0.0.1:6379> hscan books 0 match discountrate
1) "0"
2) (empty array)

Hash 與 String 優缺點比較

  • Hash優點

    • 將所有相關的field and value放在同一個key中儲存,減少記憶體消耗
    • 多個field只需要一個key,減少key重覆的可能
    • 可以一次存取多個field and value只需要一個取得key的指令,減少CPU與記憶體的消耗
    • String能做到的Hash也都可以
  • Hash缺點

    • Field不能設定過期時間
    • 沒有bit相關操作
    • 當值很大時,無法分散到其他伺服器(Redis Cluster架構)

上一篇
Day13 Redis應用實戰-List操作
下一篇
Day15 Redis應用實戰-Set操作
系列文
Redis還在學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言