1、安装
官方下载地址:http://download.redis.io/releases/
1.1、yum安装redis
#安装epel源
yum install epel-release -y
yum install redis –y
1.2、编译安装redis
下载redis 源码包:http://download.redis.io/releases/
[root@node1 ~]# cd /usr/local/src/
#下载源码包
[root@node1 src]# wget http://download.redis.io/releases/redis-4.0.9.tar.gz
[root@node1 src]# tar xf redis-4.0.9.tar.gz
#安装并指定安装路径
[root@node1 src]# cd redis-4.0.9
[root@node1 redis-4.0.9]# make PREFIX=/apps/redis install
[root@node1 redis-4.0.9]# cd /apps/redis/
[root@node1 redis]# ll /apps/redis/
total 0
drwxr-xr-x 2 root root 134 Aug 30 18:33 bin
#创建配置文件、日志、数据等目录
[root@node1 redis]# mkdir /apps/redis/{etc,logs,data,run}
[root@node1 redis]# cp /usr/local/src/redis-4.0.9/redis.conf /apps/redis/etc/
#编辑redis服务启动脚本
[root@node1 redis]# vim /usr/lib/systemd/system/redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=//apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
#创建redis用户,并授权
[root@node1 redis]# groupadd -g 1000 redis && useradd -u 1000 -g 1000 redis -s /sbin/nologin
[root@node1 redis]# chown redis.redis -R /apps/redis
1.3、启动
[root@node1 redis]# systemctl daemon-reload
[root@node1 redis]# systemctl start redis
1.4 连接reids
[root@node1 redis]# /apps/redis/bin/redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379>
1.5 创建命令软连接
[root@node1 redis]# ln -sv /apps/redis/bin/redis-* /usr/bin/
‘/usr/bin/redis-benchmark’ -> ‘/apps/redis/bin/redis-benchmark’
‘/usr/bin/redis-check-aof’ -> ‘/apps/redis/bin/redis-check-aof’
‘/usr/bin/redis-check-rdb’ -> ‘/apps/redis/bin/redis-check-rdb’
‘/usr/bin/redis-cli’ -> ‘/apps/redis/bin/redis-cli’
‘/usr/bin/redis-sentinel’ -> ‘/apps/redis/bin/redis-sentinel’
‘/usr/bin/redis-server’ -> ‘/apps/redis/bin/redis-server’
1.6 编译安装后的命令
[root@node1 redis]# ll /apps/redis/bin/
total 21860
-rwxr-xr-x 1 redis redis 2451464 Aug 30 18:33 redis-benchmark #redis性能测试工具
-rwxr-xr-x 1 redis redis 5768616 Aug 30 18:33 redis-check-aof #AOF文件检查工具
-rwxr-xr-x 1 redis redis 5768616 Aug 30 18:33 redis-check-rdb #RDB文件检查工具
-rwxr-xr-x 1 redis redis 2616520 Aug 30 18:33 redis-cli #客户端工具
lrwxrwxrwx 1 redis redis 12 Aug 30 18:33 redis-sentinel -> redis-server #哨兵,软连接到server
-rwxr-xr-x 1 redis redis 5768616 Aug 30 18:33 redis-server #redis 服务启动命令
[root@node1 redis]#
1.7 连接到Redis:
#本机非密码连接
redis-cli
#跨主机非密码连接
redis-cli -h HOSTNAME/IP -p PORT
#跨主机密码连接
redis-cli -h HOSTNAME/IP -p PORT -a PASSWORD
1.8 解决启动警告提示
1.8.1 tcp-backlog:
backlog参数控制的是三次握手的时候server端收到client ack确认号之后的队列值
vim /etc/sysctl.conf
net.core.somaxconn = 512
1.8.2 vm.overcommit_memory
0、表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1、表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2、表示内核允许分配超过所有物理内存和交换空间总和的内存
vim /etc/sysctl.conf
vm.overcommit_memory = 1
1.8.3 transparent hugepage
大页内存动态分配,需要关闭让redis 负责内存管理。
echo never > /sys/kernel/mm/transparent_hugepage/enabled
2、redis配置文件
bind 0.0.0.0 #监听地址,可以用空格隔开后多个监听IP
protected-mode yes #redis3.2 之后加入的新特性,在没有设置bind IP和密码的时候,redis只允许访问127.0.0.1:6379,远程访问将提示警告信息并拒绝远程访问
port 6379 #监听端口
tcp-backlog 511 #三次握手的时候server端收到client ack确认号之后的队列值。
timeout 0 #客户端和Redis服务端的连接超时时间,默认是0,表示永不超时。
tcp-keepalive 300 #tcp 会话保持时间
daemonize no #默认情况下 redis 不是作为守护进程运行的,如果你想让它在后台运行,你就把它改成 yes,当redis作为守护进程运行的时候,它会写一个 pid 到 /var/run/redis.pid 文件里面
supervised no #和操作系统相关参数,可以设置通过upstart和systemd管理Redis守护进程,centos 7以后都使用systemd
pidfile /var/run/redis_6379.pid #pid文件路径
loglevel notice #日志级别
logfile "" #日志路径
databases 16 #设置db 库数量,默认16个库
always-show-logo yes #在启动redis 时是否显示log
save 900 1 #在900秒内有一个键内容发生更改就出就快照机制
save 300 10
save 60 10000
stop-writes-on-bgsave-error no #快照出错时是否禁止redis 写入操作
rdbcompression yes #持久化到RDB文件时,是否压缩,"yes"为压缩,"no"则反之
rdbchecksum yes #是否开启RC64校验,默认是开启
dbfilename dump.rdb #快照文件名
dir ./ #快照文件保存路径
replica-serve-stale-data yes #当从库同主库失去连接或者复制正在进行,从机库有两种运行方式:
1、如果replica-serve-stale-data设置为yes(默认设置),从库会继续响应客户端的读请求。
2、如果replica-serve-stale-data设置为no,除去指定的命令之外的任何请求都会返回一个错误"SYNC with master in progress"。
replica-read-only yes #是否设置从库只读
repl-diskless-sync no #是否使用socket方式复制数据(无盘同步),新slave连接连接时候需要做数据的全量同步,redis server就要从内存dump出新的RDB文件,然后从master传到slave,有两种方式把RDB文件传输给客户端:
1、基于硬盘(disk-backed):master创建一个新进程dump RDB,RDB完成之后由父进程(即主进程)传给slaves。
2、基于socket(diskless):master创建一个新进程直接dump RDB到slave的socket,不经过主进程,不经过硬盘。
基于硬盘的话,RDB文件创建后,一旦创建完毕,可以同时服务更多的slave,但是基于socket的话, 新slave连接到master之后得逐个同步数据。
在磁盘较慢并且网络较快的时候,可以用diskless(yes),否则使用磁盘(no)
repl-diskless-sync-delay 30 #diskless**复制的延迟时间**,设置0为关闭,在延迟时间内连接的新客户端,会一起通过disk方式同步数据,但是一旦复制开始还没有结束之前,master节点不会再接收新slave的复制请求,直到下一次同步开始。
repl-ping-slave-period 10 #slave根据master指定的时间进行周期性的PING 监测
repl-timeout 60 #复制连接的超时时间,需要大于repl-ping-slave-period,否则会经常报超时
repl-disable-tcp-nodelay no #在socket模式下是否在slave套接字发送SYNC之后禁用 TCP_NODELAY,
如果选择“yesRedis将使用更少的TCP包和带宽来向slaves发送数据,但是这将使数据传输到slave上有延迟,Linux内核的默认配置会达到40毫秒,如果你选择了 "no"** 数据传输到salve**的延迟将会减少但要使用更多的带宽。
repl-backlog-size 512mb #复制缓冲区内存大小,只有在slave连接之后才分配内存。
repl-backlog-ttl 3600 #多次时间master没有slave连接,就清空backlog缓冲区。
replica-priority 100 #当master不可用,Sentinel会根据slave的优先级选举一个master,最低的优先级的slave,当选master,而配置成0,永远不会被选举。
requirepass foobared #设置redis 连接密码
rename-command #重命名一些高危命令
maxclients 10000 #Redis最大连接客户端
maxmemory #最大内存,单位为bytes字节,8G内存的计算方式8(G)1024(MB)1024(KB)*1024(Kbyte),需要注意的是slave的输出缓冲区是不计算在maxmemory内。
appendonly no #是否开启AOF日志记录,默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了,但是redis如果中途宕机,会导致可能有几分钟的数据丢失(取决于dumpd数据的间隔时间),根据save来策略进行持久化,Append Only File是另一种持久化方式,可以提供更好的持久化特性,Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。
appendfilename "appendonly.aof" #AOF文件名
appendfsync everysec #aof持久化策略的配置,no表示不执行fsync,由操作系统保证数据同步到磁盘,always表示每次写入都执行fsync,以保证数据同步到磁盘,everysec表示每秒执行一次fsync,可能会导致丢失这1s数据。
no-appendfsync-on-rewrite no在aof rewrite期间,是否对aof新记录的append暂缓使用文件同步策略,主要考虑磁盘IO开支和请求阻塞时间。默认为no,表示"不暂缓",新的aof记录仍然会被立即同步,Linux的默认fsync策略是30秒,如果为yes 可能丢失30秒数据,但由于yes性能较好而且会避免出现阻塞因此比较推荐。
auto-aof-rewrite-percentage 100 # 当Aof log增长超过指定百分比例时,重写AOF文件, 设置为0表示不自动重写Aof 日志,重写是为了使aof体积保持最小,但是还可以确保保存最完整的数据,
auto-aof-rewrite-min-size 64mb #触发aof rewrite的最小文件大小
aof-load-truncated yes #是否加载由于其他原因导致的末尾异常的AOF文件(主进程被kill/断电等)
aof-use-rdb-preamble no #redis4.0新增RDB-AOF混合持久化格式,在开启了这个功能之后,AOF重写产生的文件将同时包含RDB格式的内容和AOF格式的内容,其中RDB格式的内容用于记录已有的数据,而AOF格式的内存则用于记录最近发生了变化的数据,这样Redis就可以同时兼有RDB持久化和AOF持久化的优点(既能够快速地生成重写文件,也能够在出现问题时,快速地载入数据)。
lua-time-limit 5000 #lua脚本的最大执行时间,单位为毫秒
cluster-enabled yes #是否开启集群模式,默认是单机模式
cluster-config-file nodes-6379.conf #由node节点自动生成的集群配置文件
cluster-node-timeout 15000 #集群中node节点连接超时时间
cluster-replica-validity-factor 10 #在执行故障转移的时候可能有些节点和master断开一段时间数据比较旧,这些节点就不适用于选举为master,超过这个时间的就不会被进行故障转移
cluster-migration-barrier 1 #集群迁移屏障,一个主节点拥有的至少正常工作的从节点,即如果主节点的slave节点故障后会将多余的从节点分配到当前主节点成为其新的从节点。
cluster-require-full-coverage no #集群请求槽位全部覆盖,如果一个主库宕机且没有备库就会出现集群槽位不全,那么yes情况下redis集群槽位验证不全就不再对外提供服务,而no则可以继续使用但是会出现查询数据查不到的情况(因为有数据丢失)。
#Slow log 是 Redis 用来记录查询执行时间的日志系统,slow log 保存在内存里面,读写速度非常快,因此你可以放心地使用它,不必担心因为开启 slow log 而损害 Redis 的速度。
slowlog-log-slower-than 10000 #以微秒为单位的慢日志记录,为负数会禁用慢日志,为0会记录每个命令操作。
slowlog-max-len 128 #记录多少条慢日志保存在队列,超出后会删除最早的,以此滚动删除
3、redis 持久化
Redis 虽然是一个内存级别的缓存程序,也就是redis 是使用内存进行数据的缓存的,但是其可以将内存的数据按照一定的策略保存到硬盘上,从而实现数据持久保存的目的,目前redis支持两种不同方式的数据持久化保存机制,分别是RDB和AOF
3.1 RDB模式
RDB(Redis DataBase):基于时间的快照,其默认只保留当前最新的一次快照,特点是执行速度比较快,缺点是可能会丢失从上次快照到当前时间点之间未做快照的数据
RDB实现的具体过程Redis从主进程先fork出一个子进程,使用写时复制机制,子进程将内存的数据保存为一个临时文件,比如dump.rdb.temp,当数据保存完成之后再将上一次保存的RDB文件替换掉,然后关闭子进程,这样可以保存每一次做RDB快照的时候保存的数据都是完整的,因为直接替换RDB文件的时候可能会出现突然断电等问题而导致RDB文件还没有保存完整就突然关机停止保存而导致数据丢失的情况,可以手动将每次生成的RDB文件进程备份,这样可以最大化保存历史数据
3.1.1 RDB模式的优缺点
优点:
- RDB快照保存了某个时间点的数据,可以通过脚本执行bgsave(非阻塞)或者save(阻塞)命令自定义时间点备份,可以保留多个备份,当出现问题可以恢复到不同时间点的版本。
- 可以最大化IO 的性能,因为父进程在保存RDB 文件的时候唯一要做的是fork出一个子进程,然后的-操作都会有这个子进程操作,父进程无需任何的IO操作
- RDB在大量数据比如几个G的数据,恢复的速度比AOF的快
缺点:
- 不能时时的保存数据,会丢失自上一次执行RDB备份到当前的内存数据
- 数据量非常大的时候,从父进程fork的时候需要一点时间,可能是毫秒或者秒或者分钟,取决于磁盘IO性能
3.1.2 RDB配置
vim etc/redis.conf
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error no
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /apps/redis/data
[root@node1 redis]# systemctl restart redis
[root@node1 redis]# ll /apps/redis/data/
total 0
#通过脚本写入redis
[root@node1 redis]# cat redis_write.sh
#!/bin/bash
NUM=`seq 1 10000`
for i in ${NUM};do
redis-cli -h 127.0.0.1 set key-${i} value-${i}
echo "key-${i} value-${i} 写入完成"
done
echo "一万个key写入到Redis完成"
[root@node1 redis]# sh redis_write.sh
#验证可以看到通过脚本写入一万个key后redis生成了RDB快照文件
[root@node1 redis]# ll data/
total 204
-rw-r--r-- 1 redis redis 207886 Aug 31 00:29 dump.rdb
3.2 AOF模式使用
AOF:按照操作顺序依次将操作添加到指定的日志文件当中,特点是数据安全性相对较高,缺点是即使有些操作是重复的也会全部记录。
AOF和RDB一样使用了写时复制机制,AOF默认为每秒钟fsync一次,即将执行的命令保存到AOF文件当中,这样即使redis服务器发生故障的话顶多也就丢失1秒钟之内的数据,也可以设置不同的fsync策略,或者设置每次执行命令的时候执行fsync,fsync会在后台执行线程,所以主线程可以继续处理用户的正常请求而不受到写入AOF文件的IO影响。
3.2.1 AOF模式优缺点
AOF的文件大小要大于RDB格式的文件
根据所使用的fsync策略(fsync是同步内存中redis所有已经修改的文件到存储设备),默认是appendfsync everysec即每秒执行一次fsync
3.2.1 AOF配置使用
[root@node1 redis]# vim etc/redis.conf
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 1gb
aof-load-truncated yes
aof-use-rdb-preamble no
#重启查看
[root@node1 redis]# systemctl restart redis
[root@node1 redis]# ll data/
total 204
-rw-r--r-- 1 redis redis 0 Aug 31 00:44 appendonly.aof
-rw-r--r-- 1 redis redis 207886 Aug 31 00:29 dump.rdb