一、Redis 部署

1.1 相关资料

官方命令参考

https://redis.io/commands/

官方各版本的下载地址

https://redis.io/download/#redis-downloads

1.2 单实例安装(redis 6.2.12 )

系统版本

[root@dev0 redis]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)

安装编译依赖环境

#1. 安装gcc,redis 6以后的稳定版都需要最新的gcc环境(8以上)tcl 8.5以上
sudo yum install -y centos-release-scl scl-utils-build
sudo yum install -y devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
#临时设置bash的gcc的版本,退出 shell 或重启会恢复原 gcc 版本
sudo scl enable devtoolset-9 bash

# 永久生效
sudo echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
# 确认gcc 版本(一定要确认下)
gcc -v

# 1.2安装tcl
# 检查没有tcl再安装
rpm -qa | grep tcl
# 下载与安装
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/tcl-8.5.13-
8.el7.x86_64.rpm
rpm -ivh tcl-8.5.13-8.el7.x86_64.rpm

redis 安装

# 1、redis 下载安装, 安装目录 /usr/local/redis
cd /usr/local
wget https://download.redis.io/releases/redis-6.2.12.tar.gz
tar zxvf redis-6.2.12.tar.gz
cd /usr/local/redis-6.2.12/

# 2、编译安装
make MALLOC=libc
# 如果make test出错,将缺失的类库安装以后,先将之前的遗留清理下,否则会一直卡住
make distclean
make test
make install PREFIX=/usr/local/redis

# 安装完以后在/usr/local/redis/ 会有一个bin 目录
[root@dev0 bin]# cd /usr/local/redis/bin
[root@dev0 bin]# ls
redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server

# 3、生成配置文件
mkdir -p /data/redis/6400
cp -r /usr/local/redis/bin/ /data/redis/6400/
cat > /data/redis/6400/redis_6400.conf <<EOF
daemonize yes
tcp-backlog 511
timeout 0
tcp-keepalive 60
loglevel notice
databases 16
dir "/data/redis/6400"
stop-writes-on-bgsave-error no
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 512mb 128mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
port 6400
maxmemory 100mb
maxmemory-policy volatile-lru
appendonly yes
appendfsync everysec
appendfilename "appendonly-6400.aof"
dbfilename "dump-6400.rdb"
logfile "/data/redis/6400/redis_6400.log"
pidfile /data/redis/6400/redis_6400.pid
aof-rewrite-incremental-fsync yes
no-appendfsync-on-rewrite yes
auto-aof-rewrite-min-size 62500kb
auto-aof-rewrite-percentage 89
rdbcompression yes
rdbchecksum yes
repl-diskless-sync no
repl-diskless-sync-delay 5
maxclients 4064
hll-sparse-max-bytes 3000
min-replicas-to-write 0
min-replicas-max-lag 10
aof-load-truncated yes
notify-keyspace-events ""
protected-mode no
requirepass ""
masterauth ""
EOF

# 4、启动
/data/redis/6400/bin/redis-server /data/redis/6400/redis_6400.conf

# 5、登录测试
redis-cli -p 6400
# 或者
redis-cli -h 127.0.0.1 -p 6400 set key1 linda
redis-cli -h 127.0.0.1 -p 6400 get key1

# 6、关闭
redis-cli -h 127.0.0.1 -p 6400 shutdown
# log信息如下
tail -n 100 redis_6400.log
614647:M 22 May 2023 20:03:30.024 # User requested shutdown...
614647:M 22 May 2023 20:03:30.024 * Saving the final RDB snapshot before exiting.
614647:M 22 May 2023 20:03:30.025 * DB saved on disk
614647:M 22 May 2023 20:03:30.025 * Removing the pid file.
614647:M 22 May 2023 20:03:30.025 # Redis is now ready to exit, bye bye...

二、redis 配置详解

主要是redis.conf文件

2.1 单位

  • 1k => 1000 bytes

  • 1kb => 1024 bytes

  • 1m => 1000000 bytes

  • 1mb => 1024*1024 bytes

  • 1g => 1000000000 bytes

  • 1gb => 102410241024 bytes

2.2 网络相关

1、bind

