記事ディレクトリ
1。概要
メモの要約:
- NoSQL: 非リレーショナル データベース。NoSQL データベースは、異なるデータ ストレージとクエリ モデルを提供します。
- Redis の機能:
- Key-Value 型、Value はさまざまなデータ構造をサポートし、豊富な機能を備えています
- シングルスレッド、各コマンドはアトミックです ( Redis6.0 のネットワーク部分はマルチスレッドです)
- 低遅延、高速 (メモリベース、IO 多重化、優れたエンコーディング)。
- データの永続性をサポートする
- マスター/スレーブ クラスターとシャード クラスターをサポート
- 多言語クライアントのサポート
- Redis の新機能:
- Redis の機能
- クライアントのエビクション
- ACL v2
- マルチパート AOF
- ……
1.1NoSQL
NoSQL (Not Only SQL) は、非リレーショナル データベース管理システムのグループを表す広範なデータベース分類です。従来のリレーショナル データベース (SQL データベースなど) と比較して、NoSQL データベースは異なるデータ ストレージとクエリ モデルを提供します。
例証します:
- リレーショナル データベースには構造化データが格納され、各タプルまたはフィールドに制約などの条件を追加できます。
- 非リレーショナル データベースは、通常はキーと値のペアの形式で非構造化データを保存します。保存されるデータは文書やグラフなど多岐にわたります
例証します:
- リレーショナル データベースに格納されているデータは、3 番目のテーブルを通じて相互に関連付けることができます。
- 非リレーショナル データベースに格納されたデータは相互に関連していません
例証します:
- リレーショナル データベースに保存されているデータは、SQL ステートメントを通じて追加、削除、変更、確認できます。
- 非リレーショナル データベースに保存されるデータには独自のデータ保存方法があり、保存ルールも異なります。
例証します:
- リレーショナル データベースは、原子性、一貫性、分離性、耐久性などのトランザクションの ACID 特性をサポートします。
- 非リレーショナル データベース ストレージにはトランザクションがありません
一般に、SQL と NoSQL の違いは次の表に要約できます。
1.2 意味
Redis は 2009 年に誕生し、正式名はRemoteDictionaryServerというリモート辞書サーバーで、メモリベースのキーと値の NoSQL データです。
特徴:
- Key-Value 型、Value はさまざまなデータ構造をサポートし、豊富な機能を備えています
- シングルスレッド、各コマンドはアトミックです (Redis6.0 のネットワーク部分はマルチスレッドです)
- 低遅延、高速 (メモリベース、IO 多重化、優れたエンコーディング)。
- データの永続性をサポートする
- マスター/スレーブ クラスターとシャード クラスターをサポート
- 多言語クライアントのサポート
1.3 Redis の新機能
Redis の機能
例証します:
Redis 関数。サーバー側スクリプトを通じて Redis を拡張する新しい方法で、関数はデータ自体と一緒に保存されます。つまり、redis は Lua スクリプトの仕事を奪おうとしているのです。
クライアントのエビクション
例証します:
Redis に接続する人数とパフォーマンスが構成可能になる
マルチパート AOF
例証します:
非同期の読み取りと書き込みはもはや問題点ではありません
ACL v2
例証します:
洗練された権限管理。クラスターのパスワードなどを設定できます。
リストパック
例証します:
listpack は、ziplist を置き換えるために使用される新しいデータ構造です。バージョン 7.0 には ziplist 構成はありません (バージョン 6.0 では、一部のデータ型のみが移行段階として使用されます)。
2. 基本的な使用例
メモの要約:
インストールして実行する
窓で…
Dockerコンテナ内で
sudo docker run --restart=always --log-opt max-size=100m --log-opt max-file=2 -p 6379:6379 --name myredis -v /home/redis/myredis/myredis.conf:/etc/redis/redis.conf -v /home/redis/myredis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes --requirepass qweasdzxc
グラフィカルインターフェイスを使用して...
共通コマンド
- 文字列型:
- 追加:SET、GET、MSET(複数セット)、MGET
- 修正:INCR(増加)、INCRBY(増加)、INCRBYFLOAT(浮動小数点増加)、SETNX(存在しない場合に設定)、SETEX(期限切れの場合に設定)
- ハッシュタイプ:
- 添加:HSET、HGET、HMSET(hash mulitiple set )
- 修正:HINCRBY(ハッシュ増加)、HSETNX(存在しない場合はハッシュセット)
- クエリ: HMGET (ハッシュ複数取得)、HGETALL、HKEYS、HVALS
- リストの種類:
- 追加: LPUSH、RPUSH
- 削除: LPOP、RPOP、BLPOP、BRPOP: LPOP と RPOP に似ていますが、要素がない場合に nil を直接返すのではなく、指定された時間待機する点が異なります。
- クエリ: LRANGE
- セットタイプ:
- 添加:SADD(set addtion)
- 削除: SREM (メンバーの削除を設定)
- 修正:SINTER(交差集合)、SUNION(和集合)、SDIFF(異なる集合)
- 查询:SCARD(セットのカーディナリティ)、SISMEMBER(セットはメンバー)、SMEMBERS(セットのメンバー)
- SortedSet タイプ、BitMap タイプ、HyperLogLog タイプ、Stream タイプ、GEO タイプ: 詳細を確認してください
2.1 インストールして実行する
2.1.1 Windows システムの場合
ステップ 1: 解凍する
例証します:
インストール後、以下のファイルが生成されます
開始例:
ステップ 2: サーバーを起動する
redis-server.exe redis.windows.conf
例証します:
- サーバーを起動するときに、redis 構成ファイルを指定する必要があります
- 設定項目が追加されていない場合は、エラーが報告されます。
知らせ:
conf構成項目を追加する必要があります
ステップ 3: クライアントを起動する
1. クライアントを起動します
例証します:
Redis サーバーが起動しても、「スタンドアロン モードで実行中」というプロンプトが表示されない場合は、クライアントを開いてシャットダウン操作を実行する必要があります。
# 通过cmd打开客户端 redis-cli.exe # 关闭客户端 shutdown
今すぐサーバーを再起動してください
2. サーバーを再起動します
redis-server.exe redis.windows.conf
例証します:
- 再起動したら成功
2.1.2 Dockerコンテナ内
ステップ 1: Docker イメージをプルする
sudo docker pull redis
ステップ 2: サーバーを起動する
sudo docker run --restart=always --log-opt max-size=100m --log-opt max-file=2 -p 6379:6379 --name myredis -v /home/redis/myredis/redis.conf:/etc/redis/redis.conf -v /home/redis/myredis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes --requirepass qweasdzxc
説明: パラメータの説明
sudo docker run
: Dockerコンテナを実行するコマンド。--restart=always
: 終了時にコンテナが自動的に再起動するように設定します。--log-opt max-size=100m
: コンテナログファイルの最大サイズを 100MB に設定します。--log-opt max-file=2
: コンテナーが保持するログ ファイルの最大数を 2 に設定します。-p 6379:6379
: コンテナーの Redis サービス ポートをホストの 6379 ポートにマッピングします。--name myredis
: コンテナーの名前を「myredis」として指定します。-v /home/redis/myredis/redis.conf:/etc/redis/redis.conf
: ホスト上の Redis 構成ファイルをコンテナー内の/etc/redis/redis.conf
パスにマウントします。-v /home/redis/myredis/data:/data
: Redis データを永続化するために、ホスト上のデータ ディレクトリを/data
コンテナー内のパスにマウントします。-d redis
: 実行するコンテナイメージをRedisが公式に提供するイメージである「redis」として指定します。redis-server /etc/redis/redis.conf
: コンテナーの起動時に実行する Redis サービスを指定し、Redis 構成ファイルのパスを渡します。--appendonly yes
: Redis の AOF (Append Only File) 永続モードをオンにし、ディスク上のファイルに書き込み操作を追加します。--requirepass qweasdzxc
: Redis サーバーのパスワードを「qweasdzxc」に設定します。つまり、Redis サービスにアクセスするにはパスワードが必要です。
知らせ:
Redis のリモート アクセス サービスを有効にする必要がある場合は、Redis のパスワードを設定する必要があります。
ステップ 3: クライアントを起動する
redis-cli [options] [commonds]
redis-cli -h 127.0.0.1 -p 6739 -a qweasdzxc
説明: パラメータの説明
-h 127.0.0.1
: 接続する Redis ノードの IP アドレスを指定します。デフォルトは 127.0.0.1 です。-p 6379
: 接続する Redis ノードのポートを指定します。デフォルトは 6379 です。-a 123321
: Redisのアクセスパスワードを指定します。
補充:
ping
: Redis サーバーでハートビート テストを実行すると、サーバーは正常に戻ります。pong
2.1.3 グラフィカル インターフェイス クライアントの実行
ステップ 1: クライアントをダウンロードする
URL; lework/RedisDesktopManager-Windows: RedisDesktopManager Windows 版 (github.com)
説明: 結果
ステップ 2: インストール
例証します:
インストールに失敗しました。Visual C++ を実行するには、ランタイム ライブラリをインストールする必要があります。
ステップ 3: 実行する
2.2 共通コマンド
2.2.1 概要
Redis はキーと値のデータベースであり、キーは通常 String 型ですが、値の型は多様です。
例証します:
redisには多くのデータ型がありますが、それぞれのコマンドを順番に紹介していきます。
学習を容易にするために、Redis ではさまざまなデータ型を操作するためのコマンドもグループ化されており、公式 Web サイト ( https://redis.io/commands ) でさまざまなコマンドを表示できます。
2.2.2 共通コマンド
一般的な命令は、一部のデータ型に使用できる命令であり、一般的な命令には次のものがあります。
- キー: テンプレートに一致するすべてのキーを表示します。運用環境の機器での使用はお勧めしません。
- DEL: 指定したキーを削除します
- EXISTS: キーが存在するかどうかを判断します。
- EXPIRE: キーの有効期間を設定します。有効期間が過ぎると、キーは自動的に削除されます。
- TTL: KEY の残りの有効期間を確認します。
例証します:
keys
Redisはシングルスレッドのため、Key値が多く存在するとスレッドブロッキングが発生するため、本番環境の機器での使用は推奨しません
補充:
- コマンドの具体的な使用方法は、help [command] で確認できます。次に例を示します。
2.2.3文字列型
2.2.3.1 概要
String 型 (文字列型とも呼ばれます) は、Redis で最も単純なストレージ型です。
その値は文字列ですが、文字列の形式に応じて、次の 3 つのカテゴリに分類できます。
- 文字列: 通常の文字列
- int: 整数型。自動インクリメントおよび自動デクリメント操作を実行できます。
- float: 浮動小数点型、自動インクリメントおよび自動デクリメント演算を実行できます。
どちらの形式であっても最下層はバイト配列の形式で格納されますが、エンコード方法が異なります。文字列タイプの最大スペースは 512m を超えることはできません。
例証します:
String型の場合、Redisの最下位層は3つのタイプに分けて保存できます。文字列はバイトに変換して保存し、数値と浮動小数点数はバイナリに変換して保存します。
2.2.3.2 共通コマンド
1.新規
- SET: 既存の文字列型のキーと値のペアを追加または変更します
- GET: キーを元にString型の値を取得します。
- MSET (複数セット): 複数の String 型のキーと値のペアをバッチで追加します
- MGET(複数取得):複数のキーを元に複数のString型の値を取得します
例証します:
- 上記のコマンドは正常に設定されました
2. 自己成長
- INCR (増加): 整数キーを 1 ずつ増加させます
- INCRBY (増加): 整数キーを自動的に増加させ、ステップ サイズを指定します。例: incrby num 2 は、num 値を 2 増加させます。
- INCRBYFLOAT(float単位で増加):浮動小数点型の数値を勝手に増加させ、ステップサイズを指定します
例証します:
- 自動インクリメントを使用する場合、数値は必要に応じて増加します
3.コマンドの組み合わせ
- SETNX (存在しない場合は設定): キーが存在しない場合は、文字列型のキーと値のペアを追加します。存在しない場合は実行されません。
- SETEX (期限切れの場合に設定): String 型のキーと値のペアを追加し、有効期間を指定します
例証します:
- キーが Redis にすでに存在する場合、設定は失敗します。
2.2.3.3キー構造
Redis キーを使用すると、複数の単語で階層構造を形成できます。複数の単語は「:」で区切られます。形式は次のとおりです。
项目名:业务名:类型:id
例証します:
この形式は固定されておらず、必要に応じてエントリを削除または追加できます。
たとえば、プロジェクト名は heima で、データにはユーザーとプロダクトの 2 つの異なるタイプがあり、次のようにキーを定義できます。
user相关的key:heima:user:1 product相关的key:heima:product:1
Value が User オブジェクトなどの Java オブジェクトの場合、オブジェクトは JSON 文字列にシリアル化して保存できます。
鍵 | 価値 |
---|---|
ホーム:ユーザー:1 | ' {“id”:1, “名前”: “ジャック”, “年齢”: 21} ' |
ホーム:製品:1 | '{"id":1、"名前": "Xiaomi 11"、"価格": 4999}' |
例証します:
- Redis
:
グループ化メソッドを使用した後、視覚化ツールを表示してグループを作成できるようになります。
2.2.4ハッシュ型
2.2.4.1 概要
ハッシュ タイプ。ハッシュとも呼ばれます。その値は、Java の HashMap 構造に似た、順序付けされていない辞書です。String 構造は、オブジェクトを JSON 文字列にシリアル化して保存するものですが、オブジェクトの特定のフィールドを変更する必要がある場合に非常に不便です。
ハッシュ構造はオブジェクト内の各フィールドを個別に保存でき、単一フィールドに対して CRUD を実行できます。
2.2.4.2 共通コマンド
1.新規
- HSETキーのフィールド値:ハッシュ型キーのフィールド値を追加または変更します
- HGETキーフィールド:ハッシュ型キーフィールドの値を取得します
- HMSET(ハッシュマルチセット):複数のハッシュ型キーのフィールド値を一括追加
例証します:
HMSET
効果がHSET
似ているため削除されます
2. 自己成長
- HINCRBY (ハッシュ増加): ハッシュ型キーのフィールド値を自動的に増加させ、ステップサイズを指定します
例証します:
- ここで年齢値と成長を確認できます
3.コマンドの組み合わせ
- HSETNX (存在しない場合はハッシュを設定): フィールドが存在しない場合はハッシュ タイプ キーのフィールド値を追加します。存在しない場合は実行されません。
例証します:
- ここのキー値を持つキーに
ljtxy:product"1
は既に age というフィールドが存在するため、設定は失敗します。
4.クエリ
- HMGET(ハッシュ複数取得):複数のハッシュ型キーのフィールド値を一括取得
- HGETALL: ハッシュ型キー内のすべてのフィールドと値を取得します
- HKEYS: ハッシュ型キーのすべてのフィールドを取得します
- HVALS: ハッシュ型キーのすべての値を取得
2.2.5リスト型
2.2.5.1 概要
Redis の List 型は Java の LinkedList に似ており、二重にリンクされたリスト構造とみなすことができます。前方検索と逆方向検索の両方をサポートします。
特性も LinkedList に似ています。
- 秩序ある
- 要素は繰り返すことができます
- 高速な挿入と削除
- クエリ速度は平均的
一般的に、リスト、コメント リストなどの友人のサークルなど、順序付けされたデータを保存するために使用されます。
2.2.5.2 共通コマンド
1.新規
- LPUSH キー要素…: リストの左側に 1 つ以上の要素を挿入します。
- RPUSH キー要素…: リストの右側に 1 つ以上の要素を挿入します。
説明: 結果
2.削除
-
LPOP キー: リストの左側の最初の要素を削除して返します。要素がない場合は nil を返します。
-
RPOP キー: リストの右側の最初の要素を削除して返します。
-
BLPOP と BRPOP: LPOP と RPOP に似ていますが、要素がないときに nil を直接返すのではなく、指定された時間待機します。
例証します:
- 指定された遅延時間を待つのと同様に、タイムアウトした場合は nil を返します。
3. クエリ
- LRANGE key star end: キースターの範囲内のすべての要素を返します。
説明: 結果
2.2.6 セットタイプ
2.2.6.1 概要
Redis の Set 構造は Java の HashSet に似ており、null 値を持つ HashMap とみなすことができます。これはハッシュ テーブルでもあるため、HashSetと同様の特性があります。
- 障害
- 要素を繰り返すことはできません
- 早く見つけてください
- 交差、和集合、差分などの関数をサポート
2.2.6.2 共通コマンド
1.新規
- SADD (セット追加) キー メンバー...: セットに 1 つ以上の要素を追加します。
2.削除
- SREM (セット削除メンバー) キー メンバー…: セット内の指定された要素を削除します。
3. クロスとディファレンス
- SINTER (交差の設定) key1 key2 ...: key1 と key2 の交差を検索します。
- SUNION (結合セット) key1 key2...: key1 と key2 の結合を検索します。
- SDIFF (異なる値を設定) key1 key2 ...: key1 と key2 の間の差分セットを検索します。
例証します:
4.クエリ
- SCARD (セットカーディナリティ) キー: セット内の要素の数を返します。
- SISMEMBER (セットはメンバー) キーメンバー: 要素がセット内に存在するかどうかを判断します。
- SMEMBERS (セットメンバー): セット内のすべての要素を取得します
2.2.7SortedSet型
2.2.7.1 概要
Redis の SortedSet は並べ替え可能なセット コレクションであり、Java の TreeSet に似ていますが、基礎となるデータ構造は大きく異なります。SortedSet の各要素にはスコア属性があり、要素はスコア属性に基づいて並べ替えることができます。基盤となる実装はスキップ リスト (SkipList) とハッシュ テーブルです。
SortedSet には次のプロパティがあります。
- ソート可能
- 要素は繰り返されません
- クエリ速度が速い
SortedSet は並べ替え可能な性質があるため、ランキングなどの機能の実装によく使用されます。
2.2.7.2 共通コマンド
1.新規
- ZADD キー スコア メンバー [スコア メンバー]: ソートされたセットに 1 つ以上の要素を追加し、スコア値が既に存在する場合は更新します。
例証します:
- 新しい価値
2.削除
- ZREM キー メンバー: ソートされたセット内の指定された要素を削除します
例証します:
- 値の削除
3. クロスとディファレンス
- ZDIFF、ZINTER、ZUNION: 相違点、共通部分、和集合の検索
3. クエリ
- ZSCORE キー メンバー: ソートされたセット内の指定された要素のスコア値を取得します。
- ZRANK キー メンバー: ソートされたセット内の指定された要素のランクを取得します。
- ZCARD キー: ソートされたセット内の要素の数を取得します。
- ZCOUNT key min max: スコア値が指定された範囲内にあるすべての要素の数をカウントします。
- ZINCRBY キー増分メンバー: ソートされたセット内の指定された要素を、指定された増分値だけ増加させます。
- ZRANGE key min max: スコアでソート後、指定したランキング範囲内の要素を取得
例証します:
- range は対応する要素を返すことを意味します
- ZRANGEBYSCORE key min max: スコアで並べ替えた後、指定されたスコア範囲内の要素を取得します
説明する。
- rangbyscore は、指定された範囲内でソートされた要素を取得します
2.2.7.3 アプリケーションシナリオ
2.2.8BitMapの種類
2.2.8.1 概要
基になるデータ構造として String 型を使用して実装された統計バイナリ状態データ型。ビットマップは本質的には配列であり、文字列データ型に基づくビット単位の演算です。配列は複数のバイナリ ビットで構成され、それぞれがオフセット (インデックスと呼びます) に対応します。ビットマップでサポートされる最大ビット数は 2 32 ビットで、ストレージ スペースを大幅に節約でき、512M メモリを使用して最大 42 億 9000 万バイトの情報を保存できます (2 32= 4294967296)。
2.2.8.2 共通コマンド
1.新規
- setbit key offset value: 指定された位置の値に要素を追加します
例証します:
- 新しい価値
2. クエリ
指定された要素の値を取得します
- getbit key offset: 指定された要素の指定された位置の値を取得します
例証します:
- クエリ値
指定された要素のストレージバイトを取得します
- strlen キー: 指定された要素のストレージバイトを取得します。
例証します:
- 占有スペースのクエリ
- bitcount キー: 指定された要素内の 1 の数を取得します。
例証します:
- 1 の数を問い合わせる
指定された複数の要素のビット ストレージを取得します。
- BITOP 操作 destkey key [key ...]: 複数ビットの要素を取得します
例証します:
補充:
BITOP AND destkey srckey1 srckey2 srckey3 ... srckeyN
、1 つ以上のキーに対して論理結合を実行し、結果を destkey に保存します。BITOP OR destkey srckey1 srckey2 srckey3 ... srckeyN
、1 つ以上のキーに対して論理 OR を実行し、結果を destkey に保存します。BITOP XOR destkey srckey1 srckey2 srckey3 ... srckeyN
、1 つ以上のキーに対して論理 XOR を実行し、結果を destkey に保存します。BITOP NOT destkey srckey
、指定されたキーに対して論理否定を実行し、結果を destkey に保存します。
2.2.8.3 アプリケーションシナリオ
ユーザーのチェックイン数をカウントする
2.2.9HyperLogログタイプ
2.2.9.1 概要
Redis HyperLogLog はカーディナリティ統計に使用されるアルゴリズムです。HyperLogLog の利点は、入力要素の数または量が非常に大きい場合でも、カーディナリティの計算に必要なスペースが常に固定され、非常に小さいことです。
Redis では、ほぼ 2^64 の異なる要素のカーディナリティを計算するために、各 HyperLogLog キーに必要なメモリは 12 KB のみです。これは、要素が増えるとカーディナリティを計算するときにより多くのメモリを消費するコレクションとはまったく対照的です。
2.2.9.2 共通コマンド
1.新規
- PFADD (確率的固定加算) キー要素 [要素...]: 指定された要素を HyperLogLog に追加します。
例証します:
- 新しい要素
2.修正
- PFMERGE (確率的固定マージャー) destkey sourcekey [sourcekey...]: 複数の HyperLogLog を 1 つの HyperLogLog にマージします。
例証します:
- マージベース
3. クエリ
- PFCOUNT key [key …]: 指定された HyperLogLog のカーディナリティ推定値を返します。
例証します:
- 重複排除後の基本番号を取得する
2.2.9.3 アプリケーションシナリオ
商用WebサイトのUA(ユーザー訪問数)をカウントする
2.2.10ストリームタイプ
2.2.10.1 概要
Stream は Redis 5.0 で導入された新しいデータ型で、非常に完全なメッセージ キューを実装できます。
2.2.10.2 共通コマンド
1.新規
- XADD キー ID フィールド値 [フィールド値 ...]: XADD を使用してメッセージをキューに追加します。指定されたキューが存在しない場合は、キューを作成します。
例証します:
- 結果を見る
- XGROUP [CREATE key groupname id-or-$]:コンシューマ グループを作成します
例証します:
- キー s1 を使用してコンシューマ グループ g1 を作成し、データを保持します
- XGROUP [CREATECONSUMER key groupname Consumername]:コンシューマ グループで指定されたコンシューマを追加します
例証します:
- キーとコンシューマ グループを指定し、そこにコンシューマを追加します
- XPENDING キー グループ [[IDLE min-idle-time] start end count [consumer]]:保留中のメッセージに関する情報を表示します
例証します:
- 確認されたメッセージをすべて返す
2.削除
- XGROUP [DESTROY キー グループ名]: XGROUP DESTROY を使用してコンシューマ グループを削除します
例証します:
- キーとコンシューマ グループ名の指定
- XGROUP [DELCONSUMER キー グループ名 コンシューマ名]:コンシューマ グループ内の指定されたコンシューマを削除します
例証します:
- テストされる
3.アップデート
- XACK キー グループ ID [ID ...]: メッセージを「処理済み」としてマークします
例証します:
- 処理するキューのキーとグループ名とIDを指定します
4.クエリ
- XREAD [COUNT カウント] [BLOCK ミリ秒] STREAMS key [key ...] id [id ...]: XREAD を使用して、ブロッキングまたは非ブロッキング方法でメッセージのリストを取得します
例証します:
- クエリ要素
- 最新ニュースの閲覧をブロックする
- XREADGROUP GROUP グループ コンシューマ [COUNT カウント] [BLOCK ミリ秒] [NOACK] STREAMS キー [キー ...] ID [ID ...]:コンシューマ グループ内のメッセージを読み取ります
例証します:
2.2.11GEOタイプ
2.2.11.1 概要
GEO は Geolocation の略で、地理的座標を表します。Redis はバージョン 3.2 で GEO のサポートを追加し、地理座標情報を保存し、経度と緯度に基づいてデータを取得できるようにしました。
2.2.11.2 共通コマンド
1.新規
- GEOADD キー [NX | XX] [CH] 経度緯度メンバー:経度 (経度)、緯度 (緯度)、値 (メンバー) を含む地理空間情報を追加します。
例証します:
- パラメータの説明:
GEOADD 键 精度 维度 值
- GEOPOS キー [メンバー [メンバー …]]: 指定されたメンバーの座標を返します
例証します:
- パラメータの説明:
GEOPOS 键 成员
2.修正
- GEODIST key member1 member2 [M | KM | FT | MI]:指定された2 点間の距離を計算して返します。
例証します:
- パラメータの説明:
GEODIST 键 值1 值2
- GEOSEARCH キー <FROMMEMBER メンバー | FROMLONLAT 経度緯度> <BYRADIUS 半径 <M | KM | FT | MI> | BYBOX 幅 高さ <M | KM | FT | MI>> [ASC | DESC] [COUNT カウント [ANY]] [WITHCOORD ] [WITHDIST] [WITHHASH]: 指定された範囲内のメンバーを検索し、指定された点からの距離で並べ替えて返します。範囲は円形または長方形にすることができます。6.2.新機能
例証します:
- パラメータの説明:
GEODIST 键 指定经纬度 画圆 举例 返回距离
- GEOHASH key [member [member …]]: 指定されたメンバーの座標をハッシュ文字列形式に変換して返します
例証します:
- パラメータの説明:
GEOHASH 键 成员
3. Redis Java クライアント
メモの要約:
- 概要: Redis 公式 Web サイトはさまざまな言語でクライアントを提供します。アドレス: https://redis.io/clients
- Jedis の基本的な使用法: Jedis 自体はスレッドセーフではないため、接続の作成と破棄が頻繁に行われるとパフォーマンスの低下が発生します。
- Jedis 接続プール: 現時点では、Jedis 直接接続方式の代わりに Jedis 接続プールが使用され、頻繁な接続の作成と破棄が削減されます。
- SpringDataRedis の使用法: SpringData は、さまざまなデータベースの統合を含む、Spring のデータ操作用のモジュールです。
- RedisSerializr シリアル化: カスタム シリアル化メソッドにより、Redis ストレージ リソースのメモリがさらに節約されます。
- StringRedisTemplate の使用法: メモリ領域を節約するため、値の処理に JSON シリアライザーを使用せず、代わりに String 型のキーと値のみを格納できる必要がある String シリアライザーを一律に使用します。Java オブジェクトを保存する必要がある場合、オブジェクトのシリアル化と逆シリアル化は手動で行われます。
3.1 概要
さまざまな言語のクライアントが Redis 公式 Web サイトで提供されています。アドレス: https://redis.io/clients
例証します:
Java クライアントには優れたクライアントの使用法が多数あるので、Jedis と Lettcuce を学ぶことをお勧めします。
Spring は、Spring Data Redis と呼ばれる Java クライアント上で Jedis と Lettuce の操作を統合します。この時点で Spring Data Redis について学習します。
3.2 基本的な使用例 - Jedis の使用法
3.2.1 概要
Jedis の公式 Web サイトアドレス: https://github.com/redis/jedis
3.2.2 基本的な使用例
ステップ 1: 依存関係をインポートする
<!--jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.4.1</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
ステップ 2: デモ
public class JedisTest {
public Jedis jedis;
@Before
public void setUp() {
// 1.建立连接
jedis = new Jedis("10.13.164.55", 6379);
// 2.设置密码
jedis.auth("qweasdzxc");
// 3.选择库
jedis.select(0);
}
@Test
public void testSet() {
String set = jedis.set("yueyue2", "玥玥");
System.out.println(set);
String s = jedis.get("yueyue2");
System.out.println(s);
}
@After
public void setDown() {
if (Objects.isNull(jedis)) {
jedis.close();
}
}
}
例証します:
Jedis オブジェクトを作成し、メソッドをテストし、リソースを閉じる
3.2.3Jedis 接続プール
3.2.3.1 概要
Jedis 自体はスレッドセーフではなく、接続の頻繁な作成と破棄はパフォーマンスの低下を引き起こすため、Jedis 直接接続ではなく Jedis 接続プールを使用することをお勧めします。
3.2.3.2 基本的な使用例
ステップ 1: ファクトリーを作成する
/**
* 获取Jedis连接池工厂
*/
public class JedisConnectionFactory {
private static final JedisPool jedisPool;
static {
// 配置连接池
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 最大连接
jedisPoolConfig.setMaxTotal(8);
// 最大空闲连接,当有连接时,最多准备8个连接点
jedisPoolConfig.setMaxIdle(8);
// 最小空闲连接,当没有连接时,会释放所有连接点
jedisPoolConfig.setMinIdle(0);
// 设置最长等待时间,ms
jedisPoolConfig.setMaxWait(Duration.ofMillis(200));
// 创建连接此对象
jedisPool = new JedisPool(jedisPoolConfig, "10.13.164.55", 6379, 2000, "qweasdzxc");
}
// 获取Jedis对象
public static Jedis getJedis() {
return jedisPool.getResource();
}
}
ステップ 2: デモ
public class JedisTest {
public Jedis jedis;
@Before
public void setUp() {
// 1.建立连接
// jedis = new Jedis("10.13.164.55", 6379);
// 2.设置密码
// jedis.auth("qweasdzxc");
jedis = JedisConnectionFactory.getJedis();
// 3.选择库
jedis.select(0);
}
@Test
public void testSet() {
String set = jedis.set("yueyue2", "玥玥");
System.out.println(set);
String s = jedis.get("yueyue2");
System.out.println(s);
}
@After
public void setDown() {
if (Objects.isNull(jedis)) {
jedis.close();
}
}
}
3.3 基本的な使用例 - SpringDataRedis の使用法
3.3.1 概要
SpringData は、Spring の各種データベースの統合を含むデータ操作モジュールです Redis の統合モジュールは SpringDataRedis と呼ばれます 公式 Web サイトのアドレス: https://spring.io/projects/spring-data-redis
- さまざまな Redis クライアント (Lettuce と Jedis) の統合を提供します
- Redisを操作するためのRedisTemplate統合APIを提供
- Redis パブリッシュ/サブスクライブ モデルのサポート
- Redis Sentinel と Redis Cluster をサポート
- レタスに基づいたリアクティブプログラミングをサポート
- JDK、JSON、文字列、Spring オブジェクトに基づくデータのシリアル化と逆シリアル化をサポート
- Redis に基づく JDKCollection 実装をサポート
3.3.2 基本的な使用例
説明: 共通コマンド操作
API 戻り値の型 説明する redisTemplate .opsForValue() 値の操作 String型データを操作する redisTemplate .opsForHash() ハッシュ操作 ハッシュ型データの操作 redisTemplate .opsForList() リスト操作 リスト型データの操作 redisTemplate .opsForSet() セットオペレーション 演算セット型データ redisTemplate .opsForZSet() ZSetOperations SortedSet 型のデータを操作する redisテンプレート 一般的なコマンド
ステップ 1: 依存関係をインポートする
<dependencies>
<!--SpringDataRedis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
例証します:
この実験は SpringBoot で動作するため、SpringBoot の依存関係をインポートします
ステップ 2: 構成を追加する
spring:
redis:
host: 10.13.164.55
port: 6379
password: qweasdzxc
lettuce: # redis默认使用lettuce客户端进行连接
pool:
max-active: 8 # 最大连接
min-idle: 0 # 最小空闲
max-idle: 8 # 最大空闲
max-wait: 200 # 连接等待时间
例証します:
SpringBoot の自動アセンブリを容易にするために Redis 構成ファイルを構成する
ステップ 3: デモ
@SpringBootTest
class SpringDataRedisDemoApplicationTests {
@Autowired
RedisTemplate redisTemplate;
@Test
void contextLoads() {
redisTemplate.opsForValue().set("yueyue", "玥玥大美女");
Object o = redisTemplate.opsForValue().get("yueyue");
System.out.println(o.toString());
}
}
例証します:
@Autowired
依存性注入を実装するにはアノテーションを使用する必要がある
知らせ:
RedisTemplate は、任意のオブジェクトを値として受け取り、Redis に書き込むことができますが、書き込む前にオブジェクトをバイト形式にシリアル化します。デフォルトでは、JDK シリアル化が使用されます。結果は次のとおりです。
これにより、可読性が低下し、より多くのメモリを消費します。
ソース コードを見ると、基礎となる層が ObjectOutputStream オブジェクトを使用して Java オブジェクトをバイトに変換していることがわかりました。
3.3.3RedisSerializr のシリアル化
3.3.3.1 概要
SpringDataRedis のシリアル化メソッドはデフォルトの JDK シリアル化を使用するため、データを保存したり、表示されるものを取得したりする方法を実現できないため、ここではカスタム シリアル化を使用します。
例証します:
カスタム シリアル化を実装するにはさまざまな方法がありますが、SpringDataRedis のシリアル化メソッドは
JdkSerializationRedisSerializer
デフォルトでシリアル化を使用します。ここでは 2 つのシリアル化メソッドを使用することをお勧めします。1 つは string を string に変換するシリアル化メソッドでStringRedisSerializer
、もう 1 つは Json と string を相互に変換するメソッドです。GenericJackson2JsonRedisSerializer
3.3.3.2 基本的な使用例
ステップ 1: カスタムシリアル化
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
// 创建Template
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
// 设置连接工厂
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 设置序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer =
new GenericJackson2JsonRedisSerializer();
// key和 hashKey采用 string序列化
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setHashKeySerializer(RedisSerializer.string());
// value和 hashValue采用 JSON序列化
redisTemplate.setValueSerializer(jsonRedisSerializer);
redisTemplate.setHashValueSerializer(jsonRedisSerializer);
return redisTemplate;
}
例証します:
- この時点で、RedisTemplate の依存関係の注入を完了し、独自のロジックを書き直します。
- 接続ファクトリー、SpringBoot フレームワークが自動的に注入を完了するため、ここでは接続ファクトリーが直接使用されます。
ステップ 2: デモ
@SpringBootTest
class SpringDataRedisDemoApplicationTests {
@Autowired
RedisTemplate<String, Object> redisTemplate;
@Test
void testString() {
redisTemplate.opsForValue().set("yueyue", "玥玥,大美女");
Object o = redisTemplate.opsForValue().get("yueyue");
System.out.println(o.toString());
}
@Test
void testObject() {
redisTemplate.opsForValue().set("yueyue", new User("玥玥", 17, "大美女"));
Object o = redisTemplate.opsForValue().get("yueyue");
System.out.println(o.toString());
}
}
例証します:
- testString メソッドの結果は次のとおりです
- testObject メソッドの結果は次のとおりです。
知らせ:
オブジェクト値が保存されるたびに、SpringDataRedis は自動シリアル化と逆シリアル化を実現するためにフルパス クラス名の長い文字列を追加するため、多くのメモリ領域が占有されます。
3.3.4StringRedisTemplateの使用法
3.3.4.1 概要
メモリ領域を節約するために、値の処理には JSON シリアライザーを使用せず、String 型のキーと値のみを格納できる必要がある String シリアライザーを一律に使用します。Java オブジェクトを保存する必要がある場合、オブジェクトのシリアル化と逆シリアル化は手動で行われます。
例証します:
オブジェクトのシリアル化と逆シリアル化を手動で完了するのは面倒ですが、メモリ領域を節約できます
3.3.4.2 基本的な使用例
ステップ 1: 依存関係をインポートする
<!--SpringDataRedis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.33</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
ステップ 2: デモ
@SpringBootTest
class SpringDataRedisDemoApplicationTests2 {
@Autowired
StringRedisTemplate stringRedisTemplate;
@Test
void testString() {
stringRedisTemplate.opsForValue().set("yueyue", "玥玥,大美女");
Object o = stringRedisTemplate.opsForValue().get("yueyue");
System.out.println(o.toString());
}
@Test
void testObject() {
User user = new User("玥玥", 17, "大美女");
String jsonString = JSON.toJSONString(user); // 此处使用fastJson工具进行对象的序列化与反序列化
stringRedisTemplate.opsForValue().set("yueyue", jsonString);
String result = stringRedisTemplate.opsForValue().get("yueyue");
User resultUser = JSON.parseObject(result, User.class);
System.out.println(resultUser);
}
}
例証します:
testString メソッドの結果は次のとおりです
testObject メソッドの結果は次のとおりです。