Redis を使い始めるための 15 の簡単なステップ

Redis を使い始めるための 15 の簡単なステップ

1. Redis の概要

REmote DIctionary Server (Redis) は、Salvatore Sanfilippo によって作成されたキー/値ストレージ システムですRedis は、ANSI C 言語で書かれたオープンソースのログタイプの Key-Value データベースで、BSD プロトコルに準拠し、ネットワークをサポートし、メモリベースで永続化でき、複数の言語で API を提供します。値には文字列、マップ、リスト、セット、ソートされたセットなどのタイプがあるため、データ構造サーバーと呼ばれることがよくあります。

Redis がキーと値に基づいた SQL データベースではないことは誰もが知っているため、まずキー関連の知識ポイントについて学びましょう。

1. 任意のバイナリ シーケンスをキーとして使用できる
2. Redis にはキーを設計するための統一ルールがある
3. キーと値に許可される最大長は 512MB です。

2. 対応言語

ActionScript Bash CC# C++ Clojure Common LispCrystal D Dart Elixir emacs lisp Erlang Fancy gawk GNU Prolog Go Haskell Haxe Io Java Javascript Julia Lua Matlab mruby Nim Node.js Objective-C OCaml Pascal Perl PHP Pure Data Python R Racket Rebol Ruby Rust Scala Scheme Smalltalk Swift Tcl VB VCL

3. Redis のアプリケーション シナリオは何ですか?

1. 最も一般的に使用されるのはセッション キャッシュです
。 2. 支払いなどのメッセージ キュー
3. アクティビティ リーダーボードまたはカウント
4. メッセージの公開および購読 (メッセージ通知)
5. 商品リスト、コメント リストなど。

拡張: Redis の 16 の主要なアプリケーション シナリオ

4.Redisのインストール

Redis のインストールと関連する知識ポイントについては、「Nosql Database Service redis」を参照してください。

インストールのおおよその手順は次のとおりです。

RedisはC言語で開発されており、redisのインストールにはC言語のコンパイル環境が必要です。

gcc がない場合は、オンラインでインストールする必要があります: yum install gcc-c++

ステップ 1: ソース パッケージを取得します: wget http://download.redis.io/releases/redis-3.0.0.tar.gz
ステップ 2: redis を解凍します: tar zxvf redis-
3.0.0.tar.gz ステップ 3:コンパイル。Redis ソース コード ディレクトリ (cd redis-3.0.0) を入力します。
make:インストールの4番目のステップを実行します。make install PREFIX=/usr/local/redis

PREFIXパラメータはredisのインストールディレクトリを指定します。

5. Redisのデータ型

Redis は合計 5 つのデータ型をサポートします

1. 文字列 (文字列)
2. ハッシュ (ハッシュ)
3. リスト (リスト)
4. セット (セット)
5. zset (ソートセット順序セット)

文字列(文字列)

Redis の最も基本的なデータ型で、1 つのキーに 1 つの値が対応しますが、キー値の最大保存容量は 512MB です。

127.0.0.1:6379> set key "hello world"
OK
127.0.0.1:6379> get key
"hello world"
127.0.0.1:6379> getset key "nihao"
"hello world"
127.0.0.1:6379> mset key1 "hi" key2 "nihao" key3 "hello"
OK
127.0.0.1:6379> get key1
"hi"
127.0.0.1:6379> get key2
"nihao"
127.0.0.1:6379> get key3
"hello"

関連コマンドの紹介

set キーの値 (値) を設定しますgetキーに
対応する値 (値) を取得しますgetset キーの値 (値) を設定し、対応する値を返しますmset 複数のキーの値 (値) を設定します

ハッシュ (ハッシュ)

Redis ハッシュは、キーと値のペアのコレクションであり、オブジェクトの格納に適した文字列型のフィールドと値のマッピング テーブルです。

127.0.0.1:6379> hset redishash 1 "001"
(integer) 1
127.0.0.1:6379> hget redishash 1
"001"
127.0.0.1:6379> hmset redishash 1 "001" 2 "002"
OK
127.0.0.1:6379> hget redishash 1
"001"
127.0.0.1:6379> hget redishash 2
"002"
127.0.0.1:6379> hmget redishash 1 2
1) "001"
2) "002"