默认情况bind=127.0.0.1只能接受本机的访问请求 不写的情况下,无限制接受任何ip地址的访问,生产环境要写应用服务器的内网地址;服务器如果需要远程访 问的,需要将其注释掉。

2、protected-mode

将本机访问保护模式设置no。默认为yes,需要通过bind ip或者设置访问密码才能访问;如果为no,则外部 网络可直接访问

3、Port

端口号,默认 6379

4、tcp-backlog 512 #设置tcp的backlog

5、timeout #一个空闲的客户端维持多少秒会关闭,0表示关闭该功能。即永不关闭

6、tcp-keepalive 对访问客户端的一种心跳检测,每个n秒检测一次。 单位为秒,如果设置为0,则不会进行Keepalive检测,建议设置成60

视频补充:tcp-backlog 的理解

  • tcp-backlog 控制的是 TCP 连接队列长度,在高并发场景下如果设置过小,容易出现连接堆积或连接失败。

  • 可以简单理解为:队列总和 = 未完成三次握手队列 + 已完成三次握手队列。

  • 因此线上实例除了关注 Redis 配置本身,也要结合操作系统内核参数一起看,避免只改 redis.conf 但实际效果不明显。

2.3 通用

1、daemonize #redis服务是否以守护进程(后台运行)的方式启动,默认为no,建议设置为yes

2、pidfile #存放pid文件的位置,每个实例会产生一个不同的pid文件,在多实例目录下

3、loglevel #指定日志记录级别。 Redis总共支持四个级别:debug、verbose、notice、warning,默认为notice。生产环境选择notice 或者warning

4、logfile #日志文件名称

5、databases 16 #设定库的数量,默认16,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id

2.4 安全

1、requirepass #设置密码

2、rename-command:命令重命名,对于一些危险命令(keys),可以使用。 比如以下命令:

  • flushdb:清空数据库

  • flushall:清空所有记录

  • config:服务器配置项

  • keys:可查看所有key键

生产上我们一般都会禁止使用,我们通过:

rename-command FLUSHALL "" #将清空db进行屏蔽
rename-command KEYS "" #将keys命令屏蔽

如果需要保留命令,我们可以重命名成一个只有我们知道的命令。

2.5 limit限制

1、maxclients 设置redis最大连接数,注释此配置或设置为0,则标识不做限制。如果客户端连接数达到限制时,会返回 "max number of clients reached" 错误信息

2、maxmemory

  • 必须设置,否则会将内存占满,造成服务器宕机

  • 一旦到达内存使用上限,redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定。

  • 如果redis无法根据移除规则来移除内存中的数据,或者设置了“不允许移除”,那么redis则会针对那些需 要申请内存的指令返回错误信息,比如SET、LPUSH等。

  • 但是对于无内存申请的指令,仍然会正常响应,比如GET等。如果你的redis是主redis(说明你的redis 有从redis),那么在设置内存使用上限时,需要在系统中留出一些内存空间给同步队列缓存,只有在你设置 的是“不移除”的情况下,才不用考虑这个因素。

3、maxmemory-policy

  • volatile-lru:使用LRU算法移除key,只对设置了过期时间的键;(最近最少使用)

  • allkeys-lru:在所有集合key中,使用LRU算法移除key

  • volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键

  • allkeys-random:在所有集合key中,移除随机的key

  • volatile-ttl:移除那些TTL值最小的key,即那些最近要过期的key

  • noeviction:不进行移除。针对写操作,只是返回错误信息

4、maxmemory-samples

  • 设置样本数量,LRU算法和最小TTL算法都并非是精确的算法,而是估算值,所以你可以设置样本的大小, redis默认会检查这么多个key并选择其中LRU的那个。

  • 一般设置3到7的数字,数值越小样本越不准确,但性能消耗越小。

2.6 持久化

rdb 相关

1、save

触发redis持久化的条件,将内存中的数据保存到磁盘中,默认配置如下:

  • save 900 1:当900秒内,至少有1个key的值发生变化,则保存到磁盘中

  • save 300 10:当300秒内,至少有10个key的值发生变化,则保存到磁盘中

  • save 60 10000:当60秒内,至少有10000个key的值发生变化,则保存到磁盘中

如果不需要做持久化,仅使用缓存功能,则可以将持久化条件全部注释,且设置为save ""

