
🌈 個人主頁:Zfox_
🔥 系列專欄:Redis

🔥 安裝 Redis
- 使?apt安裝
apt install redis -y
- ?持遠程連接
- 修改
/etc/redis/redis.conf
- 修改
bind 127.0.0.1
為bind 0.0.0.0
- 修改
protected-mode yes
為protected-mode no
- 修改
- 控制
Redis
啟動
- 啟動
Redis
服務
service redis-server start
- 停?
Redis
服務
service redis-server stop
- 重啟
Redis
服務
service redis-server restart
- 查看
Redis
服務狀態
service redis-server status
- 持久化?件存儲?錄
/var/lib/redis/
Redis持久化?產的RDB和AOF?件都默認?成于該?錄下。后邊章節我們講到持久化時會觀察這邊持久化的?些現象。
- ?志?件?錄
/var/log/redis/
/var/log/redis/?錄下會保存Redis運?期間?產的?志?件,默認按照天進?分割,并且會將?定?期的???件使?gzip格式壓縮保存。可以使?任意?本編輯器打開,后邊章節我們會通過?志來觀察?些現象。
🔥 Redis命令?客戶端
🐳 現在我們已經啟動了Redis服務,下?將介紹如何使? redis-cli
連接、操作Redis服務。
redis-cli
可以使?兩種?式連接Redis服務器。
- 第?種是交互式?式:通過
redis-cli-h{host}-p{port}
的?式連接到Redis
服務,后續所有的操作都是通過交互式的?式實現,不需要再執?redis-cli
了,例如:
[root@host ~]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set key hello
OK
127.0.0.1:6379> get key
"hello"
- 第?種是命令?式:?
redis-cli-h{host}-p{port}{command}
就可以直接得到命令的返回結果,例如:
[root@host ~]# redis-cli -h 127.0.0.1 -p 6379 ping
PONG
[root@host ~]# redis-cli -h 127.0.0.1 -p 6379 set key hello
OK
[root@host ~]# redis-cli -h 127.0.0.1 -p 6379 get key
"hello"
這?有兩點要注意:
1)由于我們連接的Redis
服務位于127.0.0.1,端?也使?的是默認的6379端?,所以可以省略-h{host}-p{port}
2)Redis
是學習Redis的重要?具,后續的?量章節都是?它來做講解。
有關redis-cli
提供的更為強?的功能將在后續章節做詳細介紹。
圖Redis
客?端與服務端的交互過程
🔥 Redis 常用命令
本篇開始對于 Redis 的命令進行學習,當然只是學習一些常見的
🦋 get 和 set
🦈 Redis
中是使用鍵值對來進行存儲的,所以 get 是根據 key 來取 Value 的,而 set 是來設置鍵值對的
set? \colorbox{pink}{ set } ?set??
set [key] [value]
127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> set key3 value3
OK
127.0.0.1:6379> set 'key2' "value2"
OK
get? \colorbox{pink}{ get } ?get??
get [key]
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> get key2
"value2"
127.0.0.1:6379> get key3
"value3"
127.0.0.1:6379> get key100
(nil)
🦋 Redis 全局命令
keys
Redis
可以看成是一個網絡版本的哈希表,它支持很多的數據結構,key 固定是字符串,但是 Value可以是多種多樣的數據結構,下面講述的就是全局命令,可以搭配各種各樣的數據結構
keys [pattern]
該命令可以看到的是每一個 key 的模樣,同時也可以允許存在通配符等
時間復雜度:O(N)
pattern 是什么?
表示的意思是,一個包含特殊符號的字符串,存在的意義是來描述,找的字符串是什么樣子的
h?llo
匹配 hello , hallo 和 hxlloh*llo
匹配 hllo 和 heeeelloh[ae]llo
匹配 hello 和 hallo 但不匹配 hilloh[^e]llo
匹配 hallo , hbllo , … 但不匹配 helloh[a-b]llo
匹配 hallo 和 hbllo
先插入幾個鍵值對:
127.0.0.1:6379> set hello 1
OK
127.0.0.1:6379> set hallo 2
OK
127.0.0.1:6379> set hbllo 3
OK
127.0.0.1:6379> set hllo 4
OK
127.0.0.1:6379> set heeeeeeeeeeeeelo 5
OK
?匹配的是任意一個字符
127.0.0.1:6379> keys h?llo
1) "hallo"
2) "hello"
3) "hbllo"
- 匹配的是0個或者任意字符
127.0.0.1:6379> keys h*llo
1) "hllo"
2) "hallo"
3) "hello"
4) "hbllo"
[abcde]表示匹配這里面的某個選項
127.0.0.1:6379> keys h[abc]llo
1) "hallo"
2) "hbllo"
[^e] 表示排除e,除了e都行
127.0.0.1:6379> keys h[^a]llo
1) "hello"
2) "hbllo"
[a-b] 表示的是a-b范圍內的字符都行
127.0.0.1:6379> keys h[a-b]llo
1) "hallo"
2) "hbllo"
注意事項
keys 命令的時間復雜度是O(N),所以一般會禁止使用keys,尤其是keys *
127.0.0.1:6379> keys *
1) "hllo"
2) "heeeeeeeeeeeeelo"
3) "hallo"
4) "hello"
5) "key1"
6) "key3"
7) "hbllo"
8) "key2"
Redis 是單線程的,所以當執行 keys 的時候可能會導致阻塞,這是一件不可容忍的事,因此一般禁止
Redis 經常會用于做緩存,擋在 mysql 前面,替 mysql 負重前行的人,萬一 Redis 被一個 keys*阻塞住了,此時其他的查詢 Redis 操作就超時了此時這些請求就會直接查數據庫,突然一大波請求過來了, mysql 措手不及,就容易掛了,整個系統就基本癱瘓了
EXISTS
exists key [key ...]
127.0.0.1:6379> keys *
1) "hllo"
2) "heeeeeeeeeeeeelo"
3) "hallo"
4) "hello"
5) "key1"
6) "key3"
7) "hbllo"
8) "key2"127.0.0.1:6379> exists hello hallo
(integer) 2
那為什么要這樣進行一次請求多個呢?這是考慮到了網絡服務,Redis 和 HTTP 的請求響應機制是一樣的,這就意味著如果每次都請求,會消耗一定的網絡資源,但是如果采用一次去檢查多個的情況(減少網絡通信的次數),就不會這樣,相當于會節省一部分的網絡資源
DEL
刪除指定 key
DEL key [key ...]
這個命令相對比較簡單,這里就不再進行贅述了,就是一個刪除的命令
127.0.0.1:6379> keys *
1) "hllo"
2) "heeeeeeeeeeeeelo"
3) "hallo"
4) "hello"
5) "key1"
6) "key3"
7) "hbllo"
8) "key2"127.0.0.1:6379> del hllo hallo
(integer) 2127.0.0.1:6379> keys *
1) "heeeeeeeeeeeeelo"
2) "hello"
3) "key1"
4) "key3"
5) "hbllo"
6) "key2"
這里值得注意的是,Redis 數據被刪除,要看它是否是一個數據庫,如果它作為緩存,那問題不算特別大,但是如果是作為數據庫,那就相當于在 MySQL 中丟失了數據,這就是一個比較嚴重的錯誤了
針對于 Redis 的誤刪數據的錯誤,要根據具體情況具體分析
EXPIRE
expire 的作用是給指定的 key 設置過期時間,key 存活時間超過這個指定的值,就會被自動刪除
expire key seconds
返回值:1表示設置成功。0表示設置失敗
要注意的是,expire 的 key 值,必須得是已經存在的 key 值,如果不是存在的 key 值是不可以被設置過期時間的
127.0.0.1:6379> keys *
1) "heeeeeeeeeeeeelo"
2) "hello"
3) "key1"
4) "key3"
5) "hbllo"
6) "key2"127.0.0.1:6379> expire key2 3
(integer) 1127.0.0.1:6379> keys *
1) "heeeeeeeeeeeeelo"
2) "hello"
3) "key1"
4) "key3"
5) "hbllo"
6) "key2"127.0.0.1:6379> expire key2 3
(integer) 0127.0.0.1:6379> keys *
1) "heeeeeeeeeeeeelo"
2) "hello"
3) "key1"
4) "key3"
5) "hbllo"
TTL
查詢過期時間的命令叫做 ttl,全稱是 time to live
TTL key
返回值:剩余過期時間。-1表?沒有關聯過期時間,-2表?key不存在。
redis> SET mykey "Hello"
"OK"
redis> EXPIRE mykey 10
(integer) 1
redis> TTL mykey
(integer) 10
EXPIRE和TTL命令都有對應的?持毫秒為單位的版本:PEXPIRE和PTTL,詳細?法就不再介紹了。
鍵的過期機制
🦋 Redis 的刪除策略
對于刪除來說,到底該選用哪種策略呢?下面給出兩種策略
- 先說一下 「惰性刪除」:
假設現在這個
key
已經到達過期時間了,但是暫時還沒刪除它,key
還是存在的,當下一次進行訪問的時候,正好用到了這個key
,此時就會讓Redis
觸發刪除的操作,并且返回一個nil
- 下面說一下「定期刪除」:
定期刪除,就是在一個定期時間內進行檢測,但是定期刪除是要有一定條件的,原因在于
Redis
是一個單線程的程序,如果掃描key
的時間太多,就會導致被阻塞,形成的效果和keys *
差不多
TYPE
返回key對應的 value 數據類型。
TYPE key
返回值: none , string , list , set , zset , hash and stream
redis> SET key1 "value"
"OK"
redis> LPUSH key2 "value"
(integer) 1
redis> SADD key3 "value"
(integer) 1
redis> TYPE key1
"string"
redis> TYPE key2
"list"
redis> TYPE key3
"set"
本?結只是拋磚引?,給出?個通?的命令,為5種數據結構的使?做?個熱?,后續章節將對鍵管理做?個更為詳細的介紹。
🔥 共勉
😋 以上就是我對 Redis:安裝與常用命令
的理解, 覺得這篇博客對你有幫助的,可以點贊收藏關注支持一波~ 😉