目次
redisの紹介の章では、redisの基本的な操作手順を紹介しましたが、本日は、redisの高度な操作と、jedisやredisTemplateなどのツールキットにパッケージされていないコマンドの使用方法を紹介します。この記事を読んだ後は、全体的なredisについてより深く理解できると思います。
1.ピペリンモードの概要
1.redisの通常の使用法
ほとんどの場合、リクエストとレスポンスのメカニズムを介してredisを操作します。このモードを使用する手順は次のとおりです。
- jedisインスタンスを取得する
- redisコマンドを送信する
- redisはシングルスレッドであるため、最後のコマンドが処理されるまでコマンドは実行されません。
全体の相互作用プロセスは次のとおりです
2.パイプラインモード
ただし、パイプラインモードを使用すると、クライアントはサーバーが戻るのを待たずに一度に複数のコマンドを送信できます。これにより、ネットワークのラウンドトリップ時間が大幅に短縮され、システムパフォーマンスが向上します。
パイプラインは複数のコマンドの組み合わせです。PIPELINEを使用すると、ネットワークオーバーヘッドの問題を解決できます。原理も非常に簡単です。プロセスは次のとおりです。複数のコマンドをパッケージ化した後、それらは一度にRedisに送信され、ネットワーク通信は1回だけです。
3.パフォーマンスの比較
インターネット |
ディレイ |
非パイプライン |
パイプライン |
ネイティブ |
1300 |
1414 |
114 |
イントラネットサーバー |
1222ms |
1532ms |
310ms |
リモートコンピュータルーム |
90910ms |
92000ms |
1090ms |
ことがわかるのRedisの遅延は、主のIOの数で発生するネットワークによって要求された我々はRedisのを使用するときに、我々は可能な限りのネットワークのIOの数を削減し、パイプラインを介して実行するために1つのコマンドに組み込む複数の命令をカプセル化してみてください。
2、Redisのもの
redisの単純なトランザクションは、実行する必要のあるコマンドのグループを2つのコマンドmultiとexecの間に配置することです。ここで、multiはトランザクションの開始を表し、execはトランザクションの終了を表します。
1.トランザクションの順序
マルチ:トランザクション開始
exec:トランザクションのコミット
監視:トランザクション監視
WATCHコマンドは、1つ以上のキーを監視できます。キーの1つが変更(または削除)されると、後続のトランザクションは実行されません。監視は
破棄:トランザクションを停止します
execを実行する前にコマンドを実行すると、コミットトランザクションが失敗し、実行されたコマンドがロールバックされます。
127.0.0.1:6379> multi //开始事务
OK
127.0.0.1:6379> sadd tt 1 //业务操作
QUEUED
127.0.0.1:6379> DISCARD //停止事务
OK
127.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 //开始事务
OK
127.0.0.1:6379> set aa 123 //业务操作
QUEUED
127.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> multi
OK
127.0.0.1:6379> set t 1 //业务操作1
QUEUED
127.0.0.1:6379> sadd t 1 //业务操作2
QUEUED
127.0.0.1:6379> set t 2 //业务操作3
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value //类型异常
3) OK
127.0.0.1:6379> get t //可以获取到t
"2"
127.0.0.1:6379>
3、redisの公開とサブスクライブ
Redisは、「発行、サブスクライブ」メッセージメカニズムを提供します。このメカニズムでは、メッセージサブスクライバーと発行者は直接通信せず、発行者は指定されたチャネルにメッセージを発行し、チャネルにサブスクライブしている各クライアントはメッセージを受信できます。
1.一般的なコマンドを再公開およびサブスクライブします
コマンド | 意味 |
公開チャンネル | ニュースをリリースする |
サブスクライブチャネル | ニュースを購読する |
pubsubnumsubチャネル | サブスクリプションの数を表示する |
チャンネル登録解除 | 退会 |
購読ch * | モードで購読および購読解除 |
2.パフォーマンステスト
私の他のブログ投稿を参照してください:redisの公開とサブスクライブのパフォーマンステスト
3.アプリケーションシナリオ
Redisは主に、メッセージの公開、チャネルのサブスクライブ、モデルに応じたサブスクライブ解除とサブスクライブおよびサブスクライブ解除、および多くのプロフェッショナルメッセージキュー(kafkarabbitmq)を提供します。アプリケーションシナリオを満たすことができる場合は、これを使用することもできます
- サブスクリプションアカウント、公式アカウント、Weiboフォロワー、電子メールサブスクリプションシステムなど。
- たとえ通信システムが
- グループチャット部族システム(WeChatグループ)
第四に、主要な移行
redisマスタースレーブ同期が一般的に使用されるため、多くのキー移行を使用しない場合があります。ただし、データの統計分析を行う場合は、ユーザータグなどを使用する場合があります。キーの一括削除によるredisのなだれを回避するために、通常は計算に使用されるredisと最終的なビジネスで使用されるredisを使用し、計算で使用されるredisのキー値は移行によってビジネスのredisに1つずつ更新されます。 、ビジネスへの影響を最小限に抑えるため。
1、移動
移動命令は、あるredisライブラリのデータを別のライブラリに移行します。
move key db //reids有16个库, 编号为0-15
set name DK; move name 5 //迁移到第6个库
elect 5 ;//数据库切换到第6个库,
get name 可以取到james1
キーがターゲットデータベースにすでに存在する場合、何も起こりません。このモードは、実稼働環境での使用はお勧めしません。同じリードで再生できます。
2、ダンプ
Redis DUMPコマンドは、キーをシリアル化し、シリアル化された値を返すために使用されます。他のサービスにインポートするために使用されます
通常、dumpコマンドを使用してエクスポートされ、restoreコマンドを使用してインポートされます。
1、上のAのサーバー
set name james;
dump name; // 得到"\x00\x05james\b\x001\x82;f\"DhJ"
2、上のBのサーバー
restore name 0 "\x00\x05james\b\x001\x82;f\"DhJ" //0代表没有过期时间
get name //返回james
3、移行する
Migrateは、Redisインスタンス間でデータを移行するために使用されます。実際、migrateコマンドは、dump、restore、delの3つのコマンドを組み合わせて、操作プロセスを簡素化します。
移行コマンドはアトミックであり、複数のキーを移行する機能はRedis3.0.6以降でサポートされています。移行コマンドのデータ送信は、ソースRedisとターゲットRedisで直接完了します。ターゲットRedisが復元を完了すると、ソースRedisにOKが送信されます。
移行する |
192.168.42.112 |
6379 |
名前 |
0 |
1000 |
コピー |
交換 |
命令 |
移行する宛先IP |
ポート |
キー値を移行する |
ターゲットライブラリ |
残業時間 |
移行後に元のキーを削除しないでください |
ターゲットライブラリにテストキーがないかどうかに関係なく、移行は成功します |
例:111の名前キー値を112のredisに移行します
192.168.42.111:6379> migrate 192.168.42.112 6379 name 0 1000 copy
5つのカスタムコマンドパッケージ
jedisまたはjdbctemplateを使用する場合、キー移行命令を実行するときに、関連する命令がまったくカプセル化されていないことがわかります。この時点で何をする必要がありますか?フレームワークがカプセル化に役立つ方法に加えて、リフレクションによってコマンドをカプセル化することもできます。主な手順は次のとおりです。
- 接続リンクを確立し、接続を使用してRedisに接続します
- リフレクションを介してConnectionのsendCommandメソッドを取得します(保護されたConnection sendCommand(Command cmd、String ... args))。
- 接続のsendCommandメソッドを呼び出します。2番目のパラメーターは実行されるコマンド(set、get、clientなど)であり、3番目のパラメーターはコマンドのパラメーターです。ProtocolCommand列挙オブジェクトに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连接Redis
try (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-value
method.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();
}
}
}
6、キーフルトラバーサル
1、キー
命令 | 意味 |
キー* | すべてのキーを返します。*任意の文字と複数の文字に一致します |
キー* y | で終わるキー |
キーn * e | nで始まり、eで終わり、名前を返します |
キーn?me | ?疑問符は、1文字のみが一致することを意味します戻り名、グローバル一致 |
キーn?m * | 戻り名 |
キー[j、l] * | jlキーで始まるすべてのキーを返します[j] amesは完全にjamesに一致します |
シングルスレッドであることを考慮すると、changeコマンドを使用するとスレッドがブロックされます。多くのキーがブロックされる可能性があるため、実稼働環境で使用することはお勧めしません。
2.プログレッシブトラバーサルスキャン
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开始
2回目は、nで始まる20個のキーがカーソル4096からフェッチされます。これは、ページごとにフェッチするのと同じです。最後に0に戻ると、キーがフェッチされます。
3.スキャンとキーの比較
- カーソルを介して分散されるため、スレッドはブロックされません。
- 制限パラメーターを指定します。毎回返される結果の最大数を制御できます。制限は許可されていません。返される結果は多かれ少なかれ可能です。
- キーと同様に、スキャンもパターンマッチング機能を提供します。
- サーバーはカーソルの状態を保存する必要はありません。カーソルの状態は、スキャンがクライアントに返すカーソル整数のみです。
- スキャンによって返される結果は繰り返される可能性があり、クライアントを繰り返す必要があります。
- スキャントラバーサル中にデータが変更された場合、変更されたデータをトラバースできるかどうかは不明です。
- 単一の戻り値が空の結果は、トラバーサルの終了を意味するのではなく、返されたカーソル値がゼロであるかどうかによって異なります。
4.その他のトラバーサルコマンド
SCAN コマンドは、現在のデータベースのデータベースキーを反復するために使用されます。
SSCAN コマンドは、コレクションキーの要素を反復するために使用されます。
HSCAN コマンドは、ハッシュキーのキーと値のペアを反復するために使用されます。
ZSCAN コマンドは、順序付けられたセット内の要素(要素メンバーと要素スコアを含む)を反復するために使用されます。
使用法はスキャンと同じです