キャッシュ削除戦略
タイトル LRU 原則
LRU (最も最近使用されていない、最も最近使用されていない) アルゴリズムは、履歴アクセスに基づいています。データの記録 データを排除するための中心的な考え方は、「データに最近アクセスされた場合、将来アクセスされる可能性も高い」ということです。
最も一般的な実装は、リンクされたリストを使用してキャッシュされたデータを保存することです。詳細なアルゴリズムは次のように実装されます:
- ## 新しいデータがリンク リストの先頭に挿入されます;
- キャッシュがヒットする (つまり、キャッシュされたデータがアクセスされる) たびに、データはリンク リストの先頭;
- リンク リストがいっぱいの場合、リンク リストの末尾のデータを破棄します。
Java では、LinkHashMap を使用して、ハッシュ リンク リストの実装を使用して LRU を実装できます。
Redis では、ユーザーは最大メモリ サイズ maxmemory を設定できます。デフォルトは 0 です。最大キャッシュは指定されていません。新しいデータが追加されると、最大メモリを超えると Redis がクラッシュするため、設定する必要があります。redis メモリ データ セットのサイズが特定のサイズに増加すると、データ削除戦略が実装されます。 排除戦略
redis 排除戦略の構成: maxmemory-policy voltile-lru、ホット構成をサポート
redis は 6 種類のデータを提供します削除戦略:
volatile-lru: 有効期限が設定されている、最も最近使用されていないデータ セット (server.db[i].expires) を選択します。データ削除
volatile-ttl:有効期限を設定したデータセット(server.db[i].expires)から期限切れとなるデータを選択します.
volatile-random: 有効期限が設定されているデータセット (server.db[i].expires) から削除するデータをランダムに選択します
allkeys-lru: データ セット (server.db[i].dict) から最も最近使用されていないデータを選択して、
を削除します-
allkeys-random: データ セット (server.db[i].dict) からデータをランダムに選択して、
no-enviction を排除します。 (エビクション): データのエビクションを禁止します
- Redis トランザクションは終了しますMULTI、EXEC、DISCARD、WATCH、UNWATCH の 5 つのコマンドを完了します。
- Redis の個々のコマンドはアトミックであるため、トランザクション オブジェクトがコマンド セットであることを確認する必要があります。
- Redis はコマンド セットをシリアル化し、同じトランザクション内でコマンド セットが継続的かつ中断なく実行されるようにします
- Redis は return Roll をサポートしていません手術。トランザクション コマンド
構文:
multiEXECトランザクション内で以前にキューに入れられたすべてのコマンドを実行し、通常の接続状態を復元します
構文:
execDISCARDトランザクション内で以前にキューに入れられたすべてのコマンドをクリアし、通常の接続状態を復元します。
構文:
discardWATCH[トランザクションを条件付きで実行する必要がある]場合、このコマンドを使用して、指定された [ キーが設定されているを変更します[監視対象へ] ステータス。
構文:
watch key [key…]
注: このコマンドを使用して、Redis の楽観的ロックを実装します。
UNWATCHトランザクションに対して以前に監視されていたすべてのキーをクリアします構文:
unwatch
コマンドの図:
トランザクションのデモ:
127.0.0.1:6379> multi OK 127.0.0.1:6379> set s1 111 QUEUED 127.0.0.1:6379> hset set1 name zhangsan QUEUED 127.0.0.1:6379> exec 1) OK 2) (integer) 1 127.0.0.1:6379> multi OK 127.0.0.1:6379> set s2 222 QUEUED 127.0.0.1:6379> hset set2 age 20 QUEUED 127.0.0.1:6379> discard OK 127.0.0.1:6379> exec (error) ERR EXEC without MULTI 127.0.0.1:6379> watch s1 OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> set s1 555 QUEUED 127.0.0.1:6379> exec # 此时在没有exec之前,通过另一个命令窗口对监控的s1字段进行修改 (nil) 127.0.0.1:6379> get s1 111Redis はトランザクションのロールバックをサポートしていません (理由)大多数のトランザクション失敗の原因は構文エラーまたは型エラーです。これらのエラーはどちらも開発段階で予見可能です。Redis はパフォーマンス上の理由からトランザクションのロールバックを無視します。 Redis Optimistic LockOptimistic Lock は CAS (Compare And Swap) のアイデア (比較と置換) に基づいており、相互排他的ではなく、ロック待機を引き起こしたりリソースを消費したりすることはありませんが、再試行を繰り返す必要がありますが、再試行メカニズムにより、より高速に応答できます。したがって、redis を使用して
オプティミスティック ロックを実装できます。具体的なアイデアは次のとおりです。
- redis の watch 関数を使用して、この redisKey のステータス値を監視します。
- Get the redisKey の値
- redis トランザクションの作成
- このキーの値を 1
にします
然后去执行这个事务,如果key的值被修改过则回滚,key不加1
public void watch() { try { String watchKeys = "watchKeys"; //初始值 value=1 jedis.set(watchKeys, 1); //监听key为watchKeys的值 jedis.watch(watchkeys); //开启事务 Transaction tx = jedis.multi(); //watchKeys自增加一 tx.incr(watchKeys); //执行事务,如果其他线程对watchKeys中的value进行修改,则该事务将不会执行 //通过redis事务以及watch命令实现乐观锁 List<Object> exec = tx.exec(); if (exec == null) { System.out.println("事务未执行"); } else { System.out.println("事务成功执行,watchKeys的value成功修改"); } } catch (Exception e) { e.printStackTrace(); } finally { jedis.close(); } }
Redis乐观锁实现秒杀
public class RedisLock { public static void main(String[] arg) { //库存key String redisKey = "stock"; ExecutorService executorService = Executors.newFixedThreadPool(20); try { Jedis jedis = new RedisProperties.Jedis("127.0.0.1", 6378); // 可以被秒杀的库存的初始值,库存总共20个 jedis.set(redisKey, "0"); jedis.close(); } catch (Exception e) { e.printStackTrace(); } for (int i = 0; i < 1000; i++) { executorService.execute(() -> { Jedis jedis1 = new Jedis("127.0.0.1", 6378); try { jedis1.watch(redisKey); String redisValue = jedis1.get(redisKey); int valInteger = Integer.valueOf(redisValue); String userInfo = UUID.randomUUID().toString(); // 没有秒完 if (valInteger < 20) { Transaction tx = jedis1.multi(); tx.incr(redisKey); List list = tx.exec(); // 秒成功 失败返回空list而不是空 if (list != null && list.size() > 0) { System.out.println("用户:" + userInfo + ",秒杀成 功!当前成功人数:" + (valInteger + 1)); } // 版本变化,被别人抢了。 else { System.out.println("用户:" + userInfo + ",秒杀失 败"); } } // 秒完了 else { System.out.println("已经有20人秒杀成功,秒杀结束"); } } catch (Exception e) { e.printStackTrace(); } finally { jedis1.close(); } }); } executorService.shutdown(); } }
以上がRedis キャッシュ削除戦略とトランザクションを使用して楽観的ロックを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

Redisは、主にデータベース、キャッシュ、メッセージブローカーとして使用されるメモリデータ構造ストレージシステムです。そのコア機能には、シングルスレッドモデル、I/O多重化、持続メカニズム、複製、クラスタリング機能が含まれます。 Redisは、キャッシュ、セッションストレージ、メッセージキューのための実際のアプリケーションで一般的に使用されます。適切なデータ構造を選択し、パイプラインとトランザクションを使用し、監視とチューニングを使用することにより、パフォーマンスを大幅に改善できます。

RedisデータベースとSQLデータベースの主な違いは、Redisが高性能および柔軟性要件に適したインメモリデータベースであることです。 SQLデータベースは、複雑なクエリとデータの一貫性要件に適したリレーショナルデータベースです。具体的には、1)Redisは高速データアクセスとキャッシュサービスを提供し、キャッシュおよびリアルタイムのデータ処理に適した複数のデータ型をサポートします。 2)SQLデータベースは、テーブル構造を介してデータを管理し、複雑なクエリとトランザクション処理をサポートし、データの一貫性を必要とするeコマースや金融システムなどのシナリオに適しています。

redisactsassassadatastoreandaservice.1)asadatastore、itusesin memorystorage for fastorations、supporting variousdatastructureSlike-key-valuepairsandsortedsets.2)asaservice、iteasruascruascriptingrupting criptingforceptingpurplecomplecomplecprexoperations

