基本使用


安装和下载redis:https://redis.io/download

redis-cli 交互式的使用:

redis-cli -h 127.0.0.1 -p 6379

redis-cli 命令行方式:

redis-cli -h 127.0.0.1 -p 6379 get hello

停止Redis服务:关闭前会自动将数据进行持久化。

redis-cli -h 127.0.0.1 -p 6379 shutdown

可以选择是否在关闭前进行持久化:

redis-cli shutdown nosave|save


单机配置


源码包下有默认的 redis.conf 文件,可使用 sed 命令进行简化。

sed '/^#/d' redis.conf | sed '/^$/d' > redis-6379.conf

默认配置文件:

bind 127.0.0.1   # 绑定的IP
protected-mode yes  
port 6379  # 默认端口
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes  # 要改成yes,表示后台启动
supervised no
pidfile /var/run/redis_6379.pid  # pid文件,端口不一样文件不一样
loglevel notice
logfile ""  #日志文件位置
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./   # 数据保存目录
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes


主从复制


        准备两个节点,第一个节点创建好数据目录后启动即可,第二个节点也就是从节点在配置文件中添加 slaveof ip port 这项后启动即可,这个ip和端口指的就是主节点的IP和端口。启动好后使用 redis-cli 客户端分别登陆各自的 redis 然后运行info replication 命令即可看到对应的 master 和 slave 的信息。

启动master:

redis-server redis-6379.conf

启动slave:

        在单机配置中加入 slaveof 192.168.1.119 6379 这项。

echo 'slaveof 192.168.1.119 6379' > redis-6379.conf

主节点:

redis-cli -h 192.168.1.119 -p 6379
192.168.1.119:6379> info replication
role:master
...
192.168.1.119:6379> set name hello
OK

从节点:

redis-cli -h 192.168.1.119 -p 6379
192.168.1.119:6379> info replication
role:slave
...
192.168.1.120:6379> get name
"hello"

断开复制:在从节点上执行 slaveof no one 命令可断开与主节点的复制,断开之后从节点自动升为主节点。当前从节点的数据不会被删除。

192.168.1.120:6379> slaveof no one
OK

可以在命令行中重新执行复制命令:这时又会变为从节点。

注意:会删除当前从节点的所有数据。

192.168.1.120:6379> slaveof 192.168.1.119 6379
OK
192.168.1.120:6379> info replication
role:slave


集群配置


        redis集群一般有6个节点,三个节点做主节点,然后各有一个从节点来做故障转移。

在单机版的配置文件中加入下面几项:

# 开启集群模式
cluster-enabled yes
# 节点超时时间, 单位毫秒
cluster-node-timeout 15000
# 集群内部配置文件
cluster-config-file "nodes-6379.conf" #这个文件是redis自己维护的

        集群配置中 cluster-config-file 这个配置项用来指定集群配置文件,这个文件是redis自己维护的,不要修改。每个节点对应一个这样的文件。

启动各个redis:

redis-server 6379/conf/redis-6379.conf
redis-server 6380/conf/redis-6380.conf
redis-server 6381/conf/redis-6381.conf
redis-server 6382/conf/redis-6382.conf
redis-server 6383/conf/redis-6383.conf
redis-server 6384/conf/redis-6384.conf

节点握手:

在集群任意节点上执行 cluster meet 命令即可。

192.168.1.119:6379> cluster meet 192.168.1.119 6380
192.168.1.119:6379> cluster meet 192.168.1.119 6381
192.168.1.119:6379> cluster meet 192.168.1.119 6382
192.168.1.119:6379> cluster meet 192.168.1.120 6382
192.168.1.119:6379> cluster meet 192.168.1.120 6383
192.168.1.119:6379> cluster meet 192.168.1.120 6384

集群状态:

        添加完成后在任意一个节点上执行 cluster nodes 即可看到集群状态:

> cluster nodes

查看集群当前状态:

> cluster info
cluster_state:fail
cluster_slots_assigned:0