関連コマンドの紹介

hset は、Key に対応するハッシュ内のフィールドを値として設定します。ハッシュが存在しない場合は、自動的に作成されます。hget は、
ハッシュ内のフィールド設定の値を取得します。hmset は、
同じフィールドに複数のフィールド値を設定します。 hmget は
同じハッシュをバッチで取得します。複数のフィールド値は、

リスト(リスト)

挿入順にソートされた、redis 内の文字列の単純なリストです。

127.0.0.1:6379> lpush word  hi
(integer) 1
127.0.0.1:6379> lpush word  hello
(integer) 2
127.0.0.1:6379> rpush word  world
(integer) 3
127.0.0.1:6379> lrange word 0 2
1) "hello"
2) "hi"
3) "world"
127.0.0.1:6379> llen word
(integer) 3

関連コマンドの紹介

lpush は、指定されたリストの左側に要素を挿入し、
挿入されたリストの長さを返します。 rpush は、指定されたリストの右側に要素を挿入し、挿入されたリストの長さを返します。
llen は、指定されたリストの長さを返します。 lrange は、
要素を返します。指定されたリスト内の指定された範囲の値

セット(セット)

これは文字列型の順序付けされていないコレクションであり、繰り返すことはできません。

127.0.0.1:6379> sadd redis redisset
(integer) 1
127.0.0.1:6379> sadd redis redisset1
(integer) 1
127.0.0.1:6379> sadd redis redisset2
(integer) 1
127.0.0.1:6379> smembers redis
1) "redisset1"
2) "redisset"
3) "redisset2"
127.0.0.1:6379> sadd redis redisset2
(integer) 0
127.0.0.1:6379> smembers redis
1) "redisset1"
2) "redisset"
3) "redisset2"
127.0.0.1:6379> smembers redis
1) "redisset1"
2) "redisset3"
3) "redisset"
4) "redisset2"
127.0.0.1:6379> srem redis redisset
(integer) 1
127.0.0.1:6379> smembers redis
1) "redisset1"
2) "redisset3"
3) "redisset2"

関連コマンドの紹介

sacd キーに対応するセットに文字列要素を追加します。成功した場合は 1 を返し、要素が存在する場合は 0 を返します。
smembers は、指定されたセット内のすべての要素を返します。
srem は、指定されたセット内の要素を削除します。

zset (ソートされたセット、順序付けられたセット)

これは文字列型の順序付きセットであり、繰り返すことはできません。
並べ替えられたセット内の各要素はスコアを指定する必要があります。要素はスコアに従って昇順で並べ替えられます。複数の要素が同じスコアを持つ場合は、昇順で並べ替えられます。したがって、ソートされたセットはランキングの実装に最適です

127.0.0.1:6379> zadd nosql 0 001
(integer) 1
127.0.0.1:6379> zadd nosql 0 002
(integer) 1
127.0.0.1:6379> zadd nosql 0 003
(integer) 1
127.0.0.1:6379> zcount nosql 0 0 
(integer) 3
127.0.0.1:6379> zcount nosql 0 3
(integer) 3
127.0.0.1:6379> zrem nosql 002
(integer) 1
127.0.0.1:6379> zcount nosql 0 3
(integer) 2
127.0.0.1:6379> zscore nosql 003
"0"
127.0.0.1:6379> zrangebyscore nosql 0 10
1) "001"
2) "003"
127.0.0.1:6379> zadd nosql 1 003
(integer) 0
127.0.0.1:6379> zadd nosql 1 004
(integer) 1
127.0.0.1:6379> zrangebyscore nosql 0 10
1) "001"
2) "003"
3) "004"
127.0.0.1:6379> zadd nosql 3 005
(integer) 1
127.0.0.1:6379> zadd nosql 2 006
(integer) 1
127.0.0.1:6379> zrangebyscore nosql 0 10
1) "001"
2) "003"
3) "004"
4) "006"
5) "005"

関連コマンドの紹介

