Redis key鍵的具體使用
Redis 是一種鍵值(key-value)型的緩存型數(shù)據(jù)庫(kù),它將數(shù)據(jù)全部以鍵值對(duì)的形式存儲(chǔ)在內(nèi)存中,并且 key 與 value 一一對(duì)應(yīng)。這里的 key 被形象的稱之為密鑰,Redis 提供了諸多操作這把“密鑰”的命令,從而實(shí)現(xiàn)了對(duì)存儲(chǔ)數(shù)據(jù)的管理。
你可以把 key 看成 value 的變量,通過(guò)檢索 key 就可以找到對(duì)應(yīng)的 value 值。
為了更加全面的了解 key,我們將從以下三個(gè)維度做深入講解:
- key 的類型
- key 的命名規(guī)范
- key 的過(guò)期時(shí)間
了解key的特點(diǎn)
1) key的類型
key 的類型對(duì)應(yīng)著 value 的類型,同樣也有五種(string、list、hash、set、zset)。如果 key 指向的是一個(gè)字符串類型的值,那么 key 的類型就是字符串。我們可以通過(guò)TYPE
命令來(lái)查看 key 的類型,示例如下:
# 字符串 redis> SET weather "sunny" OK redis> TYPE weather string # 列表 redis> LPUSH book_list "programming in scala" (integer) 1 redis> TYPE book_list list # 集合 redis> SADD pat "dog" (integer) 1 redis> TYPE pat set
2) key的命名規(guī)范
key 的命名需要遵循以下規(guī)則:
- key 取值不可以太長(zhǎng),否則會(huì)影響 value 的查找效率,并且浪費(fèi)內(nèi)存空間。
- key 取值也不能過(guò)短,否則會(huì)使得 key 可讀性變差。
在 key 的取值上, Redis 官方建議使用“見(jiàn)名知意”的字符串格式,因?yàn)檫@樣便于我們理解 key 的含義。比如要現(xiàn)在存放一個(gè)用戶的姓名,其信息如下:
id | name |
---|---|
01 | XiaoHong |
我們使用一個(gè) key 來(lái)存儲(chǔ)用戶的名字,key 的設(shè)置如下所示:
127.0.0.1:6379> set user:id:01:username XiaoHong OK
上述示例,自定義了uesr:id:01:username
這個(gè) key,通過(guò) key 不僅可以知道用戶的 id,還可以知道這個(gè) key 是用來(lái)存儲(chǔ)用戶名字的。注意,這里的:
只是起到分割符的作用,并不是固定的語(yǔ)法格式。
注意:在符合業(yè)務(wù)場(chǎng)景情況下,key 要盡可能的簡(jiǎn)單明了,您可以使用單詞的縮寫(xiě),或者自定義縮寫(xiě)格式。
在 Redis 中,我們也可以將一個(gè)空字符串設(shè)置成 key,示例如下:
127.0.0.1:6379> SET "" mp.CSDN.net OK 127.0.0.1:6379> GET "" "mp.CSDN.net"
key 的類型并不局限于字符串,在 Redis 中 key 具有二進(jìn)制安全的特性,這意味著它可以使用任何二進(jìn)制序列,但是這種 key 過(guò)于復(fù)雜一般不建議采用。總之,“見(jiàn)名知意”就是 key 最佳的命名規(guī)范。
對(duì)于相同數(shù)據(jù)類型而言,如果您對(duì)已經(jīng)存在的 key 重新設(shè)置了新的 value,那么原來(lái)的 value 就會(huì)被覆蓋掉。因此,您可以用這種方法來(lái)修改 key 存儲(chǔ)的值。
3) key過(guò)期時(shí)間
Redis 允許你為 key 設(shè)置一個(gè)過(guò)期時(shí)間(使用 EXPIRE 等命令),也就是“到點(diǎn)自動(dòng)刪除”,這在實(shí)際業(yè)務(wù)中是非常有用的,一是它可以避免使用頻率不高的 key 長(zhǎng)期存在,從而占用內(nèi)存資源;二是控制緩存的失效時(shí)間。
Redis 會(huì)把每個(gè)設(shè)置了過(guò)期時(shí)間的 key 存放到一個(gè)獨(dú)立的字典中,并且會(huì)定時(shí)遍歷這個(gè)字典來(lái)刪除到期的 key。除了定時(shí)遍歷之外,它還會(huì)使用“惰性策略”來(lái)刪除過(guò)期的 key。所謂“惰性策略”指的是當(dāng)客戶端訪問(wèn)這個(gè) key 的時(shí)候,Redis 對(duì) key 的過(guò)期時(shí)間進(jìn)行檢查,如果過(guò)期了就立即刪除。Redis 使用兩種方式相結(jié)合的方法來(lái)處理過(guò)去的 key。
過(guò)期時(shí)間,有許多的應(yīng)用場(chǎng)景,比如購(gòu)物 App 會(huì)在特定的時(shí)間節(jié)點(diǎn)推出相關(guān)的活動(dòng),比如雙十一、雙十二、618購(gòu)物節(jié)等,這些活動(dòng)都是一年一度如期開(kāi)辦,因此當(dāng)下一期舉行時(shí),上一期的活動(dòng)的數(shù)據(jù)就沒(méi)有意義了,在這種情景下就可以給 key 設(shè)置一個(gè)過(guò)期時(shí)間,從而減少無(wú)用數(shù)據(jù)占用內(nèi)存資源。
Redis key命令格式
了解完 key 的相關(guān)規(guī)范,接下來(lái)看一下和 key 相關(guān)的命令,它的語(yǔ)法格式如下所示:
redis 127.0.0.1:6379> COMMAND KEY_NAME
- COMMAND:表示 key 的命令;
- KEY_NAME:表示 key 的名字。
通過(guò)示例進(jìn)一步說(shuō)明,DEL
代表刪除命令,而 www.biancheng.net 是鍵。如果成功刪除了鍵,則將的返回整數(shù) 1,否則將返回整數(shù) 0。示例如下:
redis 127.0.0.1:6379> SET www.CSDN.net "CSDN你好" OK #刪除key redis 127.0.0.1:6379> DEL www.CSDN.net (integer) 1 #若鍵不存在刪除失敗 redis 127.0.0.1:6379> DEL age (integer) 0
Redis鍵命令匯總
下表對(duì)常用的 Redis 鍵命令做了簡(jiǎn)單的總結(jié):
Redis 鍵命令
命令 | 說(shuō)明 |
---|---|
DEL key | 若鍵存在的情況下,該命令用于刪除鍵。 |
DUMP key | 用于序列化給定 key ,并返回被序列化的值。 |
EXISTS key | 用于檢查鍵是否存在,若存在則返回 1,否則返回 0。 |
EXPIRE key | 設(shè)置 key 的過(guò)期時(shí)間,以秒為單位。 |
EXPIREAT key | 該命令與 EXPIRE 相似,用于為 key 設(shè)置過(guò)期時(shí)間,不同在于,它的時(shí)間參數(shù)值采用的是時(shí)間戳格式。 |
PEXPIRE key | 設(shè)置 key 的過(guò)期,以毫秒為單位。 |
PEXPIREAT key | 與 PEXPIRE 相似,用于為 key 設(shè)置過(guò)期時(shí)間,采用以毫秒為單位的時(shí)間戳格式。 |
KEYS pattern | 此命令用于查找與指定 pattern 匹配的 key。 |
MOVE key db | 將當(dāng)前數(shù)據(jù)庫(kù)中的 key 移動(dòng)至指定的數(shù)據(jù)庫(kù)中(默認(rèn)存儲(chǔ)為 0 庫(kù),可選 1-15中的任意庫(kù))。 |
PERSIST key | 該命令用于刪除 key 的過(guò)期時(shí)間,然后 key 將一直存在,不會(huì)過(guò)期。 |
PTTL key | 用于檢查 key 還剩多長(zhǎng)時(shí)間過(guò)期,以毫秒為單位。 |
TTL key | 用于檢查 key 還剩多長(zhǎng)時(shí)間過(guò)期,以秒為單位。 |
RANDOMKEY | 從當(dāng)前數(shù)據(jù)庫(kù)中隨機(jī)返回一個(gè) key。 |
RENAME key newkey | 修改 key 的名稱。 |
RENAMENX key newkey | 如果新鍵名不重復(fù),則將 key 修改為 newkey。 |
SCAN cursor | 基于游標(biāo)的迭代器,用于迭代數(shù)據(jù)庫(kù)中存在的所有鍵,cursor 指的是迭代游標(biāo)。 |
TYPE key | 該命令用于獲取 value 的數(shù)據(jù)類型。 |
常用命令演示
下面對(duì)一些較難理解的命令做實(shí)例演示:
1) DUMP序列化
該命令用于將鍵對(duì)應(yīng)的值做序列化處理,實(shí)例如下:
127.0.0.1:6379> SET num 12 OK 127.0.0.1:6379> DUMP num "\x00\xc0\x0c\t\x00\xec\xd8\xa9\x9d\b\x82\xdfd"
如果 key 不存在時(shí),則返回 nil。
2) EXPIRE設(shè)置過(guò)期時(shí)間
該命令用于設(shè)置 key 的過(guò)期時(shí)間,當(dāng) key 過(guò)期后將不可以再使用。
127.0.0.1:6379> set www.CSDN.net Python OK 127.0.0.1:6379> set www.CSDN.net Python EX 60 OK 127.0.0.1:6379> EXPIRE www.CSDN.net 120 (integer) 1
上面介紹了兩種設(shè)置過(guò)期時(shí)間的方法,它們都可以實(shí)現(xiàn)過(guò)期時(shí)間設(shè)置,key 過(guò)期后將自動(dòng)被刪除。
3) PEXPIREAT設(shè)置過(guò)期時(shí)間
以時(shí)間戳格式設(shè)置過(guò)期時(shí)間,并以毫秒為單位。
127.0.0.1:6379> set www.CSDN.net Python OK 127.0.0.1:6379> PEXPIREAT www.CSDN.net 12000000000 (integer) 1
設(shè)置成功返回 1,若 key 不存在或者不能為其設(shè)置過(guò)期時(shí)間,則返回 0。
4) KEYS命令查找鍵
查找指定模式的鍵。
redis 127.0.0.1:6379> SET course1 redis OK redis 127.0.0.1:6379> SET course2 php OK redis 127.0.0.1:6379> SET course3 python OK 127.0.0.1:6379> keys course* 1) "course1" 2) "course2" 3) "course3" #獲取所有key 127.0.0.1:6379> keys * 1) "course1" 2) "course2" 3) "course3" 4) "num" 5) "www.CSDN.net"
注意:keys * 會(huì)返回當(dāng)前庫(kù)中所有的鍵。
5) SCAN cursor
SCAN 命令是一個(gè)基于游標(biāo)的迭代器,每次被調(diào)用之后, 都會(huì)向用戶返回一個(gè)新的游標(biāo), 用戶在下次迭代時(shí)需要使用這個(gè)新游標(biāo)作為 SCAN 命令的游標(biāo)參數(shù), 否則將無(wú)法繼續(xù)跌代。如果新游標(biāo)返回 0 則表示迭代結(jié)束。
SCAN 命令的語(yǔ)法格式如下:
SCAN cursor [MATCH pattern] [COUNT count]
參數(shù)說(shuō)明:
- cursor :指定游標(biāo),從 0 開(kāi)始新的迭代。
- pattern:指定匹配的模式。
- count:返回多少個(gè)元素,默認(rèn)值為 10 。
SCAN 令可以迭代數(shù)據(jù)庫(kù)中的所有鍵,如果想針對(duì)特定的數(shù)據(jù)類型迭代,那么命令自然也要做相應(yīng)的變化。如下所示:
- SSCAN 命令用于迭代集合鍵中的元素。
- HSCAN 命令用于迭代哈希鍵中的鍵值對(duì)。
- ZSCAN 命令用于迭代有序集合中的元素。
該命令的使用示例如下:
127.0.0.1:6379> SCAN 0 1) "3" 2) 1) "name" 2) "website" 3) "CSDN2" 4) "www.CSDN.net" 5) "CSDN3" 6) "CSDN1" 7) "course2" 8) "topic" 9) "course1" 10) "age" 127.0.0.1:6379> SCAN 3 1) "0" 2) 1) "CSDN" 2) "course3" 3) "userid:1" 4) "num"
6) TTL命令
在 key 設(shè)置過(guò)期時(shí)間的情況下,使用該命令檢查 key 剩余的過(guò)期時(shí)間。
當(dāng)鍵沒(méi)有設(shè)置過(guò)期時(shí)間,表示是永久有效時(shí),TTL 命令返回 -1;當(dāng)鍵過(guò)期或者被刪除時(shí),TTL 命令返回 -2。示例如下:
127.0.0.1:6379> SET www.CSDN.net hello OK 127.0.0.1:6379> ttl www.CSDN.net (integer) -1 127.0.0.1:6379> SET user:1 Jack EX 120 OK 127.0.0.1:6379> TTL user:1 (integer) 108 127.0.0.1:6379> DEL user:1 (integer) 1 127.0.0.1:6379> TTL user:1 (integer) -2
到此這篇關(guān)于Redis key鍵的具體使用的文章就介紹到這了,更多相關(guān)Redis key鍵內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis中的配置文件,數(shù)據(jù)持久化,事務(wù)
這篇文章主要介紹了Redis中的配置文件,數(shù)據(jù)持久化,事務(wù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2022-12-12淺析PHP分布式中Redis實(shí)現(xiàn)Session的方法
這篇文章主要介紹了PHP分布式中Redis實(shí)現(xiàn)Session的方法,文中詳細(xì)介紹了兩種方法的使用方法,并給出了測(cè)試的示例代碼,有需要的朋友可以參考借鑒,下面來(lái)一起看看吧,2016-12-12基于redis實(shí)現(xiàn)的點(diǎn)贊功能設(shè)計(jì)思路詳解
點(diǎn)贊是我們現(xiàn)在經(jīng)常見(jiàn)到的一個(gè)效果,如朋友圈、微博都有點(diǎn)贊的效果,下面這篇文章主要跟大家分享了基于redis實(shí)現(xiàn)的點(diǎn)贊功能設(shè)計(jì)思路的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家實(shí)現(xiàn)點(diǎn)贊功能具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-05-05分布式鎖為什么要選擇Zookeeper而不是Redis?看完這篇你就明白了
Zookeeper的機(jī)制可以保證分布式鎖實(shí)現(xiàn)業(yè)務(wù)代碼簡(jiǎn)單,成本低,Redis如果要解決分布式鎖的問(wèn)題,對(duì)于一些復(fù)雜的情況,很難解決,成本較高,這篇文章重點(diǎn)給大家介紹分布式鎖選擇Zookeeper 而不是Redis的理由,一起看看吧2021-05-05