日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

subscribe error不执行_你不知道的redis:第三方jar无封装命令我们该怎么执行?

發布時間:2024/7/23 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 subscribe error不执行_你不知道的redis:第三方jar无封装命令我们该怎么执行? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

redis的基本操作指令就不多說了,今天對redis的進階操作給大家介紹一下,以及對于jedis和redisTemplate等工具包沒有封裝的命令我們該如何使用?相信大家讀了本篇對redis的整體會有更深的認知。

一、Pipelin模式介紹

1、redis的通常使用方式

大多數情況下,我們都會通過請求-相應機制去操作redis。使用這種模式的步驟為

  • 獲得jedis實例
  • 發送redis命令
  • 由于redis是單線程的,所以處理完上一個指令之后才會進行執行該命令。
  • 整個交互流程如下

    2、Pipeline模式

    然而使用Pipeline 模式,客戶端可以一次性的發送多個命令,無需等待服務端返回。這樣就大大的減少了網絡往返時間,提高了系統性能。

    pipeline是多條命令的組合,使用PIPELINE 可以解決網絡開銷的問題,原理也非常簡單,流程如下, 將多個指令打包后,一次性提交到Redis, 網絡通信只有一次

    3、性能對比

    可以看到,redis的延遲主要出現在網絡請求的IO次數上,因此我們在使用redis的時候,盡量減少網絡IO次數,通過pipeline的方式將多個指令封裝在一個命令里執行。

    二、Redis事物

    redis的簡單事務是將一組需要一起執行的命令放到multi和exec兩個命令之間,其中multi代表事務開始,exec代表事務結束

    1、事務命令

    multi:事務開始

    exec:提交事務

    watch:事務監控

    WATCH命令可以監控一個或多個鍵,一旦其中有一個鍵被修改(或刪除),之后的事務就不會執行。監控一直持續到

    discard:停止事務

    在執行exec之前執行該命令,提交事務會失敗,執行的命令會進行回滾

    127.0.0.1:6379> multi //開始事務OK127.0.0.1:6379> sadd tt 1 //業務操作QUEUED127.0.0.1:6379> DISCARD //停止事務OK127.0.0.1:6379> exec //提交事務(error) ERR EXEC without MULTI //報不存在事務異常127.0.0.1:6379> get tt //獲取不到對象(nil)127.0.0.1:6379>

    2、事務異常

    redis支持事務,但他屬于弱事務,中間的一些異??赡軙е率聞帐?。

    1、命令錯誤,語法不正確,導致事務不能正常結束

    127.0.0.1:6379> multi //開始事務OK127.0.0.1:6379> set aa 123 //業務操作QUEUED127.0.0.1:6379> sett bb 124 //命令錯誤(error) ERR unknown command 'sett'127.0.0.1:6379> exec (error) EXECABORT Transaction discarded because of previous errors. //提交事務異常127.0.0.1:6379> get aa //查詢不到數據(nil)127.0.0.1:6379>

    2、運行錯誤,語法正確,但類型錯誤,事務可以正常結束

    127.0.0.1:6379> multiOK127.0.0.1:6379> set t 1 //業務操作1QUEUED127.0.0.1:6379> sadd t 1 //業務操作2QUEUED127.0.0.1:6379> set t 2 //業務操作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發布與訂閱

    redis提供了“發布、訂閱”模式的消息機制,其中消息訂閱者與發布者不直接通信,發布者向指定的頻道(channel)發布消息,訂閱該頻道的每個客戶端都可以接收到消息

    1、Redis發布訂閱常用命令

    命令含義
    publish channel發布消息
    subscribe channel訂閱消息
    pubsub numsub channel查看訂閱數
    unsubscribe channel取消訂閱
    psubscribe ch*按模式訂閱和取消訂閱

    2、性能測試

    3、應用場景

    redis主要提供發布消息、訂閱頻道、取消訂閱以及按照模式訂閱和取消訂閱,和很多專業的消息隊列(kafka rabbitmq),redis的發布訂閱顯得很lower, 比如無法實現消息規程和回溯, 但就是簡單,如果能滿足應用場景,用這個也可以

  • 訂閱號、公眾號、微博關注、郵件訂閱系統等
  • 即使通信系統
  • 群聊部落系統(微信群)
  • 四、鍵的遷移

    鍵遷移大家可能用的不是很多,因為一般都是使用redis主從同步。不過對于我們做數據統計分析使用的時候,可能會使用到,比如用戶標簽。為了避免key批量刪除導致的redis雪崩,一般都是通過一個計算使用的redis和一個最終業務使用的redis,通過將計算時用的redis里的鍵值通過遷移的方式一個一個的更新到業務redis中,使其對業務沖擊最小化。

    1、move

    move指令將redis一個庫中的數據遷移到另外一個庫中。

    move key db //reids有16個庫, 編號為0-15 set name DK; move name 5 //遷移到第6個庫 elect 5 ;//數據庫切換到第6個庫, get name 可以取到james1

    如果key在目標數據庫中已存在,那么什么也不會發生。這種模式不建議在生產環境使用,在同一個reids里可以玩

    2、dump

    Redis DUMP 命令用于將key給序列化 ,并返回被序列化的值。用于導入到其他服務中

    一般通過dump命令導出,使用restore命令導入。

    1,在A服務器上

    set name james; dump name; // 得到"x00x05jamesbx001x82;f"DhJ"

    2,在B服務器上

    restore name 0 "x00x05jamesbx001x82;f"DhJ" //0代表沒有過期時間 get name //返回james

    3、migrate

    migrate用于在Redis實例間進行數據遷移,實際上migrate命令是將dump、restore、del三個命令進行組合,從而簡化了操作流程。

    migrate命令具有原子性,從Redis 3.0.6版本后已經支持遷移多個鍵的功能。migrate命令的數據傳輸直接在源Redis和目標Redis上完成,目標Redis完成restore后會發送OK給源Redis。

    migrate192.168.42.1126379name01000copyreplace
    指令要遷移的目標IP端口遷移鍵值目標庫超時時間遷移后不刪除原鍵不管目標庫是不存在test鍵都遷移成功

    比如:把111上的name鍵值遷移到112上的redis

    192.168.42.111:6379> migrate 192.168.42.112 6379 name 0 1000 copy

    五、自定義命令封裝

    當我們使用jedis或者jdbctemplate時,想執行鍵遷移的指令的時候,發現根本沒有給我們封裝相關指令,這個時候我們該怎么辦呢?除了框架幫我們封裝的方法外,我們自己也可以通過反射的方式進行命令的封裝,主要步驟如下

  • 建立Connection鏈接,使用Connection連接Redis
  • 通過反射獲取Connection中的sendCommand方法(protected Connection sendCommand(Command cmd, String... args))。
  • 調用connection的sendCommand方法,第二個參數為執行的命令(比如set,get,client等),第三個參數為命令的參數??梢钥吹絇rotocolCommand這個枚舉對象包含了redis的所有指令,即所有的指令都可以通過這個對象獲取到。并封裝執行
  • 執行invoke方法,并且按照redis的指令封裝參數
  • 獲取Redis的命令執行結果
  • package com.james.cache.jedis;import redis.clients.jedis.Connection; import redis.clients.jedis.Protocol;import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;/*** @Auther: DK* @Date: 2020/10/11 23:17* @Description:*/ public class RedisKeyMove {public static void main(String[] args) throws IOException {//1.使用Connection連接Redistry (Connection connection = new Connection("10.1.253.188", 6379)) {// 2. 通過反射獲取Connection中的sendCommand方法(protected Connection sendCommand(Command cmd, String... args))。Method method = Connection.class.getDeclaredMethod("sendCommand", Protocol.Command.class, String[].class);method.setAccessible(true); // 設置可以訪問private和protected方法// 3. 調用connection的sendCommand方法,第二個參數為執行的命令(比如set,get,client等),第三個參數為命令的參數。// 3.1 該命令最終對應redis中為: set test-key test-valuemethod.invoke(connection, Protocol.Command.MIGRATE,new String[] {"10.1.253.69", "6379", "name", "0", "1000", "copy"});// 4.獲取Redis的命令執行結果System.out.println(connection.getBulkReply());} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}} }

    六、鍵全量遍歷

    1、keys

    指令含義
    keys *返回所有的鍵, *匹配任意字符多個字符
    keys *y以結尾的鍵
    keys n*e以n開頭以e結尾,返回name
    keys n?me?問號代表只匹配一個字符 返回name,全局匹配
    keys n?m*返回name
    keys [j,l]*返回以j l開頭的所有鍵 keys [j]ames 全量匹配james

    考慮到是單線程,使用改命令會阻塞線程, 在生產環境不建議使用,鍵多可能會阻塞。

    2、漸進式遍歷 scan

    1,初始化數據

    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 13

    2,遍歷匹配

    scan 0 match n* count 5 匹配以n開頭的鍵,最大是取5條,第一次scan 0開始

    第二次從游標4096開始取20個以n開頭的鍵,相當于一頁一頁的取當最后返回0時,鍵被取完。

    3、scan 和keys對比

  • 通過游標分布進行的,不會阻塞線程;
  • 提供 limit 參數,可以控制每次返回結果的最大條數,limit 不準,返回的結果可多可少;
  • 同 keys 一樣,Scan也提供模式匹配功能;
  • 服務器不需要為游標保存狀態,游標的唯一狀態就是 scan 返回給客戶端的游標整數;
  • scan返回的結果可能會有重復,需要客戶端去重復;
  • scan遍歷的過程中如果有數據修改,改動后的數據能不能遍歷到是不確定的;
  • 單次返回的結果是空的并不意味著遍歷結束,而要看返回的游標值是否為零;
  • 4、其他遍歷命令

    SCAN 命令用于迭代當前數據庫中的數據庫鍵。

    SSCAN 命令用于迭代集合鍵中的元素。

    HSCAN 命令用于迭代哈希鍵中的鍵值對。

    ZSCAN 命令用于迭代有序集合中的元素(包括元素成員和元素分值)。

    用法和scan一樣

    作者:ark_King_
    原文鏈接:https://blog.csdn.net/b379685397/article/details/109015852

    總結

    以上是生活随笔為你收集整理的subscribe error不执行_你不知道的redis:第三方jar无封装命令我们该怎么执行?的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。