一、安装

下载地址

http://download.redis.io/releases/

安装步骤

[root@twitter ~]# wget https://download.redis.io/releases/redis-6.2.6.tar.gz
[root@twitter ~]# tar xf redis-6.2.6.tar.gz -C  /usr/local
[root@twitter ~]# cd /usr/local/redis-6.2.6/
[root@twitter ~]# make 
[root@twitter ~]# make PREFIX=/usr/local/redis6 install
[root@twitter ~]# mkdir /usr/local/redis_6379/{conf,data,log}
[root@twitter ~]# cp /usr/local/redis-6.2.6/redis.conf /usr/local/redis_6379/conf
[root@twitter ~]# vim /usr/local/redis6_6379/conf/redis.conf
bind 0.0.0.0
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
pidfile "/usr/local/redis_6379/redis.pid"
loglevel notice
logfile "/usr/local/redis_6379/log/redis.log"
databases 16
always-show-logo no
set-proc-title yes
proc-title-template "{title} {listen-addr} {server-mode}"
save 21600 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
rdb-del-sync-files no
dir "/usr/local/redis_6379/data"
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-diskless-load disabled
repl-timeout 3600
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
\#aclfile "/usr/local/redis_6379/conf/users.acl"
maxmemory 105gb
maxmemory-policy volatile-lru
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
io-threads 4
io-threads-do-reads yes
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
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 4kb
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 0 0 0
client-output-buffer-limit pubsub 4gb 2gb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes
maxclients 20000
activedefrag yes
\#loadmodule /usr/local/redis6/modules/redisbloom.so
[root@twitter ~]# vim /usr/lib/systemd/system/redis.service 
[Unit]
Description=Redis server
Requires=network-online.target
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/redis_6379/bin/redis-server /usr/local/redis_6379/conf/redis.conf
User=root
Group=root
Restart=always
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
[root@twitter ~]# systemctl daemon-reload
[root@twitter ~]# systemctl enable --now redis.service
echo "vm.overcommit_memory = 1"  >> /etc/sysctl.conf &&  sysctl vm.overcommit_memory=1

设置ACL用户,具体权限可以详细划分,写配置文件的时候把acl-file打开,把各个acl用户和对应的权限都保存在acl-file中

acl list
ACL SETUSER default on >XXX
acl save

二、redis配置文件介绍

##########################常用参数##########################
bind 127.0.0.1 -::1   #支持本地访问,多个IP用空格隔开
protected-mode yes   #yes说明仅支持本地访问,远端连的不能操作redis
port 6379   #端口
tcp-backlog 511  #backlog是一个等待队列,当Redis并发量很高,达到了Redis处理的极限后,就会将新的请求写入backlog中,等待Redis不忙后再进行处理
timeout 0   #连接超时时间,0永不超时
tcp-keepalive 300  #心跳时间,不操作就关掉,操作就继续连接,300s检测一次
daemonize no  #后台启动,改yes就行,可以直接redis-server redis.conf
pidfile /var/run/redis_6379.pid   #进程号
loglevel notice  #日志级别
logfile ""   #日志文件
databases 16  #默认0号库
always-show-logo no
set-proc-title yes
proc-title-template "{title} {listen-addr} {server-mode}"
rdb-del-sync-files no
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-load disabled
replica-priority 100
acllog-max-len 128
requirepass <password>  #密码  
maxclients 10000  #最大连接数,0为不限制
maxmemory <bytes>  #最大内存
maxmemory-policy noeviction   #最大内存策略
    1)volatile-lru   利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used ) 
    2)allkeys-lru   利用LRU算法移除任何key 
    3)volatile-random 移除设置过过期时间的随机key 
    4)allkeys-random  移除随机ke
    5)volatile-ttl   移除即将过期的key(minor TTL) 
    6)noeviction  noeviction   不移除任何key,只是返回一个写错误 ,默认选项
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
aof-use-rdb-preamble yes
lua-time-limit 5000  #一个lua脚本执行的最大时间,单位为ms。默认值为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
jemalloc-bg-thread yes
####################Redis主从同步相关参数
1、slaveof
slaveof用于配置Redis的主从同步中主库的信息,该参数通常配置在从库上,后面先跟主库的IP地址,后跟主库的端口。在默认情况下,该参数在注释中,处于关闭状态。
2、masterauth
如果Redis主从同步配置中主库配置了密码,则可以在从库上使用此参数指定主库的密码。
3、slave-read-only
如果Redis配置了主从同步,可以在Redis从库上将此参数配置为yes,使得本数据库只允许读而不允许写。
4、slave-serve-stale-data:默认值为yes。当一个 slave 与 master 失去联系,或者复制正在进行的时候,slave 可能会有两种表现:
      1) 如果为 yes ,slave 仍然会应答客户端请求,但返回的数据可能是过时,或者数据可能是空的在第一次同步的时候 
      2) 如果为 no ,在你执行除了 info he salveof 之外的其他命令时,slave 都将返回一个 “SYNC with master in progress” 的错误
      
