DAY 66 データベース キャッシュ サービス - Redis の構成と NoSQL の最適化

キャッシュの概念

キャッシュとは、速度の異なる複数の物質の速度を調整し、途中で遅い方を加速させるもので、例えばCPUの1次キャッシュと2次キャッシュには、CPUが最近アクセスしたデータが保存されます。メモリは、CPU がハードディスクに頻繁にアクセスするデータを保存するために使用され、ハードディスクにはさまざまなサイズのキャッシュがあり、物理サーバーの RAID カードにもキャッシュがあり、すべて CPU の高速化を目的としています。ハードディスクデータへのアクセス、CPU の速度が速すぎるため、CPU が必要とするデータは、ハードディスクのせいで短時間で CPU のニーズを満たすことができないことがよくあるため、CPU キャッシュ、メモリ、RAID カード キャッシュ、およびハードディスク キャッシュは、CPU のデータ要件をある程度満たすことができ、つまり、CPU がキャッシュからデータを読み取ることができ、CPU 効率が大幅に向上します。

システムキャッシュ

バッファとキャッシュ:

  • バッファ:バッファは書き込みバッファとも呼ばれます。通常、書き込み操作に使用されます。データは最初にメモリに書き込まれ、次にディスクに書き込まれます。バッファは通常、異なるメディアの速度のばらつきによるバッファリングを解決するための書き込みバッファに使用されます。データは最も近い場所では、書き込み速度を上げるために、CPU はまずメモリのディスク バッファにデータを書き込み、次にデータが書き込まれたと判断し、その後カーネルがディスクに書き込みます。そのため、サーバーの突然の停電により、メモリ内のデータの一部が失われます。

  • キャッシュ:キャッシュはリード キャッシュとも呼ばれます。一般に読み取り操作に使用されます。CPU はメモリからファイルを読み取ります。メモリがない場合は、ハードディスクからメモリに読み取り、次に CPU に読み取ります。頻繁に読み取る必要があるデータをキャッシュに置きます。最も近いキャッシュ領域にあるので、次回読むときにすぐに読むことができます

キャッシュの保存場所と階層

  • ユーザー層: ブラウザー DNS キャッシュ、アプリケーション DNS キャッシュ、オペレーティング システム DNS キャッシュ クライアント
  • プロキシ層: CDN、リバースプロキシキャッシュ
  • Web 層: Web サーバー キャッシュ
  • アプリケーション層: 静的ページ
  • データ層: データ分散キャッシュ、ライブラリ
  • システム層: オペレーティング システム キャッシュ
  • 物理層: ディスクキャッシュ、Raid キャッシュ

DNSキャッシュ

ブラウザの DNS キャッシュのデフォルトは 60 秒です。つまり、60 秒以内に同じドメイン名にアクセスした場合、DNS 解決は実行されません。

アプリケーション層キャッシュ

Nginx や PHP などの Web サービスは、アプリケーション キャッシュを設定してユーザー リクエストへの応答を高速化できます。また、PHP/Python/Java などの一部のインタープリタ言語は直接実行できず、最初にバイトコードにコンパイルする必要がありますが、バイトコードマシンコードは後でしか実行できないため、バイトコードは一種のキャッシュでもあり、プログラムコードの起動後にバイトコードが更新されない現象が発生することがあります。したがって、新しいバージョンを起動する前に、まずアプリケーション キャッシュをクリアしてから、新しいバージョンを起動する必要があります。

さらに、動的ページ静的技術を使用して、アクセスを高速化することができます。たとえば、データベース データの動的ページにアクセスするには、プログラムを使用して静的ページ ファイル html を事前に生成し、電子商取引 Web サイトの商品紹介、コメント情報、この技術を利用することで、非リアルタイムデータなどを実現できます。

 データ層キャッシュ

分散キャッシュサービス:

  • レディス
  • Memcached

データベース:

  • MySQLクエリキャッシュ
  • innodbキャッシュ、MYISAMキャッシュ

 ハードウェアキャッシュ

  • CPUキャッシュ(L1データキャッシュ、L1命令キャッシュ)、L2キャッシュ、L3キャッシュ
  • ディスクキャッシュ: ディスクキャッシュ
  • ディスク アレイ キャッシュ: バッテリを使用して停電によるデータ損失を防ぐことができる Raid キャッシュ

リレーショナル データベースと非リレーショナル データベース