zadd 指定されたsortesetに1つ以上の要素を追加し
ます zrem 指定されたsortesetから1つ以上の要素を削除します
zcount 指定されたsorteset内の指定されたスコア範囲内の要素の数を表示します
zscore 指定されたsorteset内の指定されたスコアを持つ要素を表示します zrangebyscore
すべて表示指定されたソートセット内の指定されたスコア範囲内の要素

6. キー値に関するコマンド


127.0.0.1:6379> exists key
(integer) 1
127.0.0.1:6379> exists key1
(integer) 1
127.0.0.1:6379> exists key100
(integer) 0
127.0.0.1:6379> get key
"nihao,hello"
127.0.0.1:6379> get key1
"hi"
127.0.0.1:6379> del key1
(integer) 1
127.0.0.1:6379> get key1
(nil)
127.0.0.1:6379> rename key key0
OK
127.0.0.1:6379> get key(nil)
127.0.0.1:6379> get key0
"nihao,hello"
127.0.0.1:6379> type key0
string

存在します #キーが存在するかどうかを確認します
del #キーの
削除期限切れ #キーの有効期限を設定します (秒単位)
persist #キーの有効期限の設定を削除します
rename #キーの名前を変更します
type #戻り値のタイプ

7. Redis サービス関連のコマンド

127.0.0.1:6379> select 0
OK
127.0.0.1:6379> info
# Server
redis_version:3.0.6
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:347e3eeef5029f3
redis_mode:standalone
os:Linux 3.10.0-693.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.8.5
process_id:31197
run_id:8b6ec6ad5035f5df0b94454e199511084ac6fb12
tcp_port:6379
uptime_in_seconds:8514
uptime_in_days:0
hz:10
lru_clock:14015928
config_file:/usr/local/redis/redis.conf
-------------------省略N行
127.0.0.1:6379> CONFIG GET 0
(empty list or set)
127.0.0.1:6379> CONFIG GET 15
(empty list or set)

slect #データベース(データベース番号0~15)を選択
quit #接続
情報を
終了 #サービス情報と統計情報
取得すべてのデータベースのキー キー

8. Redis の公開とサブスクリプション

Redis のパブリッシュおよびサブスクライブ (pub/sub) は、一方が情報を送信し、もう一方が情報を受信するメッセージ通信モデルです。
下の図は、3 つのクライアントが同時に同じチャネルに登録していることを示しています。

lm90b786.png

下の図は、新しい情報がチャネル 1 に送信されると、メッセージがそのメッセージを購読している 3 つのクライアントに送信されることを示しています。

lm90beqg.png

9. Redisトランザクション

Redis トランザクションは一度に複数のコマンドを実行できます

1. exec コマンド送信前にキューキャッシュに入れてトランザクションを終了する2. exec コマンド受信後にトランザクション操作を実行する あるコマンド
の実行が失敗しても、他のコマンドは引き続き実行できる
トランザクションの実行、他のクライアントが送信するリクエストはトランザクション実行のコマンド リストに挿入されません

トランザクションは 3 つの段階を経ます

トランザクション開始(コマンド:multi)
コマンド実行
トランザクション終了(コマンド:exec)

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set key key1
QUEUED
127.0.0.1:6379> get key
QUEUED
127.0.0.1:6379> rename key key001
QUEUED
127.0.0.1:6379> exec
1) OK
2) "key1"
3) OK

10. Redis セキュリティ構成

設定ファイルのデバイスパスワードパラメータを変更することでセキュリティを向上させることができます

 #requirepass foobared

コメント # を削除することでパスワードを設定できます。
パスワードが設定されていない場合は、次のようにクエリします。

127.0.0.1:6379> CONFIG GET requirepass
1) "requirepass"
2) ""

パスワード設定後は認証が必要です

127.0.0.1:6379> CONFIG GET requirepass
(error) NOAUTH Authentication required.
127.0.0.1:6379> AUTH foobared 
#认证OK
127.0.0.1:6379> CONFIG GET requirepass
1) "requirepass"
2) "foobared"

11. Redis の永続化

Redis を永続化するには、スナップショット (スナップショット) と追加専用ファイル (AOF) の 2 つの方法があります。

スナップショットの撮影