5、repl-diskless-sync no
主从数据复制是否使用无硬盘复制功能。默认值为no。
6、repl-diskless-sync-delay 5
当启用无硬盘备份,服务器等待一段时间后才会通过套接字向从站传送RDB文件,这个等待时间是可配置的。  这一点很重要,因为一旦传送开始,就不可能再为一个新到达的从站服务。从站则要排队等待下一次RDB传送。因此服务器等待一段时间以期更多的从站到达。延迟时间以秒为单位,默认为5秒。要关掉这一功能,只需将它设置为0秒,传送会立即启动。默认值为5。
7、repl-disable-tcp-nodelay no
同步之后是否禁用从站上的TCP_NODELAY,如果你选择yes,redis会使用较少量的TCP包和带宽向从站发送数据。但这会导致在从站增加一点数据的延时。Linux内核默认配置情况下最多40毫秒的延时。如果选择no,从站的数据延时不会那么多,但备份需要的带宽相对较多。默认情况下我们将潜在因素优化,但在高负载情况下或者在主从站都跳的情况下,把它切换为yes是个好主意。默认值为no。
########################RDB持久化常用参数
1、save
该参数用于设置RDB持久化的频次,该参数后面第一个值为时间,单位为秒,第二个值为改变次数,两个联合起来即表示当该时间内,向Redis数据库中改变该次数,就进行一次持久化保存。如果想要关闭RDB持久化功能,可以设置为save “”。
save 900 1:表示900 秒内如果至少有 1 个 key 的值变化,则保存
save 300 10:表示300 秒内如果至少有 10 个 key 的值变化,则保存
save 60 10000:表示60 秒内如果至少有 10000 个 key 的值变化,则保存,用bgsave
对save条件的检查是通过周期函数每隔100毫秒检查一次,在检查的时候,先通过当前时间戳与lastSave属性计算save_interval(此刻的时间戳-lastSave属性),如果dirty>=1,且 save_interval > 900,那就执行保存,如果不满足就检查下一个条件dirty>=10,且 save_interval > 300,那就保存,同理不满足则去检查第三个条件
2、stop-writes-on-bgsave-error yes
当该参数设置为yes时,在进行RDB备份的时候,一旦发生错误,就会停止写操作。
3、rdbcompression yes
当该参数设置为yes时,RDB持久化备份会进行压缩,这个过程会消耗CPU资源,但是会节省存储空间。
4、rdbchecksum yes
当该参数设置为yes时,在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。
5、dbfilename dump.rdb
该参数定义了RDB文件的名称。
6、dir ./
该参数定义了RDB文件的存放路径。
##########################AOF持久化常用参数
1、appendonly no
该参数定义了是否开启AOF持久化,如果该参数为NO,则表示不开启AOF持久化,如果该参数为YES,则表示开启AOF持久化,在默认情况下,Redis配置文件中该参数为NO,即表示不开启AOF持久化。
2、appendfilename "appendonly.aof"
该参数定义了AOF持久化的写入文件。
3、appendfsync everysec
该参数表示何时进行持久化,当该参数为always时,每次收到写命令时,立即进行AOF持久化备份,这样做可以最大程度上防止数据丢失,但是会造成性能下降;当该参数为everysec时,表示每秒钟写一次,不管这一秒收到多少个数据写请求;当该参数为NO时,表示由操作系统决定何时进行持久化备份。no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快;always表示每次写入都执行fsync,以保证数据同步到磁盘;everysec表示每秒执行一次fsync,可能会导致丢失这1s数据
4、no-append-fsync-on-write
当该参数为yes时,表示在重写时,对于新的写操作不做同步,而是暂时存放在内存中。
5、auto-aof-rewrite-percentage 100
该参数表示自动进行AOF持久化的时机,后面跟的是数据的比例,比如当该值为50时,就表示当当前的AOF文件大小是原来的150%时,就会进行一次持久化备份写入。
6、auto-aof-rewrite-min-size 64mb
该参数也是定义了AOF持久化的时机,后面跟的是一个大小,比如当该值为32mb时,表示当文件为32mb时会进行持久化操作。
7、no-appendfsync-on-rewrite no
在aof重写或者写入rdb文件的时候,会执行大量IO,此时对于everysec和always的aof模式来说,执行fsync会造成阻塞过长时间,no-appendfsync-on-rewrite字段设置为默认设置为no。如果对延迟要求很高的应用,这个字段可以设置为yes,否则还是设置为no,这样对持久化特性来说这是更安全的选择。   设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入,默认为no,建议yes。Linux的默认fsync策略是30秒。可能丢失30秒数据。默认值为no。
8、aof-load-truncated yes
aof文件可能在尾部是不完整的,当redis启动的时候,aof文件的数据被载入内存。重启可能发生在redis所在的主机操作系统宕机后,尤其在ext4文件系统没有加上data=ordered选项,出现这种现象  redis宕机或者异常终止不会造成尾部不完整现象,可以选择让redis退出,或者导入尽可能多的数据。如果选择的是yes,当截断的aof文件被导入的时候,会自动发布一个log给客户端然后load。如果是no,用户必须手动redis-check-aof修复AOF文件才可以。默认值为 yes。