リレーショナルデータベース

  • リレーショナル データベースは、リレーショナル モデル (2 次元テーブル モデル) に基づいて構築された構造化データベースであり、一般にレコードを指向しています。
  • SQL ステートメント (Standard Data Query Language) は、リレーショナル データベースに基づいた言語であり、リレーショナル データベース内のデータの検索と操作を実行するために使用されます。
  • 主流のリレーショナル データベースには、Oracle、MySQL、SQL Server、Microsoft Access、DB2、PostgreSQL などが含まれます。

上記のデータベースを使用する場合、まずデータベースを構築し、テーブルを構築し、テーブル構造を設計し、その後テーブル構造に従ってデータを格納する必要があり、データがテーブル構造と一致しない場合、格納は失敗します。

非リレーショナルデータベース

  • NoSQL (NoSQL=NotonlysQL) は「SQL だけではない」という意味で、非リレーショナル データベースの総称です。
  • 主流のリレーショナル データベース以外のデータベースは、非リレーショナルとみなされます。
  • データ ストレージ テーブル構造を定義するためにデータベースとテーブルを事前に構築する必要はなく、各レコードには異なるデータ型とフィールド数 (WeChat グループ チャットのテキスト、写真、ビデオ、音楽など) を含めることができます。
  • 主流の NOSQL データベースには、Redis、MongBD、Hbase (ビッグ データに使用される分散型非リレーショナル データベース)、Memcached、ElasticSearch (ES、インデックス付きデータベースと呼ばれる)、TSDB (時間連続データベース) などが含まれます。

リレーショナル データベースと非リレーショナル データベースの違い:

(1) データ保存方式の違い

リレーショナル データベースと非リレーショナル データベースの主な違いは、データの保存方法です。

  • リレーショナル データは本質的に表形式であるため、データ テーブルの行と列に格納されます。データテーブルは相互に関連付けて共同して保存でき、データの抽出も簡単です。
  • 対照的に、非リレーショナル データはテーブルの行や列に収まらず、大きな塊にグループ化されます。非リレーショナル データは通常、ドキュメント、キーと値のペア、グラフ構造などのデータセットに保存されます。データとその特性は、データの保存方法と抽出方法を選択する際に最も影響を与える要素です。(データセット内に複数のデータ型が存在するため、データ型を切り替えるのは簡単です)

(2) 拡張方法の違い

SQL データベースと NoSQL データベースの最大の違いは、拡張の方法にあると考えられますが、増大する需要に対応するには、当然のことながら拡張が必要です。

  • より多くの同時実行性をサポートするには、SQL データベースがスケールアップされます。つまり、処理能力が向上し、より高速なコンピューターが使用されるため、同じデータ セットをより速く処理できます。データはリレーショナル テーブルに格納されるため、多くのテーブルが関係する操作のパフォーマンスのボトルネックは、コンピューターのパフォーマンスを向上させることで克服する必要があります。SQIデータベースは発展の余地が大きいとはいえ、最終的には垂直方向の拡張の上限に達するのは間違いない。(データは通常、ローカル ファイル システムに保存されます。読み取りと書き込みは、読み取りと書き込みの分離と負荷分散によってパフォーマンスを共有できますが、読み取りと書き込みは依然として IO パフォーマンスを消費します)
  • 一方、NoSQL データベースは水平方向に拡張します非リレーショナル データ ストレージは自然に分散されるため、NoSQL データベースの拡張では、より一般的なデータベース サーバー (ノード) をリソース プールに追加することで負荷を分散できます。(データ分散は別のサーバーに保存され、効率を高めるために同時に読み取りと書き込みが可能です)

チップ:

  • 水平方向の拡張: サーバーを追加します。(安い)
  • 垂直方向の拡張: より高性能な CPU への変更、CPU コア、ハードディスク、ディスク IO、メモリー スティックの数の増加など、ハードウェア構成を改善します。(ハードディスクを除き、追加するには他のハードディスクをシャットダウンする必要があります)

