【初级】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需要注意超时设置 – まめ畑