String : 字符類型 Hash: 字典類型 List: 列表 Set: 集合 Sorted set: 有序集合
KEYS * 查看KEY支持通配符
DEL 刪除給定的一個或多個key
EXISTS 檢查是否存在
RENAME 變動KEY名
SORT 鍵值排序,有非數字時報錯
TYPE 返回鍵所存儲值的類型
DUMP RESTORE 序例化與反序列化
EXPIRE\ PEXPIRE 以秒\毫秒設定生存時間
TTL\ PTTL 以秒\毫秒爲單位返回生存時間
PERSIST 取消生存實現設置
RANDOMKEY 返回數據庫中的任意鍵
127.0.0.1:6379> set name zhangsan 127.0.0.1:6379> EXPIRE name 60 (integer) 1 127.0.0.1:6379> ttl name (integer) 57 127.0.0.1:6379> set a b ex 60 OK 127.0.0.1:6379> ttl a 127.0.0.1:6379> PERSIST a (integer) 1 127.0.0.1:6379> ttl a (integer) -1
string是redis最基本的類型,一個key對應一個value。一個鍵最大能存儲512MB。
常規計數:微博數、粉絲數等。
set
get
incr
incrby
decr
decrby
mset
mget
append
getset
setex
setnx
del
setrange
strlen
getrange
127.0.0.1:6379> set name zhangsan OK 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> get name "zhangsan" 127.0.0.1:6379> mset id 101 name zhangsan age 20 gender m OK 127.0.0.1:6379> keys * 1) "name" 2) "id" 3) "xyz" 4) "jishu" 5) "age" 6) "gender" 127.0.0.1:6379> mget id name age gender 1) "101" (1) set name zhangsan (2) MSET id 101 name zhangsan age 20 gender m 等價於如下操做: SET id 101 set name zhangsan set age 20 set gender m
每點一次關注,都執行如下命令一次 127.0.0.1:6379> incr num 顯示粉絲數量: 127.0.0.1:6379> get num 暗箱操做: 127.0.0.1:6379> INCRBY num 10000 (integer) 10006 127.0.0.1:6379> get num "10006" 127.0.0.1:6379> DECRBY num 10000 (integer) 6 127.0.0.1:6379> get num "6"
set mykey "test" 爲鍵設置新值,並覆蓋原有值 getset mycounter 0 設置值,取值同時進行 setex mykey 10 "hello" 設置指定 Key 的過時時間爲10秒,在存活時間能夠獲取value setnx mykey "hello" 若該鍵不存在,則爲鍵設置新值 mset key3 "zyx" key4 "xyz" 批量設置鍵
del mykey 刪除已有鍵
append mykey "hello" 若該鍵並不存在,返回當前 Value 的長度 該鍵已經存在,返回追加後 Value的長度 incr mykey 值增長1,若該key不存在,建立key,初始值設爲0,增長後結果爲1 decrby mykey 5 值減小5 setrange mykey 20 dd 把第21和22個字節,替換爲dd, 超過value長度,自動補0
exists mykey 判斷該鍵是否存在,存在返回 1,不然返回0 get mykey 獲取Key對應的value strlen mykey 獲取指定 Key 的字符長度 ttl mykey 查看一下指定 Key 的剩餘存活時間(秒數) getrange mykey 1 20 獲取第2到第20個字節,若20超過value長度,則截取第2個和後面全部的 mget key3 key4 批量獲取鍵
咱們能夠將Redis中的Hashes類型當作具備String Key和String Value的map容器。
因此該類型很是適合於存儲值對象的信息。如Username、Password和Age等。若是Hash中包含不多的字段,那麼該類型的數據也將僅佔用不多的磁盤空間。每個Hash能夠存儲4294967295個鍵值對。
hset
hsetnx
hmset
hdel
del
hincrby
hget
hmget
hlen
hexists
hgetall
hkeys
hvals
存儲部分變動的數據,如用戶信息等。最接近MySQL表結構的一種類型
hmset stu id 101 name zhangsan age 20 gender m hmset stu1 id 102 name zhangsan1 age 21 gender f
HMGET stu id name age gender
HMGET stu1 id name age gender
hset myhash field1 "s" 若字段field1不存在,建立該鍵及與其關聯的Hashes, Hashes中,key爲field1 ,並設value爲s ,若存在會覆蓋原value hsetnx myhash field1 s 若字段field1不存在,建立該鍵及與其關聯的Hashes, Hashes中,key爲field1 ,並設value爲s, 若字段field1存在,則無效 hmset myhash field1 "hello" field2 "world 一次性設置多個字段
hdel myhash field1 刪除 myhash 鍵中字段名爲 field1 的字段
del myhash 刪除鍵
hincrby myhash field 1 給field的值加1
hget myhash field1 獲取鍵值爲 myhash,字段爲 field1 的值
hlen myhash 獲取myhash鍵的字段數量
hexists myhash field1 判斷 myhash 鍵中是否存在字段名爲 field1 的字段
hmget myhash field1 field2 field3 一次性獲取多個字段
hgetall myhash 返回 myhash 鍵的全部字段及其值
hkeys myhash 獲取myhash 鍵中全部字段的名字
hvals myhash 獲取 myhash 鍵中全部字段的值
LIST類型是按照插入順序排序的字符串鏈表。和數據結構中的普通鏈表同樣,咱們能夠在其頭部(left)和尾部(right)添加新的元素。在插入時,若是該鍵並不存在,Redis將爲該鍵建立一個新的鏈表。與此相反,若是鏈表中全部的元素均被移除,那麼該鍵也將會被從數據庫中刪除。List中能夠包含的最大元素數量是4294967295。
lpush
lpushx
linsert
rpush
rpushx
rpoplpush
del
lrem
ltrim
lset
rpoplpush
lrange
lpop
lindex
消息隊列系統
好比sina微博: 在Redis中咱們的最新微博ID使用了常駐緩存,這是一直更新的。可是作了限制不能超過5000個ID,所以獲取ID的函數會一直詢問Redis。只有在start/count參數超出了這個範圍的時候,才須要去訪問數據庫。 系統不會像傳統方式那樣「刷新」緩存,Redis實例中的信息永遠是一致的。SQL數據庫(或是硬盤上的其餘類型數據庫)只是在用戶須要獲取「很遠」的數據時纔會被觸發,而主頁或第一個評論頁是不會麻煩到硬盤上的數據庫了。
127.0.0.1:6379> LPUSH wechat "today is nice day !" 127.0.0.1:6379> LPUSH wechat "today is bad day !" 127.0.0.1:6379> LPUSH wechat "today is good day !" 127.0.0.1:6379> LPUSH wechat "today is rainy day !" 127.0.0.1:6379> LPUSH wechat "today is friday !" [e,d,c,b,a] 0 1 2 3 4 127.0.0.1:6379> lrange wechat 0 0 1) "today is friday !" 127.0.0.1:6379> lrange wechat 0 1 1) "today is friday !" 2) "today is rainy day !" 127.0.0.1:6379> lrange wechat 0 2 1) "today is friday !" 2) "today is rainy day !" 3) "today is good day !" 127.0.0.1:6379> lrange wechat 0 3 lrange wechat 0 -1 127.0.0.1:6379> lrange wechat -2 -1 1) "today is bad day !" 2) "today is nice day !"
lpush mykey a b 若key不存在,建立該鍵及與其關聯的List,依次插入a ,b, 若List類型的key存在,則插入value中
lpushx mykey2 e 若key不存在,此命令無效, 若key存在,則插入value中
linsert mykey before a a1 在 a 的前面插入新元素 a1
linsert mykey after e e2 在e 的後面插入新元素 e2
rpush mykey a b 在鏈表尾部先插入b,在插入a
rpushx mykey e 若key存在,在尾部插入e, 若key不存在,則無效
rpoplpush mykey mykey2 將mykey的尾部元素彈出,再插入到mykey2 的頭部(原子性的操做)
del mykey 刪除已有鍵 lrem mykey 2 a 從頭部開始找,按前後順序,值爲a的元素,刪除數量爲2個,若存在第3個,則不刪除 ltrim mykey 0 2 從頭開始,索引爲0,1,2的3個元素,其他所有刪除
lset mykey 1 e 從頭開始, 將索引爲1的元素值,設置爲新值 e,若索引越界,則返回錯誤信息 rpoplpush mykey mykey 將 mykey 中的尾部元素移到其頭部
lrange mykey 0 -1 取鏈表中的所有元素,其中0表示第一個元素,-1表示最後一個元素。 lrange mykey 0 2 從頭開始,取索引爲0,1,2的元素 lrange mykey 0 0 從頭開始,取第一個元素,從第0個開始,到第0個結束 lpop mykey 獲取頭部元素,而且彈出頭部元素,出棧 lindex mykey 6 從頭開始,獲取索引爲6的元素 若下標越界,則返回nil
Set類型看做爲沒有排序的字符集合。Set可包含的最大元素數量是4294967295。若是屢次添加相同元素,Set中將僅保留該元素的一份拷貝。
sadd
spop
srem
smove
sismember
smembers
scard
srandmember
sdiff
sdiffstore
sinter
sinterstore
sunion
sunionstore
案例: 在微博應用中,能夠將一個用戶全部的關注人存在一個集合中,將其全部粉絲存在一個集合。Redis還爲集合提供了求交集、並集、差集等操做,能夠很是方便的實現如共同關注、共同喜愛、二度好友等功能,對上面的全部集合操做,你還可使用不一樣的命令選擇將結果返回給客戶端仍是存集到一個新的集合中。
127.0.0.1:6379> sadd lxl jnl pgone ms mr lxlmami lxlbb baoqiang (integer) 7 127.0.0.1:6379> sadd jnl lxl baoqiang huangbo xuzheng baodi (integer) 5 127.0.0.1:6379> smembers lxl 1) "jnl" 2) "baoqiang" 3) "lxlbb" 4) "lxlmami" 5) "mr" 6) "pgone" 7) "ms" 127.0.0.1:6379> smembers jnl 1) "baoqiang" 2) "xuzheng" 3) "huangbo" 4) "lxl" 5) "baodi" 127.0.0.1:6379> SINTER lxl jnl 1) "baoqiang" 127.0.0.1:6379> SUNION lxl jnl 1) "xuzheng" 2) "mr" 3) "ms" 4) "pgone" 5) "jnl" 6) "baoqiang" 7) "lxlbb" 8) "huangbo" 9) "baodi" 10) "lxlmami" 11) "lxl" 127.0.0.1:6379> Sdiff lxl jnl 1) "pgone" 2) "lxlmami" 3) "lxlbb" 4) "mr" 5) "ms" 6) "jnl" 127.0.0.1:6379> Sdiff jnl lxl 1) "baodi" 2) "xuzheng" 3) "huangbo" 4) "lxl"
sadd myset a b c
若key不存在,建立該鍵及與其關聯的set,依次插入a ,b,若key存在,則插入value中,若a 在myset中已經存在,則插入了 d 和 e 兩個新成員。
spop myset 尾部的b被移出,事實上b並非以前插入的第一個或最後一個成員
srem myset a d f 若f不存在, 移出 a、d ,並返回2
smove myset myset2 a 將a從 myset 移到 myset2,
sismember myset a 判斷 a 是否已經存在,返回值爲 1 表示存在。 smembers myset 查看set中的內容 scard myset 獲取Set 集合中元素的數量 srandmember myset 隨機的返回某一成員 sdiff myset1 myset2 myset3 1和2獲得一個結果,拿這個集合和3比較,得到每一個獨有的值 sdiffstore diffkey myset myset2 myset3 3個集和比較,獲取獨有的元素,並存入diffkey 關聯的Set中 sinter myset myset2 myset3 得到3個集合中都有的元素 sinterstore interkey myset myset2 myset3 把交集存入interkey 關聯的Set中 sunion myset myset2 myset3 獲取3個集合中的成員的並集 sunionstore unionkey myset myset2 myset3 把並集存入unionkey 關聯的Set中
Sorted-Sets中的每個成員都會有一個分數(score)與之關聯,Redis正是經過分數來爲集合中的成員進行從小到大的排序。成員是惟一的,可是分數(score)倒是能夠重複的。
zadd
zrem
zincrby
zrange
zrank
zcard
zcount
zscore
zrangebyscore
zremrangebyscore
zremrangebyrank
zrevrange
zrevrangebyscore
zrevrangebyscore
排行榜應用,取TOP N操做 這個需求與上面需求的不一樣之處在於,前面操做以時間爲權重,這個是以某個條件爲權重,好比按頂的次數排序,這時候就須要咱們的sorted set出馬了,將你要排序的值設置成sorted set的score,將具體的數據設置成相應的value,每次只須要執行一條ZADD命令便可。
127.0.0.1:6379> ZADD phb 1000 timian 2000 "thatgirl" 3000 "nida" 4000 "dawang" (integer) 4 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> ZREVRANGE phb 0 -1 1) "dawang" 2) "nida" 3) "thatgirl" 4) "timian" 127.0.0.1:6379> ZREVRANGE phb 0 -1 withscores 1) "dawang" 2) "4000" 3) "nida" 4) "3000" 5) "thatgirl" 6) "2000" 7) "timian" 8) "1000" 127.0.0.1:6379> ZINCRBY phb 100000 timian "101000" 127.0.0.1:6379> ZREVRANGE phb 0 -1 withscores 1) "timian" 2) "101000" 3) "dawang" 4) "4000" 5) "nida" 6) "3000" 7) "thatgirl" 8) "2000" 127.0.0.1:6379> ZINCRby phb 1 nida
zadd myzset 2 "two" 3 "three" 添加兩個分數分別是 2 和 3 的兩個成員
zrem myzset one two 刪除多個成員變量,返回刪除的數量
zincrby myzset 2 one 將成員 one 的分數增長 2,並返回該成員更新後的分數
zrange myzset 0 -1 WITHSCORES 返回全部成員和分數,不加WITHSCORES,只返回成員 zrank myzset one 獲取成員one在Sorted-Set中的位置索引值。0表示第一個位置 zcard myzset 獲取 myzset 鍵中成員的數量 zcount myzset 1 2 獲取分數知足表達式 1 <= score <= 2 的成員的數量 zscore myzset three 獲取成員 three 的分數 zrangebyscore myzset 1 2 獲取分數知足表達式 1 < score <= 2 的成員 #-inf 表示第一個成員,+inf最後一個成員 #limit限制關鍵字 #2 3 是索引號 zrangebyscore myzset -inf +inf limit 2 3 返回索引是2和3的成員 zremrangebyscore myzset 1 2 刪除分數 1<= score <= 2 的成員,並返回實際刪除的數量 zremrangebyrank myzset 0 1 刪除位置索引知足表達式 0 <= rank <= 1 的成員 zrevrange myzset 0 -1 WITHSCORES 按位置索引從高到低,獲取全部成員和分數 #原始成員:位置索引從小到大 one 0 two 1 #執行順序:把索引反轉 位置索引:從大到小 one 1 two 0 #輸出結果: two one zrevrange myzset 1 3 獲取位置索引,爲1,2,3的成員 #相反的順序:從高到低的順序 zrevrangebyscore myzset 3 0 獲取分數 3>=score>=0的成員並以相反的順序輸出 zrevrangebyscore myzset 4 0 limit 1 2 獲取索引是1和2的成員,並反轉位置索引
Redis發佈消息一般有兩種模式: 1、隊列模式(queuing) 2、發佈-訂閱模式(publish-subscribe) 任務隊列:故名思義,就是"傳遞消息的隊列"。與任務隊列進行交互的實體有兩類,一類是生產者(producer),另外一類則是消費者(consumer)。生產者將須要處理的任務放入任務隊列中,而消費者則不斷地從任務獨立中讀入任務信息並執行。 任務隊列的好處: 1、鬆耦合。 生產者和消費者只須要按照約定的任務描述格式,進行編寫代碼。 2、易於擴展 多消費者模式下,消費者能夠分佈在多個不一樣的服務器中,由此下降單臺服務器的負載。
其實從Pub/Sub的機制來看,它更像是一個廣播系統,多個Subscriber能夠訂閱多個Channel,多個Publisher能夠往多個Channel中發佈消息。能夠這麼簡單的理解:
1、Subscriber:收音機,能夠收到多個頻道,並以隊列方式顯示
2、Publisher:電臺,能夠往不一樣的FM頻道中發消息
3、Channel:不一樣頻道的FM頻道
PUBLISH channel msg 將信息 message 發送到指定的頻道 channel SUBSCRIBE channel [channel ...] 訂閱頻道,能夠同時訂閱多個頻道 UNSUBSCRIBE [channel ...] 取消訂閱指定的頻道, 若是不指定頻道,則會取消訂閱全部頻道 PSUBSCRIBE pattern [pattern ...] 訂閱一個或多個符合給定模式的頻道,每一個模式以 * 做爲匹配符,好比 it* 匹配所 有以 it 開頭的頻道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配全部 以 news. 開頭的頻道( news.it 、 news.global.today 等等),諸如此類 PUNSUBSCRIBE [pattern [pattern ...]] 退訂指定的規則, 若是沒有參數則會退訂全部規則 PUBSUB subcommand [argument [argument ...]] 查看訂閱與發佈系統狀態 注意:使用發佈訂閱模式實現的消息隊列,當有客戶端訂閱channel後只能收到後續發佈到該頻道的消息,以前發送的不會緩存,必須Provider和Consumer同時在線。
窗口1: 127.0.0.1:6379> SUBSCRIBE baodi 窗口2: 127.0.0.1:6379> PUBLISH baodi "jin tian zhen kaixin!" 訂閱多頻道: 窗口1: 127.0.0.1:6379> PSUBSCRIBE wang* 窗口2: 127.0.0.1:6379> PUBLISH wangbaoqiang "jintian zhennanshou "
客戶端在執行訂閱命令以後進入了訂閱狀態,只能接收 SUBSCRIBE 、PSUBSCRIBE、 UNSUBSCRIBE 、PUNSUBSCRIBE 四個命令。 開啓的訂閱客戶端,沒法收到該頻道以前的消息,由於 Redis 不會對發佈的消息進行持久化。 和不少專業的消息隊列系統(例如Kafka、RocketMQ)相比,Redis的發佈訂閱略顯粗糙,例如沒法實現消息堆積和回溯。但勝在足夠簡單,若是當前場景能夠容忍的這些缺點,也不失爲一個不錯的選擇。
redis中的事務跟關係型數據庫中的事務是一個類似的概念,可是有不一樣之處。關係型數據庫事務執行失敗後面的SQL語句不在執行,而redis中的一條命令執行失敗,其他的命令照常執行。
redis開始一個事務使用multi,至關月begin\start transaction,exec提交事務,discard取消隊列命令(非回滾操做)。
|
MySQLredis |
Redis數據庫 |
開啓編程 |
start transaction/begin緩存 |
multi服務器 |
語句數據結構 |
普通SQLapp |
普通命令ide |
失敗函數 |
rollback 回滾ui |
discard 取消(不叫回滾,是隊列裏面的命令不執行,隊列裏面的任務根本就沒有執行。而不是執行了也能夠撤回來) |
成功 |
commit |
exec |
取消事務,放棄執行事務塊內的全部命令。
執行全部事務塊內的命令。
標記一個事務塊的開始。
取消WATCH命令對全部key的監視。
監視一個(或多個)key,若是在事務執行以前這個(或這些)key被其餘命令所改動,那麼事務將被打斷。
開啓事務功能時(multi) multi command1 command2 command3 command4 4條語句做爲一個組,並無真正執行,而是被放入同一隊列中。 若是,這是執行discard,會直接丟棄隊列中全部的命令,而不是作回滾。 exec 當執行exec時,對列中全部操做,要麼全成功要麼全失敗 ---------- 127.0.0.1:6379> set a b OK 127.0.0.1:6379> MULTI OK 127.0.0.1:6379> set a b QUEUED 127.0.0.1:6379> set c d QUEUED 127.0.0.1:6379> exec 1) OK 2) OK
舉例:我正在買票 Ticket -1,money -100 而票只有1張,若是在我multi以後,和exec以前,票被別人買了---即ticket編程0了. 我該如何觀察這種情景,並不在提交 悲觀的想法: 世界充滿危險,確定有人和我搶,給ticket上鎖,只有我能操做.[悲觀鎖] 樂觀的想法: 沒有那麼多人和我搶,所以,我只須要注意,--有沒有人更改ticket的值就能夠了[樂觀鎖] Redis的事務中,啓用的是樂觀鎖,只負責監測key沒有給改動。
具體的命令---- watch命令 例: redis 127.0.0.1:6379> watch ticket OK redis 127.0.0.1:6379> multi OK redis 127.0.0.1:6379> decr ticket QUEUED redis 127.0.0.1:6379> decrby money 100 QUEUED //如今已經對ticket進行了監控,另一個窗口將ticket改動了 另外一個窗口:> decr ticket redis 127.0.0.1:6379> exec (nil) // 返回nil,說明監視的ticket已經改動了,事務就取消了.隊列就不執行了。 redis 127.0.0.1:6379>mget ticket money "0" "200" watch key1 key2 ... keyN 做用:監聽key1 key2..keyN有沒有變化,若是任意一個有變, 則事務取消 unwatch 做用: 取消全部watch監聽
Info Clinet list Client kill ip:port config get * CONFIG RESETSTAT 重置統計 CONFIG GET/SET 動態修改 Dbsize FLUSHALL 清空全部數據 select 1 FLUSHDB 清空當前庫 MONITOR 監控實時指令 SHUTDOWN 關閉服務器 save將當前數據保存 SLAVEOF host port 主從配置 SLAVEOF NO ONE SYNC 主從同步 ROLE返回主從角色
Slow log 是 Redis 用來記錄查詢執行時間的日誌系統。 slow log 保存在內存裏面,讀寫速度很是快 能夠經過改寫 redis.conf 文件或者用 CONFIG GET 和 CONFIG SET 命令對它們動態地進行修改 slowlog-log-slower-than 10000 超過多少微秒 CONFIG SET slowlog-log-slower-than 100 CONFIG SET slowlog-max-len 1000 保存多少條慢日誌 CONFIG GET slow* SLOWLOG GET SLOWLOG RESET