目录
1.2 主从部署( Master-Slave Replication)
一. Redis 安装
本教程将演示在 linux 环境下安装 Redis7, 给⼤家最简单, 最快捷的安装⽅式, 其中包括单机部署 、主从部署 、哨兵部署 、集群 部署的安装以及相应的架构介绍。
1.1. 单机部署
1.1.1. 检查安装 gcc 环境
Redis是由C语⾔编写的, 它的运⾏需要C环境, 因此我们需要先安装gcc。
-- 关闭防⽕墙
systemctl stop firewalld.service
-- 状态
firewall-cmd --state
-- 卸载防⽕墙
yum remove firewalld
-- 检查版本
gcc --version
-- 安装 gcc
yum install gcc
1.1.2. 下载安装 Redis
-- 安装应⽤养成良好习惯, ⽂件归类
mkdir -p /opt/software/redis
-- 进⼊redis⽂件夹, 使⽤wget下载
cd /opt/software/redis
wget https://download.redis.io/redis-stable.tar.g z
-- 解压下载的redis包
tar -xzf redis-stable.tar.gz
-- 进⼊redis-stable⽬录, 然后使⽤make install 编译并安 装, 安装完成后 /usr/local/bin 会⽣成相应的服务
cd redis-stable
make install
-- 检查是否成功⽣成
ll /usr/local/bin
1.1.3. 启动 Redis
到这⾥其实我们可以在使⽤ /opt/software/redis/redis-stable/src
或者 /usr/local/bin ⽬录下的 redis-server 启动 Redis 服务了。
Redis 源码路径下启动
./src/redis-server
使⽤us r/local/bin 路径下启动( 该⽬录下)
redis-server
1.1.4. 配置Redis
前⾯的启动⽅式⽆法再后台运⾏, 退出之后直接关闭了 Redis 服 务, 所以我们还需要针对 Redis 做—些设置。
-- 修改当前Redis⽬录下的 Reids.conf ⽂件
vim redis.conf
bind * -::* #87⾏, 修改bind 项, * -::* ⽀持远程连接
daemonize yes #309⾏, 开启守护进程, 后台运⾏
logfile /opt/software/redis/redis-stable/redis.lo g #355⾏, 指定⽇志⽂件⽬录
dir /opt/software/redis #510⾏, 指定⼯作⽬录
requirepass 1qaz@WSX #1044⾏, 给默认⽤户设置密码, 主要是使⽤ redis-cli
连接 redis-server 时, 需要通过密码校验 。 ⾃⾏学习, 可以不设置。
protected-mode no #111⾏, 允许远程连接 如果不设置密码必须讲此设置关闭。
修改完成后, 使⽤配置⽂件启动 Redis, 并使⽤ redis-cli 连接测试, 需要注意由于前⾯我们配置了安全密码, 所以连接后需要先验证密码, 否则会报错。
redis-server redis.conf
redis-cli
auth 1qaz@WSX

1.1.5. 退出 OR 关闭 redis
-- 退出
redis quit
-- 关闭redis
redis-cli shutdown
1.2 主从部署( Master-Slave Replication)

主从复制, 是指将—台Redis服务器的数据, 复制到其他的Redis 服务器 。前者称为主节点(Master), 后者称为从节点(Slave);数 据的复制是单向的, 只能由主节点到从节点 。默认情况下, 每台 Redis服务器都是主节点;且—个主节点可以有多个从节点(或没 有从节点), 但—个从节点只能有—个主节点。
1.2.1. 主从复制的作⽤
a) 数据冗余: 主从复制实现了数据的热备份, 是持久化之外的— 种数据冗余⽅式。
b) 故障恢复: 当主节点出现问题时, 可以由从节点提供服务, 实现快速的故障恢复; 实际上是—种服务的冗余。
c) 负载均衡:在主从复制的基础上, 配合读写分离, 可以由主节点提供写服务, 由从节点提供读服务( 即写Redis数据时应⽤连接主节点, 读Redis数据时应⽤连接从节点), 分担服务器负载;尤其是在写少读多的场景下, 通过多个从节点分担读负载, 可以⼤ ⼤提⾼Redis服务器的并发量。
d) ⾼可⽤基⽯: 除了上述作⽤以外, 主从复制还是哨兵和集群能够实施的基础, 因此说主从复制是Redis⾼可⽤的基础。
1.2.2. 主从复制部署
整体架构图

主节点不需要做任何改变, 从节点都需要修改配置加上主节点信 息, 配置完成后, 可以再主库检查从节点信息.

# 添加主节点信息
replicaof 192.168.75.129 6379

