【初级】Redis

以下是对该句子的中文本地化改写:

情景

由於目前我們在自家服務中使用 Redis,所以我重新學習並總結了一下。

本次记录了Redis的概述、特点、配置和复制的基础部分。

如果有任何错误,请指正,将不胜感激。

Redis 是一个高性能的键值存储系统,用于存储和检索数据。它支持多种数据类型,包括字符串、哈希表、列表、集合和有序集合。Redis 是一个开源的内存数据库,可以将数据存储在内存中,以提高访问速度。它还具有持久性功能,可以将数据持久化到磁盘中。Redis 可以用于缓存、消息队列、实时分析等多种应用场景。

本章介绍了Redis的概述。

    • Redis = REmote DIctionary Server の略です。

 

    • Redis は、Key-Value型 の NoSQL データベースです。

 

    • Redis は C 言語で書かれており、Open Source (BSD licensed) で開発されています。

 

    • Redis は Client-Server モデル を採用した インメモリデータベースです。

すべてのデータをコンピュータのメインメモリ上に展開しながら動作します。
他にも、インメモリDB として、 memcached が有名です。
対義語は ディスク型データベースです。(例: MySQL)

様々なデータ構造をサポートしています。

string
hash
list
set (要素の集合)
sorted set (ソート済みのset)

Redis 的特点

本章中列举了Redis的特点。

    • 1 プロセス、1スレッドで動作します。

MySQLのように並列での処理はできないため、すべての動作が排他的になります。

複数のデータベースをIDで指定でき、各データベースは独立しています。
Redis はマルチマスタの運用ができません。

しかし、擬似的なマルチマスタ構成は可能で、Redis Cluster で実現可能です。(ver 3.0 以降)
擬似的とは、実際にデータが各ノードに伝播しているわけではありません。
あるレコードをどのノードに保存するかを把握しておき、ノード間でリダイレクトすることによって、どのノードから接続しても指定するデータにたどり着ける仕組みとなっています。

データの永続化 (RDB)

save コマンド (または設定ファイル) でスナップショットをディスクに保存することが可能です。

データの永続化 (AOF: Append Only File)

サーバが受け付けた、書き込みコマンド の実行ログが格納されています。
イメージとしは、MySQL の バイナリログ のようなものです。
そのファイルから、ログをリプレイし、元のデータを再構成することが可能です。

安装和验证 Redis。

本章介绍了在Ubuntu18上安装Redis服务器的步骤。

安装和启动Redis确认

使用以下命令安装 redis-server。

$ sudo apt update
$ sudo apt install redis-server
$ redis-server --version
Redis server v=4.0.9 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=76095d16786fbcba

安装完后,请确保 redis-server 已经启动。

$ sudo systemctl status redis-server.service
● redis-server.service - Advanced key-value store
   Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2019-02-24 06:39:38 UTC; 3min 48s ago
     Docs: http://redis.io/documentation,
           man:redis-server(1)
 Main PID: 17745 (redis-server)
    Tasks: 4 (limit: 2361)
   CGroup: /system.slice/redis-server.service
           └─17745 /usr/bin/redis-server 127.0.0.1:6379

确认动作

一旦确认redis-server已经启动,就可以使用redis-cli命令进行操作确认。

$ redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set test "HELLO, World!!"
OK
127.0.0.1:6379> get test
"HELLO, World!!"

另外,您可以使用INFO命令来查看当前redis的状态和配置。

127.0.0.1:6379> INFO
# Server
redis_version:4.0.9
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:76095d16786fbcba
redis_mode:standalone
os:Linux 4.15.0-45-generic x86_64

(...snip...)

# Cluster
cluster_enabled:0

# Keyspace
db0:keys=1,expires=0,avg_ttl=0

Redis的基本配置

Redis的配置文件是/etc/redis/redis.conf。
当更改配置文件时,重新启动redis-server。

本章中包含了Redis的典型配置。

启动时的设置

