Redis緩存應(yīng)用基礎(chǔ)
1、Redis簡介
Redis是一個key-value存儲系統(tǒng)。和Memcached類似,它支持存儲的value類型相對更多:String(字符串)、List(鏈表)、Set(集合)、ZSet(有序集合)和Hash(哈希類型)。與Memcached一樣,為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中。較大區(qū)別是Redis會周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎(chǔ)上實現(xiàn)了master-slave(主從)同步。
Redis 是一個高性能的key-value數(shù)據(jù)庫。目前相對較優(yōu)秀的NoSQL數(shù)據(jù)庫。單線程支持10w+QPS。
2、Redis安裝 (Mac OSX)
- 官網(wǎng) https://redis.io 下載最新版本,目前是Redis 5.0.3;
2)本地文件解壓到目錄:/usr/local/redis-5.0.3
3)編譯源程序,進入redis目錄
make
4)啟動redis服務(wù),進入Redis/bin目錄
./redis-server ../redis.conf
? bin ./redis-server ../redis.conf
30578:C 18 Mar 2019 17:43:18.825 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
30578:C 18 Mar 2019 17:43:18.825 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=30578, just started
30578:C 18 Mar 2019 17:43:18.825 # Configuration loaded
30578:M 18 Mar 2019 17:43:18.826 * Increased maximum number of open files to 10032 (it was originally set to 256).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 5.0.3 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 30578
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
30578:M 18 Mar 2019 17:43:18.827 # Server initialized
30578:M 18 Mar 2019 17:43:18.828 * DB loaded from disk: 0.000 seconds
30578:M 18 Mar 2019 17:43:18.828 * Ready to accept connections
5)通過redis-cli連接使用
./redis-cli
-rwxrwxrwx 1 root staff 247K 2 13 16:48 redis-cli
-rwxrwxrwx 1 root staff 1.3M 2 13 16:48 redis-server
? bin ./redis-cli
127.0.0.1:6379> keys *
6)Redis的配置文件
```
daemonize:如需要在后臺運行,把該項的值改為yes
pdifile:把pid文件放在/var/run/redis.pid,可以配置到其他地址
bind:指定redis只接收來自該IP的請求,如果不設(shè)置,那么將處理所有請求,在生產(chǎn)環(huán)節(jié)中最好設(shè)置該項
port:監(jiān)聽端口,默認為6379
timeout:設(shè)置客戶端連接時的超時時間,單位為秒
loglevel:等級分為4級,debug,revbose,notice和warning。生產(chǎn)環(huán)境下一般開啟notice
logfile:配置log文件地址,默認使用標準輸出,即打印在命令行終端的端口上
database:設(shè)置數(shù)據(jù)庫的個數(shù),默認使用的數(shù)據(jù)庫是0
save:設(shè)置redis進行數(shù)據(jù)庫鏡像的頻率
rdbcompression:在進行鏡像備份時,是否進行壓縮
dbfilename:鏡像備份文件的文件名
dir:數(shù)據(jù)庫鏡像備份的文件放置的路徑
slaveof:設(shè)置該數(shù)據(jù)庫為其他數(shù)據(jù)庫的從數(shù)據(jù)庫
masterauth:當主數(shù)據(jù)庫連接需要密碼驗證時,在這里設(shè)定
requirepass:設(shè)置客戶端連接后進行任何其他指定前需要使用的密碼
maxclients:限制同時連接的客戶端數(shù)量
maxmemory:設(shè)置redis能夠使用的最大內(nèi)存
appendonly:開啟appendonly模式后,redis會把每一次所接收到的寫操作都追加到appendonly.aof文件中,當redis重新啟動時,會從該文件恢復(fù)出之前的狀態(tài)
appendfsync:設(shè)置appendonly.aof文件進行同步的頻率
vm_enabled:是否開啟虛擬內(nèi)存支持
vm_swap_file:設(shè)置虛擬內(nèi)存的交換文件的路徑
vm_max_momery:設(shè)置開啟虛擬內(nèi)存后,redis將使用的最大物理內(nèi)存的大小,默認為0
vm_page_size:設(shè)置虛擬內(nèi)存頁的大小
vm_pages:設(shè)置交換文件的總的page數(shù)量
vm_max_thrrads:設(shè)置vm IO同時使用的線程數(shù)量
```
3、基本命令應(yīng)用
1)String 字符串
127.0.0.1:6379> SET name Brace
OK
127.0.0.1:6379> get name
"Brace"
127.0.0.1:6379> setnx name Good
(integer) 0
127.0.0.1:6379>
重點說明 SETNX
只在鍵 key 不存在的情況下, 將鍵 key 的值設(shè)置為 value 。
若鍵 key 已經(jīng)存在, 則 SETNX 命令不做任何動作。
SETNX 是『SET if Not eXists』(如果不存在,則 SET)的簡寫。
返回值
命令在設(shè)置成功時返回 1 , 設(shè)置失敗時返回 0 。
SETEX:常用的SETEX ,當我們設(shè)置key的值時,同時會設(shè)置其過期時間。
將鍵 key 的值設(shè)置為 value , 并將鍵 key 的生存時間設(shè)置為 seconds 秒鐘。
如果鍵 key 已經(jīng)存在, 那么 SETEX 命令將覆蓋已有的值。
SETEX 命令的效果和以下兩個命令的效果類似:
SET key value
EXPIRE key seconds # 設(shè)置生存時間
SETEX 和這兩個命令的不同之處在于 SETEX 是一個原子(atomic)操作, 它可以在同一時間內(nèi)完成設(shè)置值和設(shè)置過期時間這兩個操作, 因此 SETEX 命令在儲存緩存的時候非常實用。
返回值
命令在設(shè)置成功時返回 OK 。 當 seconds 參數(shù)不合法時, 命令將返回一個錯誤
2)HASH 哈希表
```
127.0.0.1:6379> hset hName nickname "zhangsan"
(integer) 1
127.0.0.1:6379> hget hName nickname
"zhangsan"
127.0.0.1:6379> hexists hName nickname
(integer) 1
127.0.0.1:6379> hexists hName uid
(integer) 0
127.0.0.1:6379> hlen hName
(integer) 1
127.0.0.1:6379> hincrby hName uid 3
(integer) 3
127.0.0.1:6379> hget hName uid
"3"
127.0.0.1:6379> hset hName age 20
(integer) 1
127.0.0.1:6379> hmset hName nickname "lisi" age 12
OK
127.0.0.1:6379> hmget hName nickname uid age
1) "lisi"
2) "3"
3) "12"
127.0.0.1:6379> hkeys hName
1) "nickname"
2) "uid"
3) "age"
127.0.0.1:6379> hvals hName
1) "lisi"
2) "3"
3) "12"
127.0.0.1:6379> hgetall hName
1) "nickname"
2) "lisi"
3) "uid"
4) "3"
5) "age"
6) "12"
127.0.0.1:6379>
```
- LIST 列表
BRPOP 是列表的阻塞式(blocking)彈出原語。
它是 RPOP key 命令的阻塞版本,當給定列表內(nèi)沒有任何元素可供彈出的時候,連接將被 BRPOP 命令阻塞,直到等待超時或發(fā)現(xiàn)可彈出元素為止。
當給定多個 key 參數(shù)時,按參數(shù) key 的先后順序依次檢查各個列表,彈出第一個非空列表的尾部元素。
關(guān)于阻塞操作的更多信息,請查看 BLPOP key [key …] timeout 命令, BRPOP 除了彈出元素的位置和 BLPOP key [key …] timeout 不同之外,其他表現(xiàn)一致。
返回值
假如在指定時間內(nèi)沒有任何元素被彈出,則返回一個 nil 和等待時長。 反之,返回一個含有兩個元素的列表,第一個元素是被彈出元素所屬的 key ,第二個元素是被彈出元素的值。
127.0.0.1:6379> LPUSH list 1 2 3 4 5
(integer) 5
127.0.0.1:6379> LPUSH list 6
(integer) 6
127.0.0.1:6379> lrange list 0 6
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
127.0.0.1:6379> lpop list
"6"
127.0.0.1:6379> rpop list
"1"
127.0.0.1:6379> rpoplpush list list2
"2"
127.0.0.1:6379> lrange list2 0 5
1) "2"
127.0.0.1:6379> lrange list 0 5
1) "5"
2) "4"
3) "3"
127.0.0.1:6379> lrem list 2 4
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "5"
2) "3"
127.0.0.1:6379> lpush list 5
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "5"
2) "5"
3) "3"
127.0.0.1:6379> lrem list 2 5
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "3"
127.0.0.1:6379> brpop list 30
1) "list"
2) "3"
127.0.0.1:6379> brpop list 30 list2 20
1) "list2"
2) "2"
127.0.0.1:6379>
- SET 集合 (ZSET)
127.0.0.1:6379> sadd set "goods"
(integer) 1
127.0.0.1:6379> sadd set "this" "is"
(integer) 2
127.0.0.1:6379> smembers set
1) "is"
2) "this"
3) "goods"
127.0.0.1:6379> spop set is
(error) ERR value is not an integer or out of range
127.0.0.1:6379> spop set 1
1) "goods"
127.0.0.1:6379> smembers set
1) "is"
2) "this"
127.0.0.1:6379> SRANDMEMBER set 2
1) "is"
2) "this"
127.0.0.1:6379> SRANDMEMBER set 1
1) "is"
127.0.0.1:6379> SRANDMEMBER set 1
1) "is"
127.0.0.1:6379> SRANDMEMBER set 1
1) "this"
127.0.0.1:6379> srem set this
(integer) 1
127.0.0.1:6379> smembers set
1) "is"