1、将存储在内存的数据以快照的方式写入二进制文件中,如默认dump.rdb中
2、save 900 1 
#900秒内如果超过1个Key被修改,则启动快照保存
3、save 300 10 
#300秒内如果超过10个Key被修改,则启动快照保存
4、save 60 10000 
#60秒内如果超过10000个Key被修改,则启动快照保存

追加専用ファイル(AOF)

1、使用AOF持久时,服务会将每个收到的写命令通过write函数追加到文件中(appendonly.aof)
2、AOF持久化存储方式参数说明
   appendonly yes  
#开启AOF持久化存储方式
    appendfsync always 

#收到写命令后就立即写入磁盘,效率最差,效果最好
    appendfsync everysec

 #每秒写入磁盘一次,效率与效果居中
    appendfsync no 

#完全依赖OS,效率最佳,效果没法保证

12. Redis パフォーマンステスト

関連するテストツールが付属


[root@test ~]# redis-benchmark --help

Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests]> [-k <boolean>] 

-h <hostname>      Server hostname (default 127.0.0.1) 
-p <port>          Server port (default 6379) 
-s <socket>        Server socket (overrides host and port) -a <password>      Password for Redis Auth 
-c <clients>       Number of parallel connections (default 50) 
-n <requests>      Total number of requests (default 100000) 
-d <size>          Data size of SET/GET value in bytes (default 2) 
-dbnum <db>        SELECT the specified db number (default 0) 
-k <boolean>       1=keep alive 0=reconnect (default 1) 
-r <keyspacelen>   Use random keys for SET/GET/INCR, random values for SADD  Using this option the benchmark will expand the string __rand_int__  inside an argument with a 12 digits number in the specified range  from 0 to keyspacelen-1. The substitution changes every time a command  is executed. Default tests use this to hit random keys in the  specified range. 
-P <numreq>        Pipeline <numreq> requests. Default 1 (no pipeline). 
-q                 Quiet. Just show query/sec values --csv              Output in CSV format 
-l                 Loop. Run the tests forever 
-t <tests>         Only run the comma separated list of tests. The test                    names are the same as the ones produced as output. 
-I                 Idle mode. Just open N idle connections and wait.

Examples: 

Run the benchmark with the default configuration against 127.0.0.1:6379:   
$ redis-benchmark

Use 20 parallel clients, for a total of 100k requests, against 192.168.1.1:   
$ redis-benchmark -h 192.168.1.1 -p 6379 -n 100000 -c 20 

Fill 127.0.0.1:6379 with about 1 million keys only using the SET test:   
$ redis-benchmark -t set -n 1000000 -r 100000000 

Benchmark 127.0.0.1:6379 for a few commands producing CSV output:   
$ redis-benchmark -t ping,set,get -n 100000 --csv 

Benchmark a specific command line:   
$ redis-benchmark -r 10000 -n 10000 eval 'return redis.call("ping")' 0 

Fill a list with 10000 random elements:   
$ redis-benchmark -r 10000 -n 10000 lpush mylist __rand_int__ 

On user specified command lines __rand_int__ is replaced with a random integer with a range of values selected by the -r option.

実際のテストでは 100 万リクエストを同時に実行

[root@test ~]# redis-benchmark -n 1000000 -q
PING_INLINE: 152578.58 requests per second
PING_BULK: 150308.14 requests per second
SET: 143266.47 requests per second
GET: 148632.58 requests per second
INCR: 145857.64 requests per second
LPUSH: 143781.45 requests per second
LPOP: 147819.66 requests per second
SADD: 138350.86 requests per second
SPOP: 134282.27 requests per second
LPUSH (needed to benchmark LRANGE): 141302.81 requests per second
LRANGE_100 (first 100 elements): 146756.67 requests per second
LRANGE_300 (first 300 elements): 148104.27 requests per second
LRANGE_500 (first 450 elements): 152671.75 requests per second
LRANGE_600 (first 600 elements): 148104.27 requests per second
MSET (10 keys): 132731.62 requests per second

13. Redis のバックアップとリカバリ

Redis を自動的にバックアップするには 2 つの方法があります

  • 1 つ目は、dump.rdb ファイルを使用してバックアップすることです。
  • 2 番目の方法では、aof ファイルを使用して自動バックアップを実現します。