他のデータベースと比較して、Redisには次の独自の利点があります。1)非常に速い速度、および読み取り操作は通常、マイクロ秒レベルにあります。 2)豊富なデータ構造と操作をサポートします。 3)キャッシュ、カウンター、公開サブスクリプションなどの柔軟な使用シナリオ。 Redisまたはその他のデータベースを選択する場合、特定のニーズとシナリオに依存します。 Redisは、高性能および低遅延のアプリケーションでうまく機能します。

Redisは、データストレージと管理において重要な役割を果たしており、複数のデータ構造と持続性メカニズムを通じて最新のアプリケーションの中核となっています。 1)Redisは、文字列、リスト、コレクション、注文されたコレクション、ハッシュテーブルなどのデータ構造をサポートし、キャッシュや複雑なビジネスロジックに適しています。 2)RDBとAOFの2つの持続方法を通じて、Redisは信頼できるストレージとデータの迅速な回復を保証します。

Redisは、大規模なデータの効率的なストレージとアクセスに適したNOSQLデータベースです。 1.Redisは、複数のデータ構造をサポートするオープンソースメモリデータ構造ストレージシステムです。 2.キャッシュ、セッション管理などに適した、非常に速い読み取り速度と書き込み速度を提供します。 4.使用例には、基本的なキー値ペア操作と高度なコレクション重複排除関数が含まれます。 5.一般的なエラーには、接続の問題、データ型の不一致、メモリオーバーフローが含まれるため、デバッグに注意する必要があります。 6.パフォーマンス最適化の提案には、適切なデータ構造の選択とメモリ排除戦略の設定が含まれます。

現実世界でのRedisのアプリケーションには、1。キャッシュシステムとして、データベースクエリを加速し、2。Webアプリケーションのセッションデータを保存するには、3。リアルタイムランキングを実装する4。メッセージ配信をメッセージキューとして簡素化する。 Redisの汎用性と高性能により、これらのシナリオで輝きます。

Redisは、高速、汎用性、豊富なデータ構造のために際立っています。 1)Redisは、文字列、リスト、コレクション、ハッシュなどのデータ構造をサポートし、コレクションを注文します。 2)メモリを介してデータを保存し、RDBとAOFの持続性をサポートします。 3)Redis 6.0から始めて、マルチスレッドI/O操作が導入されました。これにより、高い並行性シナリオでパフォーマンスが向上しました。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

ホットトピック