三、redis日常操作

keys *  //查看所有key
info   //查看所有关于redis的信息
select 0-15  //选择数据库
flushdb //清空当前数据库
flushall //清空所有数据
info clients //查看当前的客户端连接数
CONFIG GET maxclients //查看最大客户端连接数
CONFIG set maxclients 10 //修改最大客户端连接数
config rewrit //保存配置,可在redis.conf 配置文件中添加重启生效
CLIENT LIST //获取客户端列表

恢复数据

1.直接把.rdb复制到数据目录下,重启redis就可以,注意数据文件的名字,和配置文件保持一致

2.直接用redis工具

备份操作

bgsave和save区别:

Save 命令执行一个同步保存操作,将当前 Redis 实例的所有数据快照(snapshot)以 RDB 文件的形式保存到硬盘。
语法:redis 127.0.0.1:6379> SAVE
返回值:保存成功时返回 OK 。

BGSAVE 命令执行之后立即返回 OK ,然后 Redis fork 出一个新子进程,原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。客户端可以通过 LASTSAVE 命令查看相关信息,判断 BGSAVE命令是否执行成功。(先开始lastsave一下看一下id,之后可以判断)
bgsave命令执行过程中,只有fork子进程时会阻塞服务器,而对于save命令,整个过程都会阻塞服务器,因此save已基本被废弃,线上环境要杜绝save的使用;后文中也将只介绍bgsave命令。此外,在自动触发RDB持久化时,Redis也会选择bgsave而不是save来进行持久化;下面介绍自动触发RDB持久化的条件。

注意,做备份的时候如果要求严格的话同时开启aof日志和save,但是aof日志会很大,准备比较大的存储空间才够用!!!

主从同步

