標籤:
Redis學習二
標籤(空格分隔): Redis
一,link 鏈表結構
1,lpush key value (rpush插入到鏈表尾部)
作用: 把值插入到連結頭部
2,rpop key(lpop key 返回並刪除鏈表的頭元素)
作用: 返回並刪除鏈表尾元素
3,lrange key start stop
作用: 返回鏈表中[start ,stop]中的元素
規律: 左數從0開始,右數從-1開始
lrange link 0 2lrange link 0 -1
4,lrem key count value
作用: 從key鏈表中刪除 value值
注: 刪除count的絕對值個value後結束
Count>0 從表頭刪除
Count < 0 從表尾刪除
5,lindex key index
作用: 返回index索引上的值,
如 lindex key 2
6,llen key
作用:計算連結資料表的元素個數
redis 127.0.0.1:6379> llen task
(integer) 3
redis 127.0.0.1:6379>
7,linsert key after|before search value
作用: 在key鏈表中尋找’search’,並在search值之前|之後,.插入value
注: 一旦找到一個search後,命令就結束了,因此不會插入多個value
8,rpoplpush source dest
作用: 把source的尾部拿出,放在dest的頭部,
並返回 該單元值
商務邏輯:
1:Rpoplpush task bak
2:接收傳回值,並做業務處理
3:如果成功,rpop bak 清除任務. 如不成功,下次從bak表裡取任務
9,brpop ,blpop key timeout
作用:等待彈出key的尾/頭元素,
Timeout為等待逾時時間
如果timeout為0,則一直等待
情境: 長輪詢Ajax,線上聊天時,能夠用到
二,執行個體:位元影像法統計使用者登入情況
三,Set的集合命令
集合的性質: 唯一性,無序性,確定性
注: 在string和link的命令中,可以通過range 來訪問string中的某幾個字元或某幾個元素
但,因為集合的無序性,無法通過下標或範圍來訪問部分元素.
因此想看元素,要麼隨機先一個,要麼全選
1,sadd key value1 value2
作用: 往集合key中增加元素
2,srem value1 value2
作用: 刪除集合中集為 value1 value2的元素
傳回值: 忽略不存在的元素後,真正刪除掉的元素的個數
3,spop key
作用: 返回並刪除集合中key中1個隨機元素
隨機–體現了無序性
4,srandmember key
作用: 返回集合key中,隨機的1個元素.
5,sismember key value
作用: 判斷value是否在key集合中
是返回1,否返回0
6,smembers key
作用: 返回集中中所有的元素
7,scard key
作用: 返回集合中元素的個數
8,smove source dest value
作用:把source中的value刪除,並添加到dest集合中
9,sinter key1 key2 key3
作用: 求出key1 key2 key3 三個集合中的交集,並返回
redis 127.0.0.1:6379> sadd s1 0 2 4 6(integer) 4redis 127.0.0.1:6379> sadd s2 1 2 3 4(integer) 4redis 127.0.0.1:6379> sadd s3 4 8 9 12(integer) 4redis 127.0.0.1:6379> sinter s1 s2 s31) "4"redis 127.0.0.1:6379> sinter s3 s1 s21) "4"
10,sinterstore dest key1 key2 key3
作用: 求出key1 key2 key3 三個集合中的交集,並賦給dest
11,suion key1 key2.. Keyn
作用: 求出key1 key2 keyn的並集,並返回
12,sdiff key1 key2 key3
作用: 求出key1與key2 key3的差集
即key1-key2-key3
四,order set命令集合
1,zadd key score1 value1 score2 value2 ..
添加元素
redis 127.0.0.1:6379> zadd stu 18 lily 19 hmm 20 lilei 21 lilei(integer) 3
2,zrem key value1 value2 ..
作用: 刪除集合中的元素
3,zremrangebyscore key min max
作用: 按照socre來刪除元素,刪除score在[min,max]之間的
redis 127.0.0.1:6379> zremrangebyscore stu 4 10(integer) 2redis 127.0.0.1:6379> zrange stu 0 -11) "f"
4,zremrangebyrank key start end
作用: 按排名刪除元素,刪除名次在[start,end]之間的
redis 127.0.0.1:6379> zremrangebyrank stu 0 1(integer) 2redis 127.0.0.1:6379> zrange stu 0 -11) "c"2) "e"3) "f"4) "g"
5,zrank key member
查詢member的排名(升續 0名開始)
6,zrevrank key memeber
查詢 member的排名(降續 0名開始)
7,ZRANGE key start stop [WITHSCORES]
把集合排序後,返回名次[start,stop]的元素
預設是升續排列
Withscores 是把score也列印出來
8,zrevrange key start stop
作用:把集合降序排列,取名字[start,stop]之間的元素
9,zrangebyscore key min max [withscores] limit offset N
作用: 集合(升續)排序後,取score在[min,max]內的元素,
並跳過 offset個, 取出N個
redis 127.0.0.1:6379> zadd stu 1 a 3 b 4 c 9 e 12 f 15 g(integer) 6redis 127.0.0.1:6379> zrangebyscore stu 3 12 limit 1 2 withscores1) "c"2) "4"3) "e"4) "9"
10,zcard key
返回元素個數
11,zcount key min max
返回[min,max] 區間內元素的數量
12,zinterstore destination numkeys key1 [key2 …]
[WEIGHTS weight [weight …]]
[AGGREGATE SUM|MIN|MAX]
求key1,key2的交集,key1,key2的權重分別是 weight1,weight2
彙總方法用: sum |min|max
彙總的結果,儲存在dest集合內
注意: weights ,aggregate如何理解?
答: 如果有交集, 交集元素又有socre,score怎麼處理?
Aggregate sum->score相加 , min 求最小score, max 最大score
另: 可以通過weigth設定不同key的權重, 交集時,socre * weights
詳見下例
redis 127.0.0.1:6379> zadd z1 2 a 3 b 4 c(integer) 3redis 127.0.0.1:6379> zadd z2 2.5 a 1 b 8 d(integer) 3redis 127.0.0.1:6379> zinterstore tmp 2 z1 z2(integer) 2redis 127.0.0.1:6379> zrange tmp 0 -11) "b"2) "a"redis 127.0.0.1:6379> zrange tmp 0 -1 withscores1) "b"2) "4"3) "a"4) "4.5"redis 127.0.0.1:6379> zinterstore tmp 2 z1 z2 aggregate sum(integer) 2redis 127.0.0.1:6379> zrange tmp 0 -1 withscores1) "b"2) "4"3) "a"4) "4.5"redis 127.0.0.1:6379> zinterstore tmp 2 z1 z2 aggregate min(integer) 2redis 127.0.0.1:6379> zrange tmp 0 -1 withscores1) "b"2) "1"3) "a"4) "2"redis 127.0.0.1:6379> zinterstore tmp 2 z1 z2 weights 1 2(integer) 2redis 127.0.0.1:6379> zrange tmp 0 -1 withscores1) "b"2) "5"3) "a"4) "7"
五,Redis 中的事務
Redis支援簡單的事務。Redis與 mysql事務的對比
注: rollback與discard 的區別如果已經成功執行了2條語句, 第3條語句出錯.Rollback後,前2條的語句影響消失.Discard只是結束本次事務,前2條語句造成的影響仍然還在注:在mutil後面的語句中, 語句出錯可能有2種情況1: 文法就有問題, 這種,exec時,報錯, 所有語句得不到執行2: 文法本身沒錯,但適用對象有問題. 比如 zadd 操作list對象Exec之後,會執行正確的語句,並跳過有不適當的語句.
思考: 我正在買票Ticket -1 , money -100而票只有1張, 如果在我multi之後,和exec之前, 票被別人買了---即ticket變成0了.我該如何觀察這種情景,並不再提交悲觀的想法: 世界充滿危險,肯定有人和我搶, 給 ticket上鎖, 只有我能操作. [悲觀鎖]樂觀的想法:沒有那麼人和我搶,因此,我只需要注意,--有沒有人更改ticket的值就可以了 [樂觀鎖]Redis的事務中,啟用的是樂觀鎖,只負責監測key沒有被改動.具體的命令---- watch命令例: redis 127.0.0.1:6379> watch ticketOKredis 127.0.0.1:6379> multiOKredis 127.0.0.1:6379> decr ticketQUEUEDredis 127.0.0.1:6379> decrby money 100QUEUEDredis 127.0.0.1:6379> exec(nil) // 返回nil,說明監視的ticket已經改變了,事務就取消了.redis 127.0.0.1:6379> get ticket"0"redis 127.0.0.1:6379> get money"200"watch key1 key2 ... keyN作用:監聽key1 key2..keyN有沒有變化,如果有變, 則事務取消unwatch 作用: 取消所有watch監聽
六,訊息訂閱
訂閱端: Subscribe 頻道名稱
發布端: publish 頻道名稱 發布內容
用戶端例子:
redis 127.0.0.1:6379> subscribe newsReading messages... (press Ctrl-C to quit)1) "subscribe"2) "news"3) (integer) 11) "message"2) "news"3) "good good study"1) "message"2) "news"3) "day day up"
服務端例子:
redis 127.0.0.1:6379> publish news ‘good good study‘(integer) 1redis 127.0.0.1:6379> publish news ‘day day up‘(integer) 1
七,RDB的持久化
Redis的持久化有2種方式 1快照 2是日誌
快照持久化:
Rdb快照的配置選項
save 900 1 // 900內,有1條寫入,則產生快照 save 300 1000 // 如果300秒內有1000次寫入,則產生快照save 60 10000 // 如果60秒內有10000次寫入,則產生快照(這3個選項都屏蔽,則rdb禁用)
stop-writes-on-bgsave-error yes //後台備份進程出錯時,主進程停不停止寫入?rdbcompression yes //匯出的rdb檔案是否壓縮Rdbchecksum yes //匯入rbd恢複時資料時,要不要檢驗rdb的完整性dbfilename dump.rdb //匯出來的rdb檔案名稱dir ./ //rdb的放置路徑
aof持久化:
Aof 的配置
appendonly no # 是否開啟 aof日誌功能appendfsync always # 每1個命令,都立即同步到aof. 安全,速度慢appendfsync everysec # 折衷方案,每秒寫1次appendfsync no # 寫入工作交給作業系統,由作業系統判斷緩衝區大小,統一寫入到aof. 同步頻率低,速度快,no-appendfsync-on-rewrite yes: # 正在匯出rdb快照的過程中,要不要停止同步aofauto-aof-rewrite-percentage 100 #aof檔案大小比起上次重寫時的大小,增長率100%時,重寫auto-aof-rewrite-min-size 64mb #aof檔案,至少超過64M時,重寫
注: aof重寫是指什麼?
答: aof重寫是指把記憶體中的資料,逆化成命令,寫入到.aof日誌裡.
以解決 aof日誌過大的問題.
問: 如果rdb檔案,和aof檔案都存在,優先用誰來恢複資料?
答: aof
問: 2種是否可以同時用?
答: 可以,而且推薦這麼做
問: 恢複時rdb和aof哪個恢複的快
答: rdb快,因為其是資料的記憶體映射,直接載入到記憶體,而aof是命令,需要逐條執行
Redis學習二