1.2.3. 主从复制缺点
● 复制延时, 信号衰减
由于所有的写操作都是现在master上操作, 然后同步更新 到slave上, 所以从master同步到slave机器上有—定的延迟,当系统很繁忙的时候, 延迟问题会更加严重, slave机器数量的增加也会使这个问题更加严重。
● master挂了如何办?
默认情况下,不会在slave节点中⾃动重选—个master, 每次都要⼈⼯⼲预。
-
选择从节点:查看从节点的复制状态和偏移量,选择数据最新的从节点
redis-cli info replication -
执行切换:
redis-cli SLAVEOF NO ONE -
调整其他从节点:让其他从节点复制新的主节点
redis-cli SLAVEOF <new-master-ip> <new-master-port> -
更新客户端配置:修改客户端连接配置指向新主节点
1.3. 哨兵部署(Sentinel)
Redis的主从复制主要⽤于实现数据的冗余备份和读分担, 并不是为了提供⾼可⽤性 。因此在系统⾼可⽤⽅⾯, 单纯的主从架构⽆ 法很好的保证整个系统⾼可⽤
1.3.1. 哨兵模式的原理
Redis哨兵模式是通过在独⽴的哨兵节点上运⾏特定的哨兵进程来实现的 。这些哨兵进程监控主从节点的状态, 并在发现故障时⾃动完成故障发现和转移, 并通知应⽤⽅, 实现⾼可⽤性。

1.3.2. 哨兵
在启动时, 每个哨兵节点会执⾏选举过程, 其中—个哨兵节点被选为领导者( leader), 负责协调其他哨兵节点。
● 选举过程:
每个在线的哨兵节点都可以成为领导者, 每个哨兵节点会向其它 哨兵发is-master-down-by-addr命令, 征求判断并要求将⾃⼰设置为领导者;当其它哨兵收到此命令时, 可以同意或者拒绝它成为领导者; 如果哨兵发现⾃⼰在选举的票数⼤于等于num(sentinels)/2+1 时, 将成为领导者, 如果没有超过, 继续选举。
● 监控主从节点:
哨兵节点通过发送命令周期性地检查主从节点的健康状态, 包括主节点是否在线 、从节点是否同步等 。如果哨兵节点发现主节点不可⽤ , 它会触发—次故障转移。
● 故障转移:
—旦主节点被判定为不可⽤ , 哨兵节点会执⾏故障转移操作 。它会从当前的从节点中选出—个新的主节点, 并将其他 从节点切换到新的主节点 。这样, 系统可以继续提供服务⽽⽆需⼈⼯介⼊ 。
● 故障转移过程:
由Sentinel节点定期监控发现主节点是否出现了故障:
sentinel会向master发送⼼跳PING来确认master是否存活, 如果master在 “—定时间范围” 内不回应PONG 或者是回复了—个错误消息, 那么这个sentinel会主观地(单⽅⾯地)认为这master已经不可⽤了。
● 确认主节点:
○ 过滤掉不健康的(下线或断线), 没有回复过哨兵ping响应的从节点
○ 选择从节点优先级最⾼的
○ 选择复制偏移量最⼤, 此指复制最完整的从节点
○ 当主节点出现故障, 由领导者负责处理主节点的故障转移。
● 客户端重定向:
哨兵节点会通知客户端新的主节点的位置, 使其能够与新的主节点建⽴连接并发送请求 。这确保了客户端可以⽆缝切换到新的主节点, 继续进⾏操作。此外, 哨兵节点还负责监控从节点的状态 。如果从节点出现故障, 哨兵节点可以将其下线, 并在从节点恢复正常后重新将其加⼊集群。
1.3.3. 客观下线
当主观下线的节点是主节点时, 此时该哨兵3节点会通过指令sentinel is-masterdown-by-addr寻求其它哨兵节点对主节点的 判断, 当超过quorum( 选举)个数, 此时哨兵节点则认为该主节点确实有问题, 这样就客观下线了, ⼤部分哨兵节点都同意下线 操作, 也就说是客观下线。
1.3.4. 哨兵模式部署
整体架构图

3 个机器都需要修改 sentinel.conf 配置, 配置完成之后先从主节点开始启动哨兵。
protected-mode no #6⾏, 关闭保护模式
daemonize yes #15⾏, 指定sentinel为后台启动
logfile /opt/software/redis/redis-stable/sentin el.log #34⾏, 指定⽇志存放路径
dir /opt/software/redis #73⾏, 指定数据库存放路径
sentinel monitor mymaster 192.168.75.129 6379 2 #93⾏, 修改 指定该哨兵节点监控 #20.0.0.20:6379这个主 节点, 该主节点的名称是mymaster, 最后的2的含义与主节点的 故障判定有关:⾄少需要2个哨兵节点同意, 才能判定主节点故障并进⾏故障转移
sentinel down-after-milliseconds mymaster 30000 #134⾏, 判定服务器down掉的时间周期, 默认30000毫秒 (30秒)
sentinel failover-timeout mymaster 180000 #234⾏, 故障节点的最⼤超时时间为180000( 180秒)
启动后检查哨兵状态:
redis-cli -p 26379 info sentinel
故障模拟
-- 可以杀掉主节点的进程, 也可以直接停掉主节点服务
ps aux | grep redis
redis-cli shutdown
-- 观察哨兵⽇志, 129 主节点下线, 重新选举131为主节点
tail -f sentinel.log
--重新启动 129 服务 并观察⽇志, 129加⼊主从, 此时主节点为 131服务
redis-server redis.conf tail -f sentinel.log
redis-cli -p 26379 info sentinel
-- 观察哨兵⽇志
tail -f sentinel.log
-- 停⽌哨兵
redis-cli -p 26379 shutdown



-- 切换到131服务, 已经为主节点。
redis-cli info replication