恶魔化

    • daemonize はデーモンとして起動する設定になります。デフォルトでは yes です。

 

    daemonize を yes に設定した場合、 pidfile の path を指定する必要があります。
daemonize yes
pidfile /var/run/redis/redis-server.pid

港口

    • Redis の デフォルトのポートは 6379 番です。

 

    bind は、特定の一つのインタフェースにバインドしたい場合に設定します。
port 6379
bind 127.0.0.1

使用netstat命令检查进程,可以发现6379处于监听状态。

$ sudo netstat -alntp | grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      3634/redis-server 1

日志级别和日志文件

    • loglevel で出力するログレベルを変更できます。設定は次の 4 種類です。

debug
verbose
notice
warning

logfile で出力先のログファイルを指定できます。

loglevel notice
logfile /var/log/redis/redis-server.log
    出力例
4565:C 21 Mar 10:06:12.771 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4565:C 21 Mar 10:06:12.771 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=4565, just started
4565:C 21 Mar 10:06:12.771 # Configuration loaded
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 4.0.9 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 4578
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

暂停

    • 指定された時間を過ぎるとコネクションがcloseされます。

単位は 秒 で 0 はdisableとなります。
指定された時間とは、コネクションは張られているが、コマンドが送られていない時間です。

timeout 0

请留心相关事项。

如果将超时设置为0,则假设在连接到redis服务器的客户端上,显式关闭连接。如果客户端发生异常而没有进行关闭处理,连接将继续存在,因此需要注意。

数据库 (databases)

    • database は Redis のデータベースの個数(番号)を指定します。

 

    例えば、 databases 16 を設定すると、16個のDBが利用可能になります。
databases 16
    • デフォルトで Redis は 0番 のデータベースを利用します。

select で異なる DB を選択することもできます。

$ redis-cli
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> SELECT 15
OK
127.0.0.1:6379[15]> SELECT 16
(error) ERR DB index is out of range

※ [] 中的是数据库的编号。0 不会显示出来。

设置持久化

这里列出了两种持久化设置,分别是RDB和AOF。

【RDB】数据保存至磁盘

    • save でデータベースをディスクに保存するタイミングを設定することが可能です。

文法は、 save です。

save を一つも設定しない場合は、保存されません。

save 900 1
save 300 10
save 60 10000

以上设置的说明:

    • もし最低1回、キーの変更が発生すると、900秒(15分)後 に保存します。

 

    • もし最低10回、キーの変更が発生すると、300秒(5分)後 に保存します。

 

    もし最低10000回、キーの変更が発生すると、60秒(1分)後 に保存します。

【RDB】存储位置

    • rdbcompression は rdb を圧縮保存する設定で、デフォルトは 圧縮 (yes) するようになっています。

 

    dbfilename で rdb のファイル名を指定できます。

rdbcompression yes
dbfilename dump.rdb
dir /var/lib/redis

在上述情况下,以 dump.rdb 作为文件名将保存在 dir 目录下的子目录中。

【AOF】存储到磁盘上

    • appendonly で AOF の設定が可能です。デフォルトでは利用しない (no) 設定になっています。

 

    • appdnfsync でディスクへ書き込みする際のモードを選択できます。

always: Redisに書き込みが発生するたびにfsync(ディスクとの同期)を行います。低速。
everysec: 毎秒fsyncを行います。中速。
no: fsync のタイミングをOSに任せます。高速。

appendonly no
appendfsync everysec

【AOF】存储路径

    appendfilename で aof のファイル名を指定できます。
appendfilename "appendonly.aof"
dir /var/lib/redis

在此情况下,会将名为”appendonly.aof”的文件保存在dir目录下。

资源限制

最大客户端数

    maxclients は同時に接続できるクライアント数の最大値を設定できます。デフォルトでは無制限です。
maxclients 10000

如果达到最大客户端数,将显示“ERR max number of clients reached”错误。

最大内存

    redis が使用できるメモリサイズの最大値です。
maxmemory 500MB

当达到最大内存限制(maxmemory)时,根据maxmemory-policy的设置,将删除键(key)。有关策略的详细信息,请参阅此处。