2、rdbcompression #是否开启RDB文件压缩,默认为yes,表示开启。如果为yes,则redis采用LZF算法进行压缩;如果不想消耗cpu来进行压缩,可以设置为no,但存储在磁盘中的快照会比较大

3、dbfilename #RDB文件名,默认为dump.rdb。

4、dir #RDB文件的保存路径,默认为Redis的安装目录。

aof相关

1、appendonly

是否开启AOF持久化,默认为no。 redis默认使用RDB方式持久化。如果设置为yes,redis会把每次写入的数据接收后都写入 appendonly.aof文件中,每次启动redis会先从appendonly.aof文件中将数据读取到内存中,忽略RDB文 件

2、appendfilename AOF文件名,默认为appendonly.aof。

3、appendfsync

AOF持久化策略,默认为everysec,表示每秒同步一次。有以下选项

  • no:表示不执行fsync命令,由操作系统保证将内存中的数据同步到磁盘中,速度最快

  • always:表示每次写入都执行fsync命令,将内存中的数据同步到磁盘中

  • everysec:表示每秒执行一次fsync命令,可能会导致丢失这1s数据(如果执行fsync命令失败),默认项

4、no-appendfsync-on-rewrite 在重写入aof或rdb文件时会造成阻塞,会执行大量IO,如果对延迟要求较高,则设置为yes,表示rewrite期间对新写操作不执行fsync命令,暂存于内存中,等rewrite完成后再写入,默认值为no,建议为yes。

5、auto-aof-rewrite-percentage 默认值为100。aof自动重写配置,当前aof文件大小超过上一次重写的aof文件的百分之多少进行重写,redis执行bgrewriteaof对日志文件进行重写。

6、auto-aof-rewrite-min-size 用于配置重写AOF文件所需的最小文件大小,默认为64mb。设置允许重写的最小aof文件大小,避免达到了约定100%文件仍然很小的情况还要重写。

7、aof-load-truncated:如果redis宕机,在恢复启动后,可能aof文件尾部是不完整的。默认值为yes,aof日志文件会继续使用;如果设置为no,则恢复失败,需要用户手动执行 redis-check-aof 修复AOF文件才可使用。

2.7 主从复制

1、slaveof <masterip> <masterport> #添加从节点。设置Redis作为从节点时连接的主节点IP地址和端口号,格式为 slaveof <masterip> <masterport>

2、masterauth #当Redis作为从节点时,连接主节点的密码认证。

3、slave-serve-stale-data yes

4、slave-read-only yes

5、repl-diskless-sync no #无盘复制,适用于主节点所在机器磁盘性能较差但网络带宽较充裕的场景。

6、repl-diskless-sync-delay 5 #两次diskless模式的数据同步操作的时间间隔

7、repl-ping-slave-period 10 #Slave节点向Master节点发送ping指令的时间间隔,10s

8、repl-timeout 60 #Master和Slave之间的超时时间

9、repl-disable-tcp-nodelay no #主从复制时使用的网络资源优化参数

默认关闭

  • 关闭:所有命令数据发送从节点,延迟变少,但是网络带宽消耗增加,适合同机房。

  • 开启:合并较小TCP数据包,默认40ms,节省带宽,但会增大主从延时,适合跨机房部署。

10、repl-backlog-size 1MB #主节点复制积压缓冲区大小

11、slave-priority #当前Slave节点的优先级权重

12、min-slaves-to-write 和 min-slaves-max-lag #拒绝数据写操作的策略

2.8 集群

1、cluster-enabled #redis集群开关

2、cluster-config-file #redis集群配置文件,每个节点都有一个集群配置文件

3、cluster-node-timeout #集群节点互联超时毫秒数,默认为15000毫秒

4、cluster-slave-validity-factor #用来判断slave节点与master节点断线的时间是否过长

5、cluster-migration-barrier #master节点需要的最小slave节点数,只有达到这个数,master节点失败时,slave节点才能迁移到其他master节点上

6、cluster-require-full-coverage #默认情况下,集群全部的slot有节点负责,集群状态才为ok,才能提供服务。设置为no,可以在slot没有全部分配的时候提供服务。不建议打开该配置,这样会造成分区的时候,小分区的master一直在接受写请求,从而造成很长时间数据不一致