dump.rdb バックアップ

Redis サービスのデフォルトの自動ファイル バックアップ方法(AOF がオンになっていない場合) では、サービスの開始時にdump.rdbファイルからデータが自動的にロードされます。
具体的な設定はredis.confにあります

save 900 1
save 300 10
save 60 10000

save コマンドを手動で実行して手動バックアップを実行することもできます。

127.0.0.1:6379> set name key
OK
127.0.0.1:6379> SAVE
OK
127.0.0.1:6379> set name key1
OK
127.0.0.1:6379> BGSAVE
Background saving started

Redis がダンプ ファイルにスナップショットを取得すると、dump.rdb ファイルが自動的に生成されます。

# The filename where to dump the DB
dbfilename dump.rdb
-rw-r--r-- 1 root root   253 Apr 17 20:17 dump.rdb
  • SAVEコマンドは、メイン プロセスを使用して、現在のデータベースのスナップショットをダンプ ファイルに作成することを意味します。
  • BGSAVEコマンドは、メイン プロセスが子プロセスをフォークしてスナップショット バックアップを実行することを示します。

2 つのバックアップの違いは、前者はメイン プロセスをブロックするのに対し、後者はブロックしないことです。

リカバリー例

# Note that you must specify a directory here, not a file name.dir 
/usr/local/redisdata/
#备份文件存储路径
127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/usr/local/redisdata"
127.0.0.1:6379> set key 001
OK
127.0.0.1:6379> set key1 002
OK
127.0.0.1:6379> set key2 003
OK
127.0.0.1:6379> save
OK

バックアップファイルを他のディレクトリにバックアップする

[root@test ~]# ll /usr/local/redisdata/
total 4
-rw-r--r-- 1 root root 49 Apr 17 21:24 dump.rdb

[root@test ~]# date
Tue Apr 17 21:25:38 CST 2018
[root@test ~]# cp ./dump.rdb /tmp/

データを削除する

127.0.0.1:6379> del key1
(integer) 1
127.0.0.1:6379> get key1
(nil)

サービスを終了し、元のバックアップ ファイルをバックアップ保存ディレクトリにコピーして戻します。

[root@test ~]# redis-cli -a foobared shutdown
[root@test ~]# lsof -i :6379
[root@test ~]# cp /tmp/dump.rdb /usr/local/redisdata/
cp: overwrite ‘/usr/local/redisdata/dump.rdb’? y
[root@test ~]# redis-server /usr/local/redis/redis.conf &
[1] 31487

ログインしてデータが復元されたかどうかを確認する

[root@test ~]# redis-cli -a foobared
127.0.0.1:6379> mget key key1 key2
1) "001"
2) "002"
3) "003"

AOF自動バックアップ

Redis サービスはデフォルトでこの構成をオフにします

###### APPEND ONLY MODE ##########
appendonly no

# The name of the append only file (default: "appendonly.aof")
appendfilename "appendonly.aof"

# appendfsync always
appendfsync everysec

# appendfsync no

構成ファイルの関連パラメータについては、以前に詳しく紹介しました。
AOF ファイルのバックアップは、すべての履歴レコードと実行されたコマンドをバックアップすることです。mysql binlog と非常によく似ています。回復中に、以前に実行されたコマンドが再実行されます。回復前に、同じように手動で削除する必要があることに注意してください。データベースの回復 del を実行したり、コマンドを誤って操作したりしました。

AOF はダンプ バックアップとは異なります

1. AOF ファイルのバックアップはダンプ ファイルのバックアップとは異なります
2. ファイルを読み取るサービスの優先順位が異なります 以下の優先順位に従って開始されます
AOF のみが設定されている場合、再起動時にデータを復元するために AOF ファイルがロードされます.
RBD と AOF が同時に構成されている場合、起動はデータを復元するために AOF ファイルのみをロードします。RBD のみが
構成されている場合は、起動時にダンプ ファイルがロードされてデータを復元します。
注: aof が構成されている限り、 aof ファイルがない場合、この時点で開始されるデータベースは空になります。

14. Redis 本番環境の最適化の概要

