subscribe error不执行_你不知道的redis:第三方jar无封装命令我们该怎么执行?
redis的基本操作指令就不多說(shuō)了,今天對(duì)redis的進(jìn)階操作給大家介紹一下,以及對(duì)于jedis和redisTemplate等工具包沒有封裝的命令我們?cè)撊绾问褂?#xff1f;相信大家讀了本篇對(duì)redis的整體會(huì)有更深的認(rèn)知。
一、Pipelin模式介紹
1、redis的通常使用方式
大多數(shù)情況下,我們都會(huì)通過(guò)請(qǐng)求-相應(yīng)機(jī)制去操作redis。使用這種模式的步驟為
整個(gè)交互流程如下
2、Pipeline模式
然而使用Pipeline 模式,客戶端可以一次性的發(fā)送多個(gè)命令,無(wú)需等待服務(wù)端返回。這樣就大大的減少了網(wǎng)絡(luò)往返時(shí)間,提高了系統(tǒng)性能。
pipeline是多條命令的組合,使用PIPELINE 可以解決網(wǎng)絡(luò)開銷的問題,原理也非常簡(jiǎn)單,流程如下, 將多個(gè)指令打包后,一次性提交到Redis, 網(wǎng)絡(luò)通信只有一次
3、性能對(duì)比
可以看到,redis的延遲主要出現(xiàn)在網(wǎng)絡(luò)請(qǐng)求的IO次數(shù)上,因此我們?cè)谑褂胷edis的時(shí)候,盡量減少網(wǎng)絡(luò)IO次數(shù),通過(guò)pipeline的方式將多個(gè)指令封裝在一個(gè)命令里執(zhí)行。
二、Redis事物
redis的簡(jiǎn)單事務(wù)是將一組需要一起執(zhí)行的命令放到multi和exec兩個(gè)命令之間,其中multi代表事務(wù)開始,exec代表事務(wù)結(jié)束
1、事務(wù)命令
multi:事務(wù)開始
exec:提交事務(wù)
watch:事務(wù)監(jiān)控
WATCH命令可以監(jiān)控一個(gè)或多個(gè)鍵,一旦其中有一個(gè)鍵被修改(或刪除),之后的事務(wù)就不會(huì)執(zhí)行。監(jiān)控一直持續(xù)到
discard:停止事務(wù)
在執(zhí)行exec之前執(zhí)行該命令,提交事務(wù)會(huì)失敗,執(zhí)行的命令會(huì)進(jìn)行回滾
127.0.0.1:6379> multi //開始事務(wù)OK127.0.0.1:6379> sadd tt 1 //業(yè)務(wù)操作QUEUED127.0.0.1:6379> DISCARD //停止事務(wù)OK127.0.0.1:6379> exec //提交事務(wù)(error) ERR EXEC without MULTI //報(bào)不存在事務(wù)異常127.0.0.1:6379> get tt //獲取不到對(duì)象(nil)127.0.0.1:6379>2、事務(wù)異常
redis支持事務(wù),但他屬于弱事務(wù),中間的一些異常可能會(huì)導(dǎo)致事務(wù)失效。
1、命令錯(cuò)誤,語(yǔ)法不正確,導(dǎo)致事務(wù)不能正常結(jié)束
127.0.0.1:6379> multi //開始事務(wù)OK127.0.0.1:6379> set aa 123 //業(yè)務(wù)操作QUEUED127.0.0.1:6379> sett bb 124 //命令錯(cuò)誤(error) ERR unknown command 'sett'127.0.0.1:6379> exec (error) EXECABORT Transaction discarded because of previous errors. //提交事務(wù)異常127.0.0.1:6379> get aa //查詢不到數(shù)據(jù)(nil)127.0.0.1:6379>2、運(yùn)行錯(cuò)誤,語(yǔ)法正確,但類型錯(cuò)誤,事務(wù)可以正常結(jié)束
127.0.0.1:6379> multiOK127.0.0.1:6379> set t 1 //業(yè)務(wù)操作1QUEUED127.0.0.1:6379> sadd t 1 //業(yè)務(wù)操作2QUEUED127.0.0.1:6379> set t 2 //業(yè)務(wù)操作3QUEUED127.0.0.1:6379> exec1) OK2) (error) WRONGTYPE Operation against a key holding the wrong kind of value //類型異常3) OK127.0.0.1:6379> get t //可以獲取到t"2"127.0.0.1:6379>三、redis發(fā)布與訂閱
redis提供了“發(fā)布、訂閱”模式的消息機(jī)制,其中消息訂閱者與發(fā)布者不直接通信,發(fā)布者向指定的頻道(channel)發(fā)布消息,訂閱該頻道的每個(gè)客戶端都可以接收到消息
1、Redis發(fā)布訂閱常用命令
| 命令 | 含義 |
| publish channel | 發(fā)布消息 |
| subscribe channel | 訂閱消息 |
| pubsub numsub channel | 查看訂閱數(shù) |
| unsubscribe channel | 取消訂閱 |
| psubscribe ch* | 按模式訂閱和取消訂閱 |
2、性能測(cè)試
3、應(yīng)用場(chǎng)景
redis主要提供發(fā)布消息、訂閱頻道、取消訂閱以及按照模式訂閱和取消訂閱,和很多專業(yè)的消息隊(duì)列(kafka rabbitmq),redis的發(fā)布訂閱顯得很lower, 比如無(wú)法實(shí)現(xiàn)消息規(guī)程和回溯, 但就是簡(jiǎn)單,如果能滿足應(yīng)用場(chǎng)景,用這個(gè)也可以
四、鍵的遷移
鍵遷移大家可能用的不是很多,因?yàn)橐话愣际鞘褂胷edis主從同步。不過(guò)對(duì)于我們做數(shù)據(jù)統(tǒng)計(jì)分析使用的時(shí)候,可能會(huì)使用到,比如用戶標(biāo)簽。為了避免key批量刪除導(dǎo)致的redis雪崩,一般都是通過(guò)一個(gè)計(jì)算使用的redis和一個(gè)最終業(yè)務(wù)使用的redis,通過(guò)將計(jì)算時(shí)用的redis里的鍵值通過(guò)遷移的方式一個(gè)一個(gè)的更新到業(yè)務(wù)redis中,使其對(duì)業(yè)務(wù)沖擊最小化。
1、move
move指令將redis一個(gè)庫(kù)中的數(shù)據(jù)遷移到另外一個(gè)庫(kù)中。
move key db //reids有16個(gè)庫(kù), 編號(hào)為0-15 set name DK; move name 5 //遷移到第6個(gè)庫(kù) elect 5 ;//數(shù)據(jù)庫(kù)切換到第6個(gè)庫(kù), get name 可以取到j(luò)ames1如果key在目標(biāo)數(shù)據(jù)庫(kù)中已存在,那么什么也不會(huì)發(fā)生。這種模式不建議在生產(chǎn)環(huán)境使用,在同一個(gè)reids里可以玩
2、dump
Redis DUMP 命令用于將key給序列化 ,并返回被序列化的值。用于導(dǎo)入到其他服務(wù)中
一般通過(guò)dump命令導(dǎo)出,使用restore命令導(dǎo)入。
1,在A服務(wù)器上
set name james; dump name; // 得到"x00x05jamesbx001x82;f"DhJ"2,在B服務(wù)器上
restore name 0 "x00x05jamesbx001x82;f"DhJ" //0代表沒有過(guò)期時(shí)間 get name //返回james3、migrate
migrate用于在Redis實(shí)例間進(jìn)行數(shù)據(jù)遷移,實(shí)際上migrate命令是將dump、restore、del三個(gè)命令進(jìn)行組合,從而簡(jiǎn)化了操作流程。
migrate命令具有原子性,從Redis 3.0.6版本后已經(jīng)支持遷移多個(gè)鍵的功能。migrate命令的數(shù)據(jù)傳輸直接在源Redis和目標(biāo)Redis上完成,目標(biāo)Redis完成restore后會(huì)發(fā)送OK給源Redis。
| migrate | 192.168.42.112 | 6379 | name | 0 | 1000 | copy | replace |
| 指令 | 要遷移的目標(biāo)IP | 端口 | 遷移鍵值 | 目標(biāo)庫(kù) | 超時(shí)時(shí)間 | 遷移后不刪除原鍵 | 不管目標(biāo)庫(kù)是不存在test鍵都遷移成功 |
比如:把111上的name鍵值遷移到112上的redis
192.168.42.111:6379> migrate 192.168.42.112 6379 name 0 1000 copy五、自定義命令封裝
當(dāng)我們使用jedis或者jdbctemplate時(shí),想執(zhí)行鍵遷移的指令的時(shí)候,發(fā)現(xiàn)根本沒有給我們封裝相關(guān)指令,這個(gè)時(shí)候我們?cè)撛趺崔k呢?除了框架幫我們封裝的方法外,我們自己也可以通過(guò)反射的方式進(jìn)行命令的封裝,主要步驟如下
六、鍵全量遍歷
1、keys
| 指令 | 含義 |
| keys * | 返回所有的鍵, *匹配任意字符多個(gè)字符 |
| keys *y | 以結(jié)尾的鍵 |
| keys n*e | 以n開頭以e結(jié)尾,返回name |
| keys n?me | ?問號(hào)代表只匹配一個(gè)字符 返回name,全局匹配 |
| keys n?m* | 返回name |
| keys [j,l]* | 返回以j l開頭的所有鍵 keys [j]ames 全量匹配james |
考慮到是單線程,使用改命令會(huì)阻塞線程, 在生產(chǎn)環(huán)境不建議使用,鍵多可能會(huì)阻塞。
2、漸進(jìn)式遍歷 scan
1,初始化數(shù)據(jù)
mset n1 1 n2 2 n3 3 n4 4 n5 5 n6 6 n7 7 n8 8 n9 9 n10 10 n11 11 n12 12 n13 132,遍歷匹配
scan 0 match n* count 5 匹配以n開頭的鍵,最大是取5條,第一次scan 0開始第二次從游標(biāo)4096開始取20個(gè)以n開頭的鍵,相當(dāng)于一頁(yè)一頁(yè)的取當(dāng)最后返回0時(shí),鍵被取完。
3、scan 和keys對(duì)比
4、其他遍歷命令
SCAN 命令用于迭代當(dāng)前數(shù)據(jù)庫(kù)中的數(shù)據(jù)庫(kù)鍵。
SSCAN 命令用于迭代集合鍵中的元素。
HSCAN 命令用于迭代哈希鍵中的鍵值對(duì)。
ZSCAN 命令用于迭代有序集合中的元素(包括元素成員和元素分值)。
用法和scan一樣
作者:ark_King_原文鏈接:https://blog.csdn.net/b379685397/article/details/109015852
總結(jié)
以上是生活随笔為你收集整理的subscribe error不执行_你不知道的redis:第三方jar无封装命令我们该怎么执行?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue和java实现页面增删改_Spri
- 下一篇: 如何在vb.net中取得两时间的毫秒差_