(3) トランザクションに対するさまざまなサポート

  • データ操作で高いトランザクション性が必要な場合、または複雑なデータ クエリで実行計画を制御する必要がある場合は、パフォーマンスと安定性の点で従来の SQL データベースが最適な選択です。SQL データベースはトランザクションのアトミック性に対するきめ細かい制御をサポートしており、トランザクションのロールバックも簡単です。
  • NoSQL データベースもトランザクション操作を使用できますが、安定性の点ではリレーショナル データベースには及ばないため、その真の価値は操作のスケーラビリティと大量のデータの処理にあります。
  • 非リレーショナル データベースは、トランザクション処理と安定性の点でリレーショナル データベースに劣ります。ただし、読み取りおよび書き込みのパフォーマンスが高く、拡張が容易で、大規模なデータの処理に有利です。

リレーショナル データベース: トランザクション要件が高く、実行計画を制御する必要があるタスクに特に適しており、トランザクションをきめ細かく制御する方が優れています。

非リレーショナル データベース: トランザクション制御は若干弱くなり、その価値は高いスケーラビリティと大量のデータ処理にあります。

非リレーショナルデータベースの背景

これは、Web2.0 の純粋な動的 Web サイト タイプの 3 つの大きな問題に対処するために使用できます。

(1) 高パフォーマンス - データベースに対する高い同時読み取りおよび書き込み要件。

(2) Hugestorage - 効率的なストレージと大量のデータへのアクセスの必要性。

(3) HighScalability&&HighAvailability —— データベースの高スケーラビリティと高可用性の要件。

リレーショナル データベースと非リレーショナル データベースにはそれぞれ独自の特性と適用シナリオがあり、この 2 つを密接に組み合わせることで、Web2.0 データベースの開発に新しいアイデアがもたらされます。リレーショナル データベースは関係とデータの一貫性の保証に重点を置き、非リレーショナル データベースはストレージと高効率に重点を置きますたとえば、読み取りと書き込みが分離されている MySQI データベース環境では、頻繁にアクセスされるデータ (つまり、高熱のデータ) を非リレーショナル データベースに保存して、アクセス速度を向上させることができます。

2.5 概要

リレーショナルデータベース:

  • 例 --> データベース --> テーブル (表) --> レコード行 (行)、データフィールド (列)

非リレーショナルデータベース:

  • インスタンス --> データベース --> コレクション (コレクション) --> キーと値のペア (キーと値)

  • 非リレーショナル データベースでは、データベースとコレクション (テーブル) を手動で作成する必要はありません。

Redis の概要

Redis (Remote Dictionary Server) は、C で書かれたオープンソースの NoSQL データベースです。

Redis はメモリに基づいて実行され、永続性をサポートしており、現在の分散アーキテクチャに不可欠なキーバリュー (キーと値のペア) ストレージ形式を採用しています。

Redis サーバー プログラムはシングル プロセス モデルです。つまり、1 台のサーバー上で複数の Redis プロセスを同時に起動できます。Redis の実際の処理速度は、メイン プロセスの実行効率に完全に依存します。

  • サーバー上で Redis プロセスが 1 つだけ実行されている場合、複数のクライアントが同時にアクセスすると、サーバーの処理能力がある程度低下します。
  • 複数の Redis プロセスが同じサーバー上で開始される場合、Redis は同時処理能力を向上させる一方で、サーバーの CPU に大きな負荷をかけます。

つまり、実際の運用環境では、実際のニーズに応じて開く Redis プロセスの数を決定する必要があります。高い同時実行性に対するより高い要件がある場合は、同じサーバー上で複数のプロセスを開くことを検討してください。CPU リソースが比較的不足している場合は、単一プロセスを使用できます。

Redis には次の利点があります。

(1)高いデータ読み取りおよび書き込み速度:データ読み取り速度は最大 110,000 回/秒、データ書き込み速度は最大 81,000 回/秒に達します。

(2)サポートされるデータ構造:キーと値。豊富なデータ型をサポート: 文字列、リスト、ハッシュ、セット、ソートされたセット、およびその他のデータ型操作。

  • 文字列 文字列型
  • リスト リスト タイプ
  • ハッシュ ハッシュ (ハッシュ)
  • 順序なしコレクションを設定します
  • ソートされたセット 順序付けられたコレクション (または zset)

(redis はメッセージ キューとしても使用でき、これはソート セットを通じて実現できます)

(3)データ永続化のサポート:メモリ内のデータをディスクに保存し、再起動時に再度ロードして使用できます。

(4)アトミック性:すべての Redis 操作はアトミックです。(トランザクションをサポートし、すべての操作はトランザクションとして扱われます)

