redis簡介
Redis是一個開源的,高性能的,基于鍵值對的緩存與存儲系統,通過設定各種鍵值資料類型來适應不同場景下的緩存與存儲需求。同時redis的諸多高層級功能使其可以勝任消息隊列,任務隊列等不同角色。
存儲結構
Redis是REmote Dictionary Server(遠端字典伺服器)的縮寫,它以字典結構存儲資料,并允許其他應用通過TCP協定讀寫字典中的内容,目前為止redis支援的鍵值資料類型如下:字元串類型,散列類型,清單類型,集合類型,和有序集合類型。其中一個字元串類型鍵值允許存儲的資料最大容量為521M.
記憶體存儲與持久化
Redis資料庫中的所有資料都存儲在記憶體中。在一台普通的筆記本電腦上,Redis可以在一秒内讀寫超過10萬個鍵值。
資料存儲在記憶體也有問題比如斷電。redis還提供了持久化的存儲,既可以将記憶體的資料異步寫入應哦按,同時不影響繼續
提供服務。
功能豐富
Redis可以為每個鍵設定生存時間,生存時間到後期會自動删除,這一功能可以利用redis作為緩存系統來調用。
除此之外,redis的清單類型鍵可以用來實作隊列,并且支援阻塞式讀取,可以容易地實作一個高性能的優先級隊列,同時在更高層上,redis還支援"釋出/訂閱"的消息模式,可以基于此建構聊天室。
redis的安裝
參考
windows安裝redisredis指令行用戶端
通過redis-cli向redis發送指令,
通過-h和-p自定義位址和端口号
$redis-cli -h 127.0.0.1 -p 6379
通過ping指令測試連接配接是否正常
$redis-cli PING
####狀态回複
PONG
####錯誤回複
如果上述指令不存在或者存在格式錯誤,會傳回以error開頭的錯誤。如
reids>ERRORCOMMEND
輸出
(error)ERR unknow command 'ERRORCOMMEND'
擷取先輸入redis-cli進入互動模式,然後自由輸入指令,例如PING.
整數回複
傳回遞增後的鍵值,類似mysql最後的索引值
依次執行以下指令
redis-cli
127.0.0.1:6379> set foot bar
OK
127.0.0.1:6379> INCR foo
(integer) 1
127.0.0.1:6379> set foot bar
OK
127.0.0.1:6379> INCR foo
(integer) 2
可以看到每次插入一條資料傳回值都跟着變化。
字元串回複
127.0.0.1:6379> set foot bar
OK
127.0.0.1:6379> get foo
"bar"
127.0.0.1:6379> set foo banana
OK
127.0.0.1:6379> get foo
"banana"
127.0.0.1:6379>
可以看到get指令可以擷取foo的最新的鍵值。
字元串多行回複
127.0.0.1:6379> KEYS *
1) "proxies"
2) "foo"
3) "foot"
傳回鍵名1是我之前執行的,3是之前foo打錯了執行的。keys指令需要便利redis中的所有鍵,當鍵的數量較多時會影響性能,不建議生産環境中使用。
多行資料庫
redis提供了多個來存儲資料的字典,每個字典類型mysql的資料量,每個資料庫對外都是以0開始遞增,redis預設支援16個資料庫,用戶端連接配接到服務端時,redis預設使用0進行操作資料庫,使用select可以根據資料庫。比如選擇1号資料庫:
redis-cli
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get foo
(nil)
127.0.0.1:6379[1]>
redis不支援自定義資料庫的名字,每個資料庫必須以編号命名。比如可以使用0号資料庫存儲某個應用生産環境的資料,1号資料庫存儲測試環境中的資料,需要注意的是不同的應用應該使用不同的redis執行個體redis也不支援為每個資料庫設定不同的通路密碼。
最重要的是redis執行個體中所有資料庫的資料并不是完全隔離的,比如FLUSHALL可以清空一個redis執行個體中所有資料庫中的資料。。由于redis非常輕量級,一個空的redis執行個體占用記憶體隻有1MD左右,是以不用擔心多個redis執行個體會額外占用很多記憶體。
幾個基礎指令
1.keys 見上面的例子
2.判斷一個鍵是否存在
exists key 如果存在傳回1 ,不存在傳回0
0.0.1:6379> exists foo
(integer) 1
127.0.0.1:6379> exists foo2
(integer) 0
127.0.0.1:6379> exists foot
(integer) 1
127.0.0.1:6379>
3.删除鍵
del key [key …]
可以删除一個或者多個空格間隔,傳回值是删除的個數。del指令不支援通配符。
127.0.0.1:6379> set f1 1
OK
127.0.0.1:6379> set f3 1
OK
127.0.0.1:6379> set f2 1
OK
127.0.0.1:6379> keys *
1) "key"
2) "f1"
3) "proxies"
4) "f2"
5) "foot"
6) "foo"
7) "f3"
127.0.0.1:6379> del f1
(integer) 1
127.0.0.1:6379> del f2 f3
(integer) 2
127.0.0.1:6379>
3.擷取鍵值的資料類型
type key
type指令用來擷取鍵值類型,傳回值可能是string,hash,list,set,zset(有序集合)。
127.0.0.1:6379> set test 1
OK
127.0.0.1:6379> type test
string
127.0.0.1:6379> lpush test2 2
(integer) 1
127.0.0.1:6379> type test2
list
127.0.0.1:6379>
lpush指令是向指定的清單類型鍵中增加一個元素,如果不存在則建立。後面詳解。
讀取鍵值
get key
根據鍵擷取其值。
127.0.0.1:6379> get fo
(nil)
127.0.0.1:6379> get foo
"banana"
127.0.0.1:6379>
不存在的時候傳回nil.
遞增數字
INCR key
增加指定的整數
INCRBY key increment
incrby和incr指令效果差不多,差別是incrby可以指定增加的數字
127.0.0.1:6379> incrby bar 2
(integer) 2
127.0.0.1:6379> incrby bar 5
(integer) 7
127.0.0.1:6379> incr bar
(integer) 8
127.0.0.1:6379> incr bar
(integer) 9
127.0.0.1:6379>
增加指定的浮點數
incrbyfloat key inrement
這個指令類似上面兩個隻不過是可以傳遞一個浮點數而已
127.0.0.1:6379> incrbyfloat bar 3.14
"12.140000000000001"
127.0.0.1:6379> incrbyfloat bar 3.14e+9
"3140000012.1399999"
127.0.0.1:6379>
減少指定的整數
有增加就有減少
decr和decrby和增加的用法一樣,隻不過是鍵值遞減。
decrby key 4相當于incrbu key -4
向尾部追加值
向鍵值的末尾加字元串,如果不存在就是相當于set key value
127.0.0.1:6379> append bar "345"
(integer) 21
127.0.0.1:6379> get bar
"3140000012.1399999345"
127.0.0.1:6379>
127.0.0.1:6379> append asd "hello dj"
(integer) 8
127.0.0.1:6379> get asd
"hello dj"
127.0.0.1:6379>
擷取字元串長度
STRLEN key
傳回鍵值長度,不存在傳回0.
127.0.0.1:6379> set key "ᄎᆭ"
OK
127.0.0.1:6379> strlen key
(integer) 4
127.0.0.1:6379> set key "ᅣ ̄채"
OK
127.0.0.1:6379> strlen key
(integer) 4
127.0.0.1:6379>
同時設定多個鍵值
Mget key/mset key value
mget/mset和get/set相似,前者可以擷取/設定多個值。
(integer) 4
127.0.0.1:6379> mget bar foo
1) "3140000012.1399999345"
2) "banana"
127.0.0.1:6379> mset a 1 b 2
OK
127.0.0.1:6379>
位操作
getbit key offset
setbit key offset value
bitcount key [start][end]
bitop operation destkey key [key ….]
一個位元組由8個二進制位組成,redis提供了以上四個指令可以直接對二進制進行操作。