当触发了哨兵选举之后, 会再后台更改 redis.conf 与 sentinel.conf, 可以检查每台机器的⽂件末尾的数据
cat redis.conf
cat sentinel.conf


1.3.5. 哨兵使⽤建议
● 哨兵节点的数量应为多个, 哨兵本身应该集群, 保证⾼可⽤
● 哨兵节点数应该是奇数
● 各个哨兵结点的配置应—致
● 如果哨兵节点部署在Docker等容器⾥⾯, 尤其要注意端⼝号的正确映射
1.3.6. 哨兵模式:并不能保证数据零丢失
1. 复制延迟:
○ 在主从复制中, 从节点的数据是异步复制⾃主节点的 。这意味着在主节点故障时, 从节点可能还没有完全同步最新的数 据, 从⽽导致数据丢失。
2. 故障检测和转移时间:
○ Sentinel 检测到主节点故障并执⾏故障转移需要—定的时间 。在这段时间内, 主节点可能已经接收了—些写操作, 但 这些操作尚未被复制到从节点。
3. ⽹络分区:
○ 在发⽣⽹络分区( ⽹络分裂) 的情况下, —部分节点可能与 主节点失去联系 。如果此时主节点继续处理写操作, 那么在⽹络恢复之前, 这些操作可能不会被复制到从节点。
4. 多个从节点同时故障:
○ 如果所有的从节点同时故障或在故障转移之前与主节点失联, 那么在主节点故障时, 将没有可⽤的从节点来提升为主 节点。
1.4. 集群部署(Cluster)
Redis 集群是 Redis 的—种分布式运⾏模式, 它通过分⽚(sharding) 来提供数据的⾃动分区和管理, 从⽽实现数据的⾼可⽤性和可扩展性。
在集群模式下, 数据被分割成多个部分(称为槽或slots), 分布在多个 Redis 节点上。
集群中的节点分为主节点和从节点:主节点负责读写请求和集群信息的维护;从节点只进⾏主节点数据和状态信息的复制。
1.4.1. Redis集群的作⽤
数据分区:数据分区(或称数据分⽚)是集群最核⼼的功能 。 集群将数据分散到多个节点, —⽅⾯突破了Redis单机内存⼤⼩的限制, 存储容量⼤⼤增加;
另—⽅⾯每个主节点都可以对外提供读服务和写服务, ⼤⼤提⾼了集群的响应能⼒ 。 Redis单机内存⼤⼩受限问题, 在介绍持久化和主从复制时都有提及;
例如, 如果单机内存太⼤, bgsave和bgrewriteaof的fork操作可 能导致主进程阻塞, 主从环境下主机切换时可能导致从节点⻓时 间⽆法提供服务, 全量复制阶段主节点的复制缓冲区可能溢出。
⾼可⽤: 集群⽀持主从复制和主节点的⾃动故障转移(与哨兵类似); 当任—节点发⽣故时, 集群仍然可以对外提供服务。
1.4.2. Redis集群的数据分⽚
Redis集群引⼊了哈希槽的概念 Redis集群有16384个哈希槽(编号0-16383) 集群的每个节点负责—部分哈希槽 每个Key通过 CRC16校验后对16384取余来决定放置哪个哈希槽,
通过这个值, 去找到对应的插槽所对应的节点, 然后直接⾃动跳转到这个对应的节点上进⾏存取操作
● 以3个节点组成的集群为例: 节点A包含0到5460号哈希槽节点B包含5461到10922号哈希槽 节点C包含10923到16383号哈 希槽
● Redis集群的主从复制模型 集群中具有A 、B 、C三个节点, 如 果节点B失败了, 整个集群就会因缺少5461-10922这个范围的 槽⽽不可以⽤ 。
为每个节点添加—个从节点A1 、B1 、C1整个集群便有三个Master 节点和三个slave节点组成, 在节点B失败后, 集群选举B1位为的 主节点继续服务 。当B和B1都失败后, 集群将不可⽤
1.4.3. Reids 集群部署