(5)データバックアップのサポート:マスター/スレーブモードでのデータバックアップ。(マスター/スレーブ レプリケーションをサポート)

Redisの欠点

  1. キャッシュとデータベースの二重書き込みの整合性の問題
  2. キャッシュなだれの問題
  3. キャッシュの故障の問題
  4. キャッシュ ## Redis の適用可能なシナリオ
  • メモリベースのデータベースである Redis は、セッション キャッシュ、キュー、リーダーボード、カウンター、最近の注目の記事、最近の注目のコメント、パブリッシュ サブスクリプションなどで一般に使用される高性能キャッシュです。
  • Redis は、高いリアルタイム データ要件、有効期限と削除特性のあるデータ ストレージ、永続性の必要がない、または弱い整合性のみ、およびシンプルなロジックを備えたシナリオに適しています。

Redis はなぜそれほど速いのでしょうか?

  • 1. Redis は純粋なメモリ構造であり、ディスク I/O などの時間のかかる操作を回避します。(メモリに基づいて実行されます)

  • 2. Redis コマンド処理のコア モジュールはシングルスレッドであるため、ロックの競合、スレッドの頻繁な作成と破棄のコストが削減され、スレッド コンテキストの切り替えの消費が削減されます。(シングルスレッドモデル)

  • 3. I/O多重化機構を採用し、同時実行効率を大幅に向上させます。(エポールモード)

ノート:

Linux システムには、ディスク I/O とネットワーク リクエスト I/O の 2 種類の I/O があります。

Redis 6.0 で新しく追加されたマルチスレッドは、ネットワーク リクエストの処理にマルチリニアリティのみを使用しますが、データの読み取りおよび書き込みコマンドは依然として単一のスレッドによって処理されます。

Redis と memcached の比較

 Redis のインストールとデプロイメント

关闭防火墙
systemctl stop firewalld
setenforce 0
#安装依赖环境
yum install -y gcc gcc-c++ make
 
#解压文件到指定文件夹 opt
tar zxvf redis-5.0.7.tar.gz -C /opt/
cd /opt/redis-5.0.7/
#安装
make
make PREFIX=/usr/local/redis install
#执行软件包提供的install_server.sh 脚本文件,设置Redis服务所需要的相关配置文件
cd /opt/redis-5.0.7/utils
./install_server.sh
……
慢慢回车
Please select the redis executable path []
手动输入
/usr/local/redis/bin/redis-server
 