复制设置

只在另一台的 redis.conf 中设置 slaveof。

奴隶

    文法は slaveof です。
slaveof 192.168.1.10 6379

请注意

redis.conf 默认情况下,bind 的设置为 127.0.0.1。
如果想要在 master 和 slave 上以不同的服务器配置 Redis,则在默认设置下,slave 无法连接到 master,导致复制失败。
在这种情况下,请将其设置为 0.0.0.0 等。

实践复制

我們希望在這裡使用主/從的二台架構來實際進行複製。
假設作業系統和 Redis 的安裝已經完成。
此外,每台伺服器的 IP 設定如下。

master : 192.168.4.10
slave  : 192.168.4.20

师傅的设置

在主服务器上,我们会在redis.conf中进行以下配置。

bind 0.0.0.0

如果编辑了redis.conf文件,请重新启动redis。

奴隶的设定

在从属端进行以下设置。

bind 0.0.0.0
slaveof 192.168.1.10 6379

如果修改了redis.conf,请重新启动redis。

我将使用以下命令从从服务器连接到主服务器进行确认。

$ redis-cli -h 192.168.4.10
192.168.4.10:6379>

奴隶确认侧面的INFO时,

$ redis-cli info Replication
# Replication
role:slave
master_host:192.168.4.10
master_port:6379
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_repl_offset:182
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:d862cdb1414b23983c67b8bb1dcd9f171b13b3fd
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:182
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:182

角色是slave,可以看到master端的IP(master_host)。
这样,复制过程就完成了。

确认动作

在设置了主键值之后,

$ redis-cli
127.0.0.1:6379> set test "HELLO, World!!"
OK
127.0.0.1:6379> set test2 "This is test"
OK

我們可以使用 get 函數來確認 slave 是否在旁邊傳播。

$ redis-cli
127.0.0.1:6379> get test
"HELLO, World!!"
127.0.0.1:6379> get test2
"This is test"

我确认成功完成了复制。

附加信息:主人的资料

完成复制设置后,我们将检查主服务器方面的信息。

$ redis-cli info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.4.20,port=6379,state=online,offset=308,lag=0
master_replid:16826abb8a01545df01331b733eb2bc135793d45
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:308
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:308

确认了主控端连接了从控端(slave0)。顺便提一下,如果连接了多个从控端至主控端,就会逐渐增加编号,如slave1、slave2…

附录:关键之有效期限

Redis 可以对 key 设置有效期限(EXPIRE),当期限到达时会自动删除。

通常情况下,Redis键是不会设定过期时间的。除非用户明确地使用DEL命令将其删除,否则该键将永远存在。

通过使用EXPIRE命令系列,可以将过期时间关联到特定的键上,但这会增加键所使用的额外内存。当键设置了过期时间时,Redis会确保在指定的时间过去后删除该键。

过期 – Redis

127.0.0.1:6379> set test "hoge"     # test key に hoge を set
OK
127.0.0.1:6379> expire test 10     # expire を 10sec に指定
(integer) 1
127.0.0.1:6379> get test     # expire が到来していないので、 get可能。
"hoge"
127.0.0.1:6379> ttl test     # ttl コマンドで残りの秒数を確認可能
(integer) 4
127.0.0.1:6379> ttl test
(integer) 1
127.0.0.1:6379> ttl test     # expire で設定した時間が経過すると -2 がかえる。
(integer) -2
127.0.0.1:6379> get test     # 削除されたので、 nil がかえる。
(nil)

请参考

非常感谢您提供的参考网站。非常感谢。

GitHub (GitHub)
Redis介绍 – Redis官方网站
配置文件 – Redis 2.0.3文档
Redis – 维基百科
Redis学习材料(2015/06更新)
构建和使用Redis集群(Redis 3.0.0) | ALBERT官方博客
Redis持久化 – Redis文档(日语翻译)
在自动伸缩环境中使用redis需要注意超时设置 – まめ畑

bannerAds