1.4.3.1. redis 环境简述
Redis Cluster被配置为三主三从模式 。这意味着每台服务器上的 两个Redis节点中, —个节点作为主库( master), 另—个作为从库(slave) 。
1.4.3.2. redis 集群配置准备
-- 创建集群配置⽂件夹, 将下⾯的配置复制过去, 另外两个机器重 复这个过程
mkdir -p /opt/software/redis/redis-stable/cluster
mkdir -p /opt/software/redis/cluster
vim ./cluster/redis_6379.conf
vim ./cluster/redis_6380.conf
-- 配置⽂件准备完成之后, 启动所有redis服务, ⽤cluster配 置⽂件
redis-server ./cluster/redis_6379.conf
redis-server ./cluster/redis_6380.conf
-- 检查服务
ps aux | grep redis
-- 创建三主三从集群模式, 每—个主节点带—个从节点
redis-cli --cluster create --cluster-replicas
192.168.75.129:6379 192.168.75.129:6380
192.168.75.131:6379 192.168.75.131:6380
192.168.75.132:6379 192.168.75.132:6380
-- 查看集群信息
redis-cli cluster info
-- 查看单个节点信息
redis-cli info replication
-- 查看集群节点身份信息
redis-cli cluster nodes
-- 停⽌redis服务
redis-cli -p 6379 shutdown
redis-cli -p 6380 shutdown
6379配置
# 允许所有的IP地址
bind * -::*
# 后台运⾏
daemonize yes
# 允许远程连接
protected-mode no
# 开启集群模式
cluster-enabled yes
# 集群节点超时时间
cluster-node-timeout 5000
# 配置数据存储⽬录
dir "/opt/software/redis/cluster"
# 开启AOF持久化
appendonly yes
# 端⼝
port 6379
# log⽇志
logfile "/opt/software/redis/redis-stable/cluste
r/redis6379.log"
# 集群配置⽂件
cluster-config-file nodes-6379.conf
# AOF⽂件名
appendfilename "appendonly6379.aof"
# RBD⽂件名
dbfilename "dump6379.rdb"
6380配置
# 允许所有的IP地址
bind * -::*
# 后台运⾏
daemonize yes
# 允许远程连接
protected-mode no
# 开启集群模式
cluster-enabled yes
# 集群节点超时时间
cluster-node-timeout 5000
# 配置数据存储⽬录
dir "/opt/software/redis/cluster"
# 开启AOF持久化
appendonly yes
# 端⼝
port 6380
# log⽇志
logfile "/opt/software/redis/redis-stable/cluste
r/redis6380.log"
# 集群配置⽂件
cluster-config-file nodes-6380.conf
# AOF⽂件名
appendfilename "appendonly6380.aof"
# RBD⽂件名
dbfilename "dump6380.rdb"


1.4.3.3. Redis 集群数据读写
-- 连接—个主节点进⾏写数据
redis-cli info replication
-- 直接连接读写可能会出现以下问题, 是因为不同的节点的槽位不 同, 图中就是提示我们去132:6379进⾏写⼊数据

-- 不过我们也可以开启路由规则 -c, 进⾏处理
redis-cli -c
-- 重新写⼊数据, 恢复正常。
set k1 b1

1.4.3.4. 模拟故障转移
-- 注意机器ip的区分
-- 将129机器的主节点给⼲掉(129的6379服务)
redis-cli -p 6379 shutdown
-- 查看129机器从节点⼯作⽇志(131的6380⽇志)
cat redis6380.log
-- 在切换到132机器上查看当前集群节点信息, 131:6380已经升 为主节点
redis-cli cluster nodes


-- 在重新启动129.6379服务
redis-server ./cluster/redis_6379.conf
-- 查看129.6379的节点信息, 主节点变为从节点
redis-cli -p 6379 info replication
-- 观察131.6380⽇志, 129.6379 重新加⼊集群


2. 完整的⽂件⽬录与配置⽂件与使⽤过程中的命令
2.1. ⽂件⽬录
⼿⼯创建
/opt/software/redis/ -- Redis应⽤
/opt/software/redis/redis-stable -- Redis应⽤根⽬录
/opt/software/redis/cluster -- Redis集群应⽤⽂件⽬录(⽇志, 快照等信息)
/opt/software/redis/redis-stable/cluster -- Redi s集群配置⽂件存放路径

