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