1. メモリ管理の最適化

 hash-max-ziplist-entries 512  
 hash-max-ziplist-value 64  
 list-max-ziplist-entries 512  
 list-max-ziplist-value 64
 #list的成员与值都不太大的时候会采用紧凑格式来存储,相对内存开销也较小

Linux 環境で Redis を実行する場合、システム メモリが比較的小さい場合、この時点で自動バックアップが失敗する可能性があるため、システムの vm.overcommit_memory パラメータを変更する必要があります。このパラメータは、Linux システムのメモリ割り当て戦略です。 。

0 は、アプリケーション プロセスに使用可能なメモリが十分にあるかどうかをカーネルがチェックすることを示します。使用可能なメモリが十分にある場合、メモリ アプリケーションは許可されます。そうでない場合、メモリ アプリケーションは失敗し、アプリケーション プロセスにエラーが返されます。
1 は、現在のメモリ状態に関係なく、カーネルがすべての物理メモリの割り当てを許可することを意味します。
2 は、カーネルがすべての物理メモリとスワップ領域を合わせたよりも多くのメモリを割り当てることができることを意味します。

Redis の公式説明では、vm.overcommit_memory の値を 1 に変更することが推奨されています。これは次の方法で変更できます。

(1) /etc/sysctl.conf を vm.overcommit_memory=1 に編集し、sysctl -p で構成ファイルを有効にします
(2) sysctl vm.overcommit_memory=1
(3) echo 1 > /proc/sys/vm/オーバーコミットメモリ

2. メモリの事前割り当て

3. 永続化メカニズム

  • スケジュールされたスナップショット: 効率的ではなく、データ損失を引き起こす可能性があります
  • AOF: データの整合性を維持します (インスタンスの数が多すぎてはならず、最大 2G)

最適化の概要

1) ビジネス ニーズに応じて適切なデータ型を選択します。
2) ビジネス シナリオで永続性が必要ない場合は、すべての永続化メソッドをオフにします (効率を向上させるために ssd ディスクを使用します)
3) 仮想メモリを使用せず、AOF を毎秒リアルタイムで書き込みます
4 ) REDIS が配置されているサーバーの物理メモリが総メモリの 3/5 を超えないようにする
5) maxmemory を使用する
6) 大量のデータには複数の Redis インスタンスを業務に応じて使い分ける

15. Redisクラスターアプリケーション

クラスターは、同じビジネス要件を達成したり、高可用性と負荷分散を実現したりするために、複数の Redis インスタンスを集めることです

どのようなクラスター ソリューションがありますか?

1.haproxy+keepalived+redis クラスター

haproxy+keepalived+redis クラスター

1) Redis の設定ファイルを通じてマスター/スレーブのレプリケーションと読み書き分離を実現します。
2) haproxy の設定を通じて負荷分散を実現し、スレーブに障害が発生したときにクラスターから T を削除します。 3
) keepalived を使用して、高可用性を実現します。負荷

2. redis 公式 Sentinel クラスター管理ツール

Redis クラスター実稼働環境の高可用性ソリューションの実践プロセス

redis 公式 Sentinel クラスター管理ツール

1) センチネルは、クラスター内のマスター/スレーブ サービスの監視、通知、自動フェイルオーバーを担当します。
2) Redis クラスターは、外部サービスを提供する責任を負います。

Redis Sentinelクラスタのクラスタ構成については、以下を参照してください。

3、Redisクラスター

Redis Cluster は Redis の分散ソリューションであり、Redis バージョン 3.0 で正式にリリースされ、Redis の分散ニーズを効果的に解決します。単一マシンのメモリ、同時実行性、トラフィックなどのボトルネックが発生した場合、クラスター アーキテクチャを使用して負荷分散を実現できます。

Redis クラスター

1) 公式推奨、間違いありません。
2) 分散化により、クラスターは最大 1,000 ノードを追加でき、パフォーマンスはノード数に比例して拡張します。
3) 管理が簡単で、後でノードを追加または削除したり、スロットを移動したりすることができます。
4) シンプルで使いやすい。

おすすめ

転載: blog.csdn.net/heshihu2019/article/details/132744866