2.2. 配置⽂件
2.2.1. 单机Redis配置⽂件
所在⽬录:/opt/software/redis/redis-stable
6379配置
bind * -::*
protected-mode no port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /opt/software/redis/redis-stable/redis.log
databases 16
always-show-logo no set-proc-title yes
proc-title-template "{title} {listen-addr} {serve r-mode}"
locale-collate ""
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb rdb-del-sync-files no
dir /opt/software/redis
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync yes
repl-diskless-sync-delay 5
repl-diskless-sync-max-replicas 0
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
appendonly no
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
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
aof-timestamp-enabled no
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-listpack-entries 512
hash-max-listpack-value 64
list-max-listpack-size -2
list-compress-depth 0
set-max-intset-entries 512
set-max-listpack-entries 128
set-max-listpack-value 64
zset-max-listpack-entries 128
zset-max-listpack-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
jemalloc-bg-thread yes
2.2.2. 主从节点配置
所在⽬录:/opt/software/redis/redis-stable
⼤家可以将不同服务器的端⼝设置不同的值, 以⽅便区分。
129.6379配置-主节点
与单机主节点配置—样
131.6379配置-从节点
bind * -::*
protected-mode no port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /opt/software/redis/redis-stable/redis.lo
g
databases 16
always-show-logo no set-proc-title yes
proc-title-template "{title} {listen-addr} {serve r-mode}"
locale-collate ""
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb rdb-del-sync-files no
dir /opt/software/redis
replicaof 192.168.75.129 6379
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync yes
repl-diskless-sync-delay 5
repl-diskless-sync-max-replicas 0
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
appendonly no
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
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
aof-timestamp-enabled no
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-listpack-entries 512
hash-max-listpack-value 64
list-max-listpack-size -2
list-compress-depth 0
set-max-intset-entries 512
set-max-listpack-entries 128
set-max-listpack-value 64
zset-max-listpack-entries 128
zset-max-listpack-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
jemalloc-bg-thread yes
132.6379配置-从节点
同131.6379配置—样
2.2.3. 哨兵模式
所在⽬录:/opt/software/redis/redis-stable
主从配置⽆需修改, 直接配置 sentinel ⽂件, 3 个机器配置相同
26379
protected-mode no port 26379
daemonize yes
pidfile /var/run/redis-sentinel.pid
loglevel notice
logfile /opt/software/redis/redis-stable/sentine
l.log
dir /opt/software/redis
sentinel monitor mymaster 192.168.75.129 6379 2 sentinel down-after-milliseconds mymaster 30000 acllog-max-len 128
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes SENTINEL resolve-hostnames no
SENTINEL announce-hostnames no
SENTINEL master-reboot-down-after-period mymaste r 0
2.2.4. 集群
所在⽬录:/opt/software/redis/redis-stable/cluster 3 个机器配置相同
6379
# 允许所有的IP地址
bind * -::*
# 后台运⾏
daemonize yes
# 允许远程连接
protected-mode no
# 开启集群模式
cluster-enabled yes
# 集群节点超时时间
cluster-node-timeout 5000
# 配置数据存储⽬录
dir "/opt/software/redis/cluster"
# 开启AOF持久化
appendonly yes
# 端⼝
port 6379
# log⽇志
logfile "/opt/software/redis/redis-stable/cluste
r/redis6379.log"
# 集群配置⽂件
cluster-config-file nodes-6379.conf
# AOF⽂件名
appendfilename "appendonly6379.aof"
# RBD⽂件名
dbfilename "dump6379.rdb"
6380
# 允许所有的IP地址
bind * -::*
# 后台运⾏
daemonize yes
# 允许远程连接
protected-mode no
# 开启集群模式
cluster-enabled yes
# 集群节点超时时间
cluster-node-timeout 5000
# 配置数据存储⽬录
dir "/opt/software/redis/cluster"
# 开启AOF持久化
appendonly yes
# 端⼝
port 6380
# log⽇志
logfile "/opt/software/redis/redis-stable/cluste
r/redis6380.log"
# 集群配置⽂件
cluster-config-file nodes-6380.conf
# AOF⽂件名
appendfilename "appendonly6380.aof"
# RBD⽂件名
dbfilename "dump6380.rdb"
2.2.5. 命令
命令汇总
----------------------------------- Redis基础常见命 令 ------------------------------------
keys *:查看当前库所有的key
exists key:判断某个key是否存在
type key:查看key值是什么类型
del key:删除指定的key数据
unlink key:⾮阻塞删除, 仅仅将keys从keyspace元数据中删 除, 真正的删除会在后续异步中操作
ttl key:查看还有多少秒过期, -1表示永不过期, -2表示已过期
expire key:秒钟, 为给定的key设置过期时间
- move key dbindex[0-15]:将当前数据库的key移动到给定的 数据库db当中
select dbindex:切换数据库[0-15], 默认值为0 dbsize:查看当前数据库key的数量
flushdb:清空当前库
flusshall:通杀全部库
----------------------------------- 完整的操作命令 ----------------------------------------
-- 关闭防⽕墙
systemctl stop firewalld.service -- 状态
firewall-cmd --state -- 卸载防⽕墙
yum remove firewalld
-------------------------- 单机部署 ---------------
-----------
-- 检查版本
gcc --version
-- 安装 gcc
yum install gcc
-- 安装应⽤养成良好习惯, ⽂件归类 mkdir -p /opt/software/redis
-- 进⼊redis⽂件夹, 使⽤wget下载 cd /opt/software/redis
wget https://download.redis.io/redis-stable.tar.g z
-- 解压下载的redis包
tar -xzf redis-stable.tar.gz
-- 进⼊redis-stable⽬录, 然后使⽤make install 编译并安 装, 安装完成后 /usr/local/bin 会⽣成相应的服务
cd redis-stable
make install
-- 检查是否成功⽣成 ll /usr/local/bin
Redis 源码路径下启动 ./src/redis-server
使⽤us r/local/bin 路径下启动( 该⽬录下) redis-server
-- 修改当前Redis⽬录下的 Reids.conf ⽂件 vim redis.conf
- 启动Redis,使⽤密码认证登录 redis-server redis.conf
redis-cli -a 1qaz@WSX
-- 退出redis quit
-- 关闭redis
redis-cli shutdown
-------------------------- 主从部署 ---------------
-----------
-- 主节点查看从节点信息 info Replication
-------------------------- 哨兵部署 ---------------
-----------
-- 可以杀掉主节点的进程, 也可以直接停掉主节点服务 ps aux | grep redis
redis-cli shutdown
-- 观察哨兵⽇志, 129 主节点下线, 重新选举131为主节点 tail -f sentinel.log
--重新启动 129 服务 并观察⽇志, 129加⼊主从, 此时主节点为 131服务
redis-server redis.conf
tail -f sentinel.log
redis-cli -p 26379 info sentinel
-- 观察哨兵⽇志
tail -f sentinel.log
-- 停⽌哨兵
redis-cli -p 26379 shutdown
-- 切换到131服务, 已经为主节点。 redis-cli info replication
-- 查看⽂件内容
cat redis.conf
cat sentinel.conf
-------------------------- 集群部署 ---------------
-----------
-- 创建集群配置⽂件夹, 将下⾯的配置复制过去, 另外两个机器重 复这个过程
mkdir -p /opt/software/redis/redis-stable/cluster
mkdir -p /opt/software/redis/cluster
vim ./cluster/redis_6379.conf
vim ./cluster/redis_6380.conf
-- 配置⽂件准备完成之后, 启动所有redis服务, ⽤cluster配 置⽂件
redis-server ./cluster/redis_6379.conf
redis-server ./cluster/redis_6380.conf
-- 检查服务
ps aux | grep redis
-- 创建三主三从集群模式, 每—个主节点带—个从节点
redis-cli --cluster create --cluster-replicas 1 1
92.168.75.129:6379 192.168.75.129:6380 192.168.7
5.131:6379 192.168.75.131:6380 192.168.75.132:637
9 192.168.75.132:6380
-- 查看集群信息
redis-cli cluster info
-- 查看单个节点信息
redis-cli info replication
-- 查看集群节点身份信息
redis-cli cluster nodes
-- 停⽌redis服务
redis-cli -p 6379 shutdown
redis-cli -p 6380 shutdown
-- 连接—个主节点进⾏写数据
redis-cli info replication
-- 注意机器ip的区分
-- 将129机器的主节点给⼲掉(129的6379服务) redis-cli -p 6379 shutdown
-- 查看129机器从节点⼯作⽇志(131的6380⽇志)
cat redis6380.log
-- 在切换到132机器上查看当前集群节点信息, 131:6380已经升 为主节点
redis-cli cluster nodes
-- 在重新启动129.6379服务
redis-server ./cluster/redis_6379.conf -- 查看129.6379的节点信息, 主节点变为从节点 redis-cli -p 6379 info replication
-- 观察131.6380⽇志, 129.6379 重新加⼊集群
三、Redis7核心数据结构
Red is7核心数据结构
3.1Redis7有那些数据结构?
核心板(core)
Bitmap 、Cluster management 、Connection management 、Generic 、Geospatial indices 、Hash 、HyperLogLog 、List 、Pub/Sub 、Scripting and functions 、Server managment Set、Sorted set 、Stream 、String 、Transactions
扩展版
Stack
Bloom filter、Cuckoo filter、Count-min sketch、JSON、Search and query、Auto-suggest、
T-digest、Time series、Top-k