此时 cluster_slots_assigned:0 还不可写,因为没有分配槽点。

分配槽点:

redis-cli -h 192.168.1.119 -p 6379 cluster addslots {0..5461}  # 两个点
redis-cli -h 192.168.1.119 -p 6380 cluster addslots {5462..10922}
redis-cli -h 192.168.1.119 -p 6381 cluster addslots {10923..16383}

查看集群状态:

        此时的集群状态是ok的,说明已近可写了。

> cluster info
cluster_state:ok
cluster_slots_assigned:16384

查看节点状态:

        这时可以从下面的信息中看到槽点的分配状况,输出的信息中每行的第一个字段为这个节点的NodeID。

192.168.1.119:6380> cluster  nodes
5b231bee2de01fbbea32087ae0db22b46a3a44ac 192.168.1.120:6382@16382 master - 0 1543677508000 3 connected
7724c6470fe07cf4c905afce5098d78cd8e1290a 192.168.1.119:6381@16381 master - 0 1543677508932 5 connected 10923-16383
4a71503b6dd73e595864b4ff80251303f0456a14 192.168.1.119:6380@16380 myself,master - 0 1543677507000 2 connected 5462-10922
1343d82cc5144654553d9e92b3226463caf6acba 192.168.1.119:6379@16379 master - 0 1543677506928 1 connected 0-5461
e06fba968ddd6f161a86473fe3a01eaa1d5225e4 192.168.1.120:6384@16384 master - 0 1543677507931 0 connected
1c93ff599b16a385d87b1564fb4f1061c439c9b1 192.168.1.120:6383@16383 master - 0 1543677504000 4 connected

设置从节点:

        此时还有三个节点是用来作为从节点的,使用 cluster replicate NodeID 即可将某个节点设置为从节点,这里的 NodeID 是要设置为那个节点的从节点。这个这个值可以使用 cluster nodes 查看到。

redis-cli -h 192.168.1.120 -p 6382 cluster replicate 1343d82cc5144654553d9e92b3226463caf6acba
redis-cli -h 192.168.1.120 -p 6383 cluster replicate 4a71503b6dd73e595864b4ff80251303f0456a14
redis-cli -h 192.168.1.120 -p 6384 cluster replicate 7724c6470fe07cf4c905afce5098d78cd8e1290a

此时使用 cluster nodes 可以看到集群状态的详细信息。

redis集群读写:

        在redis集群上读写时应使用 -c 选项,redis-cli -c ,可自动重定向,因为redis上读写要根据对应的槽点来进行,如果当前操作的数据不在当前的节点对应的槽点上则会返回重定向命令,-c 命令用来自动重定向并执行请求。

192.168.1.119:6380> get hello
-> Redirected to slot [866] located at 192.168.1.119:6379
"world"


集群扩展


        Redis集群使用一致性hash算法将数据分布在16384个槽点上,扩展集群要对原有的槽点和槽点上的数据进行迁移,先迁移数据再迁移槽点。在迁移槽点上的数据时是将槽点上的数据按照一个一个key进行迁移的。比如说要对槽点0从节点A迁移到节点B,先要将槽点0上存储的所有key一个一个迁移到B上的0号槽点,然后再将槽点0迁移到B上。

大致步骤为:

# 迁移槽点
cluster setslot 0 migrating 1343d82cc5144654553d9e92b3226463caf6acba
cluster setslot 0 importing 5b231bee2de01fbbea32087ae0db22b46a3a44ac
# 获取键名
cluster getkeysinslot 0 100  # 这个100是key的数量,可使用 CLUSTER COUNTKEYSINSLOT 0 来获取
# 逐个移动键
migrate 192.168.1.119 6380 hello 0 9999 replace
# 迁移完成,如果这个槽点没有数据的话直接使用下面命令即可迁移成功。
cluster setslot 0 node 5b231bee2de01fbbea32087ae0db22b46a3a44ac

实际部署中使用的是 redis-trib.rb 工具来实现。