之前我們簡單介紹了一下redis,知道了它的一些特性以及它的作用,今天我們來看看它在實際使用中的一些簡單的命令,以及它的一些高級特性。
一、常用命令
1、String類型
(1)set key value
nx:如果key不存在則建立
xx:如果key存在則修改其值
(2)get key:取值
(3)mset key1 value1 key2 value2 一次設置多個值
(4)mget key1 key2 :一次獲取多個值
(5)getrange key start stop:獲取字符串中[start, stop]範圍的值
對於字符串的下標,左數從0開始,右數從-1開始
注意:當start>length,則返回空字符串
當stop>=length,則截取至字符串尾
如果start所處位置在stop右邊,則返回空字符串
(6)getset key nrevalue:獲取並返回舊值,在設置新值
(7)incr key:自增,返回新值,
如果incr一個不是int的value則返回錯誤,
incr一個不存在的key,則設置key爲1
(8)incrby key 2:跳2自增
(9)strlen key:取指定key的value值的長度
(10)setex key time value:設置key對應的值value,並設置有效期爲time秒
2、List類型
(1)lpush key value:把值插入到鏈表頭部
(2)rpush key value:把值插入到鏈表尾部
(3)lpop key :返回並刪除鏈表頭部元素
(4)rpop key: 返回並刪除鏈表尾部元素
(5)lrange key start stop:返回鏈表中[start, stop]中的元素
(6)lrem key count value:從鏈表中刪除value值,刪除count的絕對值個value後結束
count > 0 從表頭刪除
count < 0 從表尾刪除
count=0 全部刪除
(7)ltrim key start stop:剪切key對應的鏈接,切[start, stop]一段並把改制重新賦給key
(8)lindex key index:返回index索引上的值
(9)llen key:計算鏈表的元素個數
(10)linsert key after|before search value:在key 鏈表中尋找search,並在search值之前|之後插入value
(11)rpoplpush source dest:把source 的末尾拿出,放到dest頭部,並返回單元值
3、Hash類型
(1)hset myhash field value:設置myhash的field爲value
(2)hsetnx myhash field value:不存在的情況下設置myhash的field爲value
(3)hmset myhash field1 value1 field2 value2:同時設置多個field
(4)hget myhash field:獲取指定的hash field
(5)hmget myhash field1 field2:一次獲取多個field
(6)hincrby myhash field 5:指定的hash field加上給定的值
(7)hexists myhash field:測試指定的field是否存在
(8)hlen myhash:返回hash的field數量
(9)hdel myhash field:刪除指定的field
(10)hkeys myhash:返回hash所有的field
(11)hvals myhash:返回hash所有的value
(12)hgetall myhash:獲取某個hash中全部的field及value
4、Set類型
(1)sadd key value1 value2:往集合裏面添加元素
(2)smembers key:獲取集合所有的元素
(3)srem key value:刪除集合某個元素
(4)spop key:返回並刪除集合中1個隨機元素(可以坐抽獎,不會重複抽到某人)
(5)srandmember key:隨機取一個元素
(6)sismember key value:判斷集合是否有某個值
(7)scard key:返回集合元素的個數
(8)smove source dest value:把source的value移動到dest集合中
(9)sinter key1 key2 key3:求key1 key2 key3的交集
(10)sunion key1 key2:求key1 key2 的並集
(11)sdiff key1 key2:求key1 key2的差集
(12)sinterstore res key1 key2:求key1 key2的交集並存在res裏
5、Zset類型
(1)zadd key score1 value1:添加元素
(2)zrange key start stop [withscore]:把集合排序後,返回名次[start,stop]的元素
默認是升續排列
withscores 是把score也打印出來
(3)zrank key member:查詢member的排名(升序0名開始)
(4)zrangebyscore key min max [withscores]集合(升序)排序後取score在[min, max]內的元素
(5)zrevrank key member:查詢member排名(降序 0名開始)
(6)zremrangebyscore key min max:按照score來刪除元素,刪除score在[min, max]之間
(7)zrem key value1 value2:刪除集合中的元素
(8)zremrangebyrank key start end:按排名刪除元素,刪除名次在[start, end]之間的
(9)zcard key:返回集合元素的個數
(10)zcount key min max:返回[min, max]區間內元素數量
二、高級特性
1、事務
redis通過 MULTI 、 DISCARD 、 EXEC 和 WATCH 四個命令來實現事務功能,對事務的支持目前還比較簡單。redis只能保證一個client發起的事務中的命令可以連續的執行,而中間不會插入其他client的命令。
由於redis是單線程來處理所有client的請求的所以做到這點是很容易的。一般情況下redis在接受到一個client發來的命令後會立即處理並 返回處理結果,但是當一個client在一個連接中發出multi命令有,這個連接會進入一個事務上下文,該連接後續的命令並不是立即執行,而是先放到一 個隊列中。當從此連接受到exec命令後,redis會順序的執行隊列中的所有命令。並將所有命令的運行結果打包到一起返回給client.然後此連接就 結束事務上下文。
例子:
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> incr a
QUEUED
redis 127.0.0.1:6379> incr b
QUEUED
redis 127.0.0.1:6379> exec
1. (integer) 1
2. (integer) 1
2、持久化
redis是一個支持持久化的內存數據庫,也就是說redis需要經常將內存中的數據同步到磁盤來保證持久化。redis支持兩種持久化方式,一種是 Snapshotting(快照)也是默認方式,另一種是Append-only file(縮寫aof)的方式。
- 快照Snapshotting
快照是默認的持久化方式。這種方式是就是將內存中數據以快照的方式寫入到二進制文件中,默認的文件名爲dump.rdb。可以通過配置設置自動做快照持久化的方式。我們可以配置redis在n秒內如果超過m個key被修改就自動做快照,下面是默認的快照保存配置:
save 900 1 #900秒內如果超過1個key被修改,則發起快照保存
save 300 10 #300秒內容如超過10個key被修改,則發起快照保存
save 60 10000
- Append-only file(AOF)
aof 比快照方式有更好的持久化性,是由於在使用aof持久化方式時,redis會將每一個收到的寫命令都通過write函數追加到文件中(默認是appendonly.aof)。
當redis重啓時會通過重新執行文件中保存的寫命令來在內存中重建整個數據庫的內容。當然由於os會在內核中緩存 write做的修改,所以可能不是立即寫到磁盤上。這樣aof方式的持久化也還是有可能會丟失部分修改。不過我們可以通過配置文件告訴redis我們想要通過fsync函數強制os寫入到磁盤的時機。
有三種方式如下
appendonly yes #啓用aof持久化方式
# appendfsync always #每次收到寫命令就立即強制寫入磁盤,最慢的,但是保證完全的持久化,不推薦使用
appendfsync everysec #每秒鐘強制寫入磁盤一次,在性能和持久化方面做了很好的折中,推薦
# appendfsync no #完全依賴os,性能最好,持久化沒保證
3、主從複製
redis支持主從複製,而且配置比較簡單。主從複製實現了數據的備份,冗餘,以構建高可用的系統。當master不能正常工作時,可以把slave切換成master。
原理過程
在Slave啓動並連接到Master之後,它將主動發送一個SYNC命令。此後Master將啓動後臺存盤進程,同時收集所有接收到的用於修改數據集的命令,在後臺進程執行完畢後,Master將傳送整個數據庫文件到Slave,以完成一次完全同步。而Slave服務器在接收到數據庫文件數據之後將其存盤並加載到內存中。此後,Master繼續將所有已經收集到的修改命令,和新的修改命令依次傳送給Slaves,Slave將在本次執行這些數據修改命令,從而達到最終的數據同步。
4、發佈訂閱
發佈訂閱(pub/sub)是一種消息通信模式,主要的目的是解耦消息發佈者和消息訂閱者之間的耦合,這點和設計模式中的觀察者模式比較相似。
pub /sub不僅僅解決發佈者和訂閱者直接代碼級別耦合也解決兩者在物理部署上的耦合。
redis作爲一個pub/sub server,在訂閱者和發佈者之間起到了消息路由的功能。訂閱者可以通過subscribe和psubscribe命令向redis server訂閱自己感興趣的消息類型,redis將消息類型稱爲通道(channel)。當發佈者通過publish命令向redis server發送特定類型的消息時。訂閱該消息類型的全部client都會收到此消息。這裏消息的傳遞是多對多的。一個client可以訂閱多個 channel,也可以向多個channel發送消息。
下圖展示了頻道 channel1 , 以及訂閱這個頻道的三個客戶端 —— client2 、 client5 和 client1 之間的關係:
當有新消息通過 PUBLISH 命令發送給頻道 channel1 時, 這個消息就會被髮送給訂閱它的三個客戶端:
總結:
從redis的介紹到簡單的操作命令,然後又瞭解了它的事務,持久化,主從複製等特性,希望在以後的項目中使用的時候會得心應手,至於redis其他的特性,如虛擬內存等,我們可以以後一點點深入。而且在實際應用過程中還會出現各種各樣的問題,到時候再逐個解決。