3.1.1 String 结构

3.1.1.1 字符串常用操作
• 字符串常用操作
SET key value //存入字符串键值对
MSET key value [key value ...] //批量存储字符串键值对
SETNX key value //存入一个不存在的字符串键值对
GET key //获取一个字符串键值
MGET key [key ...] //批量获取字符串键值
DEL key [key ...] //删除一个键
EXPIRE key seconds //设置一个键的过期时间(秒)
• 原子加减
INCR key //将key中储存的数字值加1
DECR key //将key中储存的数字值减1
INCRBY key increment //将key所储存的值加上increment
DECRBY key decrement //将key所储存的值减去decrement
3.1.1.2 String常见应用场景
• 单值缓存
SET key value APPEND key value
• 对象缓存
1) set user:1 '{"name":"roy","balance":1888}'
2) MSET user:1:name roy user:1:balance 1888
MGET user:1:name user:1:balance
• 分布式锁
SETNX product:10001 true //返回1代表获取锁成功
SETNX product:10001 true //返回0代表获取锁失败
。 。 。 执行业务操作
DEL product:10001 //执行完业务释放锁
SET product:10001 true ex 10 nx //防止程序意外终止导致死锁
3.1.2 Hash结构

3.1.2.1 Hash常用操作
• Hash常用操作
HSET key field value //存储一个哈希表key的键值
HSETNX key field value //存储一个不存在的哈希表key的键值
HMSET key field value [field value ...] //在一个哈希表key中存储多个键值对
HGET key field //获取哈希表key对应的field键值
HMGET key field [field ...] //批量获取哈希表key中多个field键值
HDEL key field [field ...] //删除哈希表key中的field键值
HLEN key //返回哈希表key中field的数量
HGETALL key //返回哈希表key中所有的键值
HINCRBY key field increment //为哈希表key中field键的值加上增量increment
3.1.2.2 Hash常见应用场景
(1)对象缓存
• 对象缓存
HSET user:1 name roy balance 1888
HMGET user:1 name balance 1888
HSET user 1:name roy 1:balance 1888
HMGET user 1:name 1:balance

(2)电商购物车
• 电商购物车
1) 以用户id为key
2) 商品id为field
3) 商品数量为value
• 购物车操作
1) 添加商品-> hset cart:1001 10088 1
2) 增加数量-> hincrby cart:1001 10088 1
3) 商品总数-> hlen cart:1001
4) 删除商品-> hdel cart:1001 10088
5) 获取购物车所有商品-> hgetall cart:1001

3.1.2.3 Hash结构优缺点
• 优点
1) 同类数据归类整合储存, 方便数据管理
2) 相比string操作消耗内存与cpu更小
3) 相比string储存更节省空间
• 缺点
1) 过期功能不能使用在field上, 只能用在key上
2) Redis集群架构下不适合大规模使用
3.1.3 List 结构