快照同步是一个非常耗费资源的操作,它首先需要在主节点上进行一次 bgsave,将当前内存的数据全部快照到磁盘文件中,然后再将快照文件的内容全部传送到从节点。从节点将快照文件接受完毕后,立即执行一次全量加载,加载之前先要将当前内存的数据清空,加载完毕后通知主节点继续进行增量同步。

做主从直接在从机上执行

# replicaof <masterip> <masterport> 

断开主从

# replicaof no one

redis工具

下载地址:

https://github.com/leonchen83/redis-rdb-cli 备份远程数据到docker中:
$ rdt -b redis://192.168.1.105:6379 -o /path/to/dump.rdb
恢复到远程的库中:
$ rmt -s /path/to/dump.rdb -m redis://192.168.1.105:6379 -r

四、可能遇到的错误

连接数超过系统最大的链接数,但是系统的文件打开数等都设置很大了,当前进程的打开数还达不到最大

cat /proc/39977/limits 
Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            seconds   
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
Max stack size            8388608              unlimited            bytes     
Max core file size        0                    unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             65535                65535                processes 
Max open files            1024                 4096                 files     
Max locked memory         65536                65536                bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       514823               514823               signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us

其中,Max open files 是打开文件的最大数量

# CentOS7系统使用命令
prlimit --nofile=65536:65536 --pid 39977

# CentOS6系统使用命令
echo - n "Max open files=65535:65535" > /proc/39977/limits

五、安装脚本

#!/bin/bash
#

read -p "请输入最大内存设置(例如 27gb): " max_memory
read -p "是否需要设置bgsave?(Y/N): " save_data
if [ "$save_data" = "Y" ] || [ "$save_data" = "y" ]; then
    read -p "请输入bgsave的频率:(例如 600 210000) " save_count
    save_settings="$save_count"  
else
    save_settings='""'  
fi

yum -y install cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc make tcl
cd /
wget http://download.redis.io/releases/redis-7.0.9.tar.gz
tar xf /redis-7.0.9.tar.gz -C  /usr/local
cd /usr/local/redis-7.0.9/
make
make PREFIX=/usr/local/redis_6379 install
mkdir -p /usr/local/redis_6379/{conf,data,log}
touch /usr/local/redis_6379/conf/users.acl
cp /usr/local/redis-7.0.9/redis.conf /usr/local/redis_6379/conf
> /usr/local/redis_6379/conf/redis.conf
cat >> /usr/local/redis_6379/conf/redis.conf << EOF
bind 0.0.0.0
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
pidfile "/usr/local/redis_6379/redis.pid"
loglevel notice
logfile "/usr/local/redis_6379/log/redis.log"
databases 16
always-show-logo no
set-proc-title yes
proc-title-template "{title} {listen-addr} {server-mode}"
save $save_settings
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
rdb-del-sync-files no
dir "/usr/local/redis_6379/data"
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-diskless-load disabled
repl-timeout 3600
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
aclfile "/usr/local/redis_6379/conf/users.acl"
maxmemory $max_memory
maxmemory-policy volatile-lru
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
io-threads 4
io-threads-do-reads yes
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
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 4kb
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 0 0 0
client-output-buffer-limit pubsub 4gb 2gb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes
maxclients 20000
activedefrag yes
EOF
cat >> /usr/lib/systemd/system/redis.service << EOF
[Unit]
Description=Redis server
Requires=network-online.target
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/redis_6379/bin/redis-server /usr/local/redis_6379/conf/redis.conf
User=root
Group=root
Restart=always
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
LimitNOFILE=655350
[Install]
WantedBy=multi-user.target
EOF
echo "vm.overcommit_memory = 1"  >> /etc/sysctl.conf &&  sysctl vm.overcommit_memory=1
systemctl daemon-reload
systemctl enable --now redis.service
echo 'export PATH=$PATH:/usr/local/redis_6379/bin' >> /etc/profile
source /etc/profile
#############加用户密码例子###############
#redis-cli
#acl list
#ACL SETUSER default on >XXXX
#acl save