#创建软链接
ln -s /usr/local/redis/bin/* /usr/local/bin/
 
/etc/init.d/redis_6379 stop				#停止
/etc/init.d/redis_6379 start			#启动
/etc/init.d/redis_6379 restart			#重启
/etc/init.d/redis_6379 status	
 
vim /etc/redis/6379.conf
 
70行,添加 监听的主机地址
bind 127.0.0.1 192.168.137.10				
 
93行,Redis默认的监听端口
port 6379									
 
137行,启用守护进程
daemonize yes							
 
159行,指定 PID 文件
pidfile /var/run/redis_6379.pid				
 
167行,日志级别
loglevel notice								
 
172行,指定日志文件
logfile /var/log/redis_6379.log				
------------------------------------------
#重启服务
/etc/init.d/redis_6379 restart

パッケージを解凍してコンパイルします

指定したディレクトリにインストールする

 パッケージが提供するスクリプトファイルを実行し、ソフト接続を行います。

 Redisサービスを起動して確認する

構成ファイルを入力してリスニングホストを追加します

サービスを再起動する

 

  Redisコマンドツール

  • redis-server: Redisを起動するためのツール
  • redis-benchmark: マシン上の Redis の動作効率を検出するために使用されます。
  • redis-check-aof: AOF 永続ファイルを修復する
  • redis-check-rdb: RDB 永続ファイルを修復する
  • redis-cli: Redisコマンドラインツール

redis-cliコマンドライン ツール

语法:redis-cli -h host -p port -a password 
 
-h:指定远程主机
-p:指定Redis服务的端口号
-a:指定密码,未设置数据库密码可以省略-a选项若不添加任何选项表示,则使用127.0.0.1:6379连接本机上的Redis数据库  
redis-cli -h 192.168.137.10 -p 6379     #登录指定主机redis
redis-cli                               #登录本机redis

 

 redis -ベンチマークテストツール

redis-benchmark は、Redis サービスのパフォーマンスを効果的にテストできる公式の Redis パフォーマンス テスト ツールです。

 基本的测试语法:redis-benchmark [选项] [选项值]
オプション 効果
-h サーバーのホスト名を指定する
p サーバーポートを指定する
-s サーバーソケットを指定します
-n リクエストの数を指定する
-d SET/GET値のデータサイズをバイト単位で指定します。
-k 1=生存を維持 0=再接続
-r SET/GET/INCR はランダムなキーを使用し、sADD はランダムな値を使用します
-P <numerq> リクエストをパイプ処理します
--csv csv形式で出力します。
-l (小さいL) ループを生成し、テストを永久に実行します
-t テスト コマンドのカンマ区切りリストのみを実行します。
-I(大I) 起動維持モード。N 個のアイドル状態の接続のみを開いて待機します

IP アドレス 192.168.137.10 とポート 6379 を使用して Redis サーバーに 100 の同時接続と 100,000 のリクエストを送信して、パフォーマンスをテストします。

redis-benchmark -h 192.168.137.10 -p 6379 -c 100 -n 100000
#测试存取大小为100字节的数据包的性能
redis-benchmark -h 192.168.137.10 -p 6379 -q -d 100
 
#测试本机上Redis服务在进行 set与1push操作时的性能
redis-benchmark -t set,lpush -n 100000 -q

 Redis データベースの一般的なコマンド

大文字と小文字を区別しません

 set     存放数据,命令格式为 set key value
 get     获取数据,命令格式为 get key
redis-cli
127.0.0.1:6379> set name my  #设置name值为my
OK
127.0.0.1:6379> get name     #查看name的值
"my"

 データベース内のキーのステータスを確認する

 keys    命令可以取符合规则的键值列表,通常情况可以结合*、?等选项来使用。
 exists  命令可以判断键值是否存在。
 del     命令可以删除当前数据库的指定 key。
 type    命令可以获取 key 对应的 value 值类型。

キー データベース内のキーを表示します

  キー?与キー *

set qq 1
set qq1 2
set q2 3
set q4 4
keys q?
keys q*

  鍵??

exists コマンドは、キー値が存在するかどうかを判断できます。

 exists qq#判断 qq键是否存在
 #1表示 qq键是存在
 exists q
 #0表示q键不存在

 del コマンドは、現在のデータベースの指定されたキーを削除できます。

del 键名

 type コマンドは、キーに対応する値の型を取得できます。

type 键名

 rename コマンドは、既存のキーの名前を変更します。

(覆盖)命令格式:rename 源key 目标key

rename コマンドを使用して名前を変更する場合、ターゲット キーが存在するかどうかに関係なく名前の変更が実行され、ソース キーの値がターゲット キーの値を上書きします。実際の使用では、重要なデータの上書きを避けるために、exists コマンドを使用して対象のキーが存在するかどうかを確認し、その後 rename コマンドを実行するかどうかを決定することを推奨します。

 名前変更コマンド

renamenx コマンドは、既存のキーの名前を変更し、新しい名前が存在するかどうかを検出します。対象のキーが存在する場合、名前は変更されません。

 (不覆盖)命令格式:renamenx 源key 目标key

 dbsize コマンドは、現在のデータベース内のキーの数を確認します。

dbsize

 config set requirepass passwd コマンドを使用してパスワードを設定します。

config set requirepass 密码

config get requirepass コマンドを使用してパスワードを表示します(パスワードを設定したら、最初にパスワードを検証する必要があります。検証しないとすべての操作が使用できなくなります)。

config get requirepass

パスワードを削除する

 config  set requirepass ''

Redis マルチデータベース共通コマンド

  • Redis は複数のデータベースをサポートしています。Redis にはデフォルトで 16 のデータベースが含まれており、データベース名には 0 ~ 15 の番号が連続して付けられます。
  • 複数のデータベースは互いに独立しており、相互に干渉しません。

複数のデータベース間の切り替え

 命令格式:select 序号

redis-cli を使用して Redis データベースに接続すると、シリアル番号 0 のデータベースがデフォルトで使用されます。

複数のデータベース間でのデータの移動

 格式:move 键值 序号

データベース内のデータをクリアする

 FLUSHDB :清空当前数据库数据
 FLUSHALL :清空所有数据库的数据,慎用!

おすすめ

転載: blog.csdn.net/weixin_57560240/article/details/130912989