3.1.3.1 List常用操作
LPUSH key value [value ...] //将一个或多个值value插入到key列表的表头(最左边)
RPUSH key value [value ...] //将一个或多个值value插入到key列表的表尾(最右边)
LPOP key //移除并返回key列表的头元素
RPOP key //移除并返回key列表的尾元素
LRANGE key start stop //返回列表key中指定区间内的元素, 区间以偏移量start和stop指定
BLPOP key [key ...] timeout //从key列表表头弹出一个元素, 若列表中没有元素, 阻塞等待
timeout秒,如果timeout=0,一直阻塞等待
BRPOP key [key ...] timeout //从key列表表尾弹出一个元素, 若列表中没有元素, 阻塞等待
timeout秒,如果timeout=0,一直阻塞等待
3.1.3.2 List类型应用场景
• 常用数据结构
Stack(栈) = LPUSH + LPOP
Queue(队列)= LPUSH + RPOP
Blocking MQ(阻塞队列)= LPUSH + BRPOP
• 常见应用场景
视频列表 、签到列表 排队机
简化版的MQ
3.1.3.3 List类型注意点
1) 一个list的容量是2的32次方减1个元素, 大概40多亿。 但是在应用时, 要注意大key的问题。
2) list的底层是一个双向链表, 对双端的操作性能很高。 但是通过索引下表直接操作某一 个中间节点的性能就会比较低。

3.1.4 Set类型

3.1.4.1 Set常用操作
• Set常用操作
SADD key member [member ...] //往集合key中存入元素, 元素存在则忽略,若key不存在则新建
SREM key member [member ...] //从集合key中删除元素
SMEMBERS key //获取集合key中所有元素
SCARD key //获取集合key的元素个数
SISMEMBER key member //判断member元素是否存在于集合key中
SRANDMEMBER key [count] //从集合key中选出count个元素, 元素不从key中删除
SPOP key [count] //从集合key中选出count个元素, 元素从key中删除
Set运算操作
SINTER key [key ...] //交集运算
SINTERSTORE destination key [key ..] //将交集结果存入新集合destination中
SUNION key [key ..] //并集运算
SUNIONSTORE destination key [key ...] //将并集结果存入新集合destination中
SDIFF key [key ...] //差集运算
SDIFFSTORE destination key [key ...] //将差集结果存入新集合destination中
3.1.4.2 Set应用场景
(1) 微信抽奖小程序
1) 点击参与抽奖加入集合
SADD key {userlD}
2) 查看参与抽奖所有用户
SMEMBERS key
3) 抽取count名中奖者
SRANDMEMBER key [count] / SPOP key [count]
(2)微信微博点赞, 收藏, 标签
1) 点赞
SADD like:{消息ID} {用户ID}
2) 取消点赞
SREM like:{消息ID} {用户ID}
3) 检查用户是否点过赞
SISMEMBER like:{消息ID} {用户ID}
4) 获取点赞的用户列表
SMEMBERS like:{消息ID}
5) 获取点赞用户数
SCARD like:{消息ID}
(3)集合操作
SINTER set1 set2 set3 { c } 共同关注的人
SUNION set1 set2 set3 { a,b,c,d,e } 朋友圈的人
SDIFF set1 set2 set3 { a } 推荐好友
3.1.5 Z Set有序列表类型

3.1.5.1 ZSet常用操作
• ZSet常用操作
ZADD key score member [[score member]…] //往有序集合key中加入带分值元素
ZREM key member [member …] //从有序集合key中删除元素
ZSCORE key member //返回有序集合key中元素member的分值
ZINCRBY key increment member //为有序集合key中元素member的分值加上increment
ZCARD key //返回有序集合key中元素个数
ZRANGE key start stop [WITHSCORES] //正序获取有序集合key从start下标到stop下标的元素
ZREVRANGE key start stop [WITHSCORES] //倒序获取有序集合key从start下标到stop下标的元素
• Zset集合操作
ZUNIONSTORE destkey numkeys key [key ...] //并集计算
ZINTERSTORE destkey numkeys key [key …] //交集计算
3.1.5.2 Z Set应用场景
• Zset集合操作实现排行榜
1) 点击新闻
ZINCRBY hotNews:20190819 1 守护香港
2) 展示当日排行前十
ZREVRANGE hotNews:20190819 0 9 WITHSCORES
3) 七日搜索榜单计算
ZUNIONSTORE hotNews:20190813-20190819 7
hotNews:20190813 hotNews:20190814... hotNews:20190819
4) 展示七日排行前十
ZREVRANGE hotNews:20190813-20190819 0 9 WITHSCORES
3.1.6 Bitmap类型

