常用操作
HSET key field value ???// 存儲(chǔ)一個(gè)哈希表key的鍵值
HMSET key field value [filed value...] ???// 在一個(gè)哈希表key中存儲(chǔ)多個(gè)鍵值對(duì)
HGET key field ???// 獲取哈希表key對(duì)應(yīng)的field鍵值
MHGET key [key...] ???// 批量獲取哈希表key中多個(gè)field鍵值
HDEL key [key...] ???// 刪除哈希表key中的field鍵值
HLEN key ???// 返回哈希表key中 field的數(shù)量
HSETNX key field value ???// 存儲(chǔ)一個(gè)不存在的哈希表key的鍵值
HGETALL key ???// 返回哈希表key中所有的鍵值
HINCRBY key field increment ???// 為哈希表key中field鍵的值加上增量increment
應(yīng)用場(chǎng)景
對(duì)象緩存
HMSET ? user:1 ? name kyo ? balance 100
HMGET ? user:1 ? name ? balance電商購(gòu)物車
- 以用戶id為key
- 商品id為field
- 商品數(shù)量為value
添加商品:hset ? cart:1 ? 10001 ? 1
增加數(shù)量:hincrby ? cart:1 ? 10001 ? 1
商品總數(shù):hlen ? cart:1
刪除商品:hdel ? cart:1 ? 10001
獲取購(gòu)物車所有商品:hgetall ? cart:1
- 游戲中存儲(chǔ)活躍用戶模塊數(shù)據(jù)
- 以用戶id為key
- 模塊數(shù)據(jù)名字為field
- 模塊數(shù)據(jù)值為value
假設(shè)單個(gè)玩家所有模塊數(shù)據(jù)大小為200k,那么Redis開(kāi)辟40m,用來(lái)緩存最近200個(gè)活躍玩家數(shù)據(jù),在線玩家數(shù)據(jù)修改后,定時(shí)回寫到數(shù)據(jù)庫(kù)和redis,對(duì)于頻繁上下線的游戲可以減少上線時(shí)對(duì)數(shù)據(jù)庫(kù)的讀取壓力
保存有修改的玩家數(shù)據(jù):hmset ? user:1 mod1 value1 ? mod2 vlaue2
上線獲取玩家模塊數(shù)據(jù):hgetall ? user:1
可以結(jié)合玩家上線頻率適當(dāng)對(duì)key加上超時(shí),因?yàn)閱蝹€(gè)玩家數(shù)據(jù)都聚合到一個(gè)key,淘汰時(shí)會(huì)整體換出,再次讀取不存在的key時(shí)再到數(shù)據(jù)庫(kù)加載即可,方便管理。
hash結(jié)構(gòu)優(yōu)點(diǎn)
- 同類數(shù)據(jù)歸類整合存儲(chǔ),方便數(shù)據(jù)管理
- 相比string存儲(chǔ)更節(jié)省空間,主要是省在key的長(zhǎng)度上
hash結(jié)構(gòu)缺點(diǎn)
- 過(guò)期功能不能用在field上,只能用在key上
- Redis集群架構(gòu)下不適合大規(guī)模使用,因?yàn)榧簳?huì)根據(jù)key分到不同的槽位,如果單個(gè)key下數(shù)據(jù)量大,所有訪問(wèn)都會(huì)轉(zhuǎn)到指定的槽位,無(wú)法做分片存儲(chǔ)。 所以最好只是單個(gè)用戶下單個(gè)模塊使用hash結(jié)構(gòu)。