3.1.6.1 Bitmap常用操作
• Bitmap常用操作
SETBIT key offset value //将一个二进制数组的offset位置设置成value。value只能是0或者1。
GETBIT key offset //返回一个二进制数组的offset位置的值。
BITCOUNT key [start end [BYTE|BIT]] //返回二进制数组中1的个数
BITPOS key bit [start [end [BYTE|BIT]]] //返回bitmap中第一个值为bit的offset位置。
BITOP AND|OR|XOR|NOT destkey key [key ...] //对两个bitmap做二进制的与或非计算。
3.1.6.2 Bitmap应用场景
• 每 日签到
SETBIT dailycheck:1 100 1 1号用户第100天完成了签到
BITCOUNT dailycheck:1 统计1号用户的签到次数
BITPOS dailycheck:1 统计1号用户第一天签到的时间
• 优点
快速、 高效、 节省空间
3.1.7 Hyperloglog类型
3.1.7.1 作用介绍:
用于统计一个集合中不重复的元素个数。
典型应用场景例如根据用户访问记录统计网站的UV。
3.1.7.2 Hyperloglog常用操作
PFADD visitlog 192.168.65.111 192.168.65.112 192.168.65.111 //添加用户访问记录
PFCOUNT visitlog //统计不同的独立访客
3.1.7.3 Hyperloglog其他操作
PFMERGE destkey [sourcekey [sourcekey ...]] //将多个hyperloglong数据整合成一条记录。
3.1.8 Geo类型
3.1.8.1 Geo常用操作
常用操作
GEOADD key [NX|XX] [CH] longitude latitude member [longitude latitude member ...] //添加一个或多个地点
GEOPOS key [member [member ...]] //返回地址的经纬度
GEODIST key member1 member2 [M|KM|FT|MI] //计算两个地点之间的距离
GEORADIUS key longitude latitude radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key|STOREDIST key] //查询某个经纬度地址附近的地点
GEOSEARCH key FROMMEMBER member|FROMLONLAT longitude latitude BYRADIUS radius
M|KM|FT|MI|BYBOX width height M|KM|FT|MI [ASC|DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST] [WITHHASH] //查询某个地点附近的地点
3.1.8.2 Geo应用场景
• 获取经纬度
https://api.map.baidu.com/lbsapi/getpoint/index.html
• 添加商家地址
GEOADD changsha 113.017489 28.200454 火车站
112.96903 28.201195 橘子洲 113.017031 28.199706 赛格广 场 113.017004 28.197677 国储
• 查询距离
GEODIST changsha 火车站 橘子洲 M
• 查找火车站附近的景点
GEORADIUSBYMEMBER changsha 火车站 2 KM withdist withcoord count 4 withhash
3.1.9 stream类型
3.1.9.1 作用介绍
• 作用介绍:
Redis版的MQ -- 阻塞队列 + pub/sub
了解即可, 企业应用比较少。
3.1.9.2 stream常用操作
• 常用操作
XADD key [NOMKSTREAM] [MAXLEN|MINID [= |~] threshold [LIMIT count]] *|id field value [field value ...]
//往对列的末尾发布一条消息
XDEL key id [id ...] // 删除队列中的一条消息
XLEN key //获取队列的长度
XRANGE key start end [COUNT count] //查询队列中的消息
3.1.9.3 stream常用操作
stream应用示例
• 创建队列, 并添加消息 *表示让系统自动生成ID
XADD mystream * name loulan name roy name admin
• 查看对列消息- 对列开始 + 对列结尾
XRANGE mystream - +
• 创建消费者组 0 从队列头部开始消费。 $ 从队列尾部开始消费
XGROUP CREATE mystream groupA 0
• 消费消息 > 表示从第一条未被消费过的消息消费。 也可以指定ID
XREADGROUP GROUP groupA consumer1 count 2 STREAMS mystream >
• 查看消费者组的消费进度
XPENDING mystream groupA
3.2补充
3.2.1补充:SpringBoot集成Redis
Maven依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifact Id>spring-boot-starter-data-red is</artifact Id></dependency>
核心配置:
spring:
data:
red is:
host: 192.168.65.214
port: 6379
password: 123qweasd
......
3.2.2补充: RestTemplate快速上手
记住一个对象:
@Resource
private Red isTemplate<String,Object> red isTemplate;
按组操作
red isTemplate.opsForValue().xxx //string类型
red isTemplate.opsForSet().xxx //set类型
red isTemplate.opsForHash().xxx //hash类型
red isTemplate.opsForList().xxx //list类型
red isTemplate.opsForZset().xxx //Zset类型
red isTemplate.opsForGeo().xxx //Geo类型
red isTemplate.opsForHyperLogLog().xxx //hyperLogLog类型
red isTemplate.opsForStream().xxx //stream类型
red isTemplate.opsForValue().set Bit() //bit类型 为什么bit没有一个单独的操作类型?
3.2.3补充: RedisTemplate中文乱码问题
@Bean
public Red isTemplate<String,Object> red isTemplate(RedisConnectionFactory redisConnectionFactory){ Red isTemplate<String, Object> red isTemplate = new Red isTemplate<>();
red isTemplate.setConnectionFactory(redisConnectionFactory);
// GenericJackson2JsonRed isSerializer jsonSerializer = new GenericJackson2JsonRed isSerializer();
StringRed isSerializer stringRed isSerializer = new StringRed isSerializer();
GenericToStringSerializer<String> genericToStringSerializer = new GenericToStringSerializer<>(String.class);
//指定key和value的序列化方式
red isTemplate.set KeySerializer(stringRed isSerializer);
red isTemplate.setValueSerializer(genericToStringSerializer);
red isTemplate.setHashKeySerializer(stringRed isSerializer);
red isTemplate.setHashValueSerializer(stringRed isSerializer);
red isTemplate.afterPropertiesSet();
return red isTemplate; }


1324

被折叠的 条评论
为什么被折叠?



