redis基础配置文件详解(小节2)
连接到redis:
注意分为运维人员的连接和程序的连接
1. 本机非密码连接:
]# redis-cli
2. 跨主机非密码连接(bind 0.0.0.0)
查看redis端口号
~]# ss -ntlp|grep redis
LISTEN 0 511 127.0.0.1:6379 *:* users:(("redis-server",pid=4169,fd=6))
修改redis.conf配置
]# vim /apps/redis/etc/redis.conf
bind 0.0.0.0 <--修改监听地址
#重启redis服务
]# systemctl restart redis
# 主机名/IP地址 端口
]# redis-cli -h HOSTNAME/IP -p PORT
3. 跨主机密码连接(requirepass 123456)
修改redis.conf配置
]# vim /apps/redis/etc/redis.conf
requirepass 123456 <--密码 123456
#重启redis服务
]# systemctl restart redis
# 主机名/IP地址 端口 密码
]# redis-cli -h HOSTNAME/IP -p PORT -a password
4. shell脚本写入数据到Redis
脚本内容
]# cat redis-shell.sh
#!/bin/bash
NUM=`seq 1 1000`
for i in ${NUM};do
redis-cli -h 192.168.1.101 -p 6379 -a 123456 set key-${i} value-${i}
echo "key-${i} value-${i} 写入完成"
done
echo "一千个key写入到Redis完成"
需要关闭rdb
~]# vim /apps/redis/etc/redis.conf
#设置以下选项
...
save ""
#save 900 1
#save 300 10
#save 60 10000
...
#重启redis服务
]# systemctl restart redis
~]# time bash redis-shell.sh
...
key-998 value-998 写入完成
OK
key-999 value-999 写入完成
OK
key-1000 value-1000 写入完成
一千个key写入到Redis完成
real 0m4.361s
user 0m0.451s
sys 0m2.600s
~]# redis-cli -h 192.168.1.101 -p 6379 -a 123456
#可以看到刚刚生成的KEY
192.168.1.101:6379> KEYS *
#查看某个key的值
192.168.1.101:6379> get key-123
"value-123" <--
#用于清空当前数据库中的所有key【redis默认有16个库、可用'SELECT 0-15'切换】
192.168.1.101:6379> FLUSHDB <--慎用!!!
OK
#用于清空所有数据库中的所有key
192.168.1.101:6379> FLUSHALL <--慎用!!!
OK
5. python连接方式
#如果版本低报错、卸载后、用下方'新版本'命令
~]# yum install python-pip -y
~]# pip install redis
#'新版本'
~]# yum install python3-pip -y
~]# pip3 install redis
# vim redis-python.py
#!/bin/bash python
import redis
import time
pool = redis.ConnedtionPool(host="192.168.1.1",port=6379,password="")
r = redis.Redis(connection_pool=pool)
for i in range(100):
r.set("k%d" % i,"v%d" % i)
time.sleep(1)
data=r.get("k%d" % i)
print(data)
redis配置文件
#监听地址,可用空格隔开后多个监听IP
bind 0.0.0.0
#redis3.2之后加入新特性,在没有设置bind IP和密码的时候,redis只允许访问127.0.0.1:6379,远程访问将提示警告信息并拒绝远程访问
protected—mode yes
#监听端口
port 6379
#三次握手的时候server端收到client ack确认号之后的队列值。
tcp-backlog 511
#客户端和Redis服务端的连接超时时间,默认是0,表示永不超时。
timeout 0
#tcp 会话保持时间
tcp-keepalive 300
#认情况下 redis 不是作为守护进程运行的,如果你想让他在后台运行,你就把它改成yes,当redis作为守护进程运行的时候,它会写一个pid到/var/run/redis.pid文件里面
daemonize no
#和操作系统相关参数,可以设置通过upstart和systemd管理Redis守护进程,centos 7以后都便用systemd
supervised no
#pid文件路径
pidfile /var/run/redis_6379.pid
#日志级别
loglevel notice
#日志路径(/apps/redis/log/redis_6379.log)
logfire ""
#设置db库数量,默认16个库
databases 16
#在启动redis时是否显示log
always-show-logo yes
#在900秒内有一个键内发生更改就出就快照机制
server 900 1
server 300 10
server 60 10000
#快照出错时是否禁止redis写入操作
stop-writes-on-bgsave-error no
#持久化到RDB文件时,是否压缩,“yes”为压缩,“no”则反之
rdbcompression yes
#是否开启RC64校验,默认时开启
rdbchecksum yes
#快照文件名
dbfilename dump.rdb
#快照文件保存路径("/apps/redis/data")
dir ./
#当从库同主库失去连接或者复制正在进行,从机库有两种运行方式
replica-server-stale-data yes
1、如果replica-server-stale-data设置为yes(默认设置),从库会继续响应客户端的读请求。
2、如果replica-server-stale-data设置为no,除去指定的命令之外的任何请求都会返回一个错误"SYNC with master in progress".
#是否设置从库只读
replica-read-only yes
#是否使用socket方式复制数据(无盘同步),新slave连接连接时候需要做数据的全量同步,redis server就要从内存dump出新的RDB文件,然后从master传到slave,有两种方式把RDB文件传输给客户端:
repl-diskless-syne no
1、基于硬盘(disk-backed):master创建一个新进程dump RDB,RDB完成之后有父进程(即主进程)传给slaves。
2、基于socket(diskless):master创建一个新进程直接dump RDB到slave的socket,不经过主进程,不经过硬盘。
基于硬盘的话,RDB文件创建后,一旦创建完毕,可以同时服务更多的slave,但时基于socket的话,新slave连接到master之后得逐个同步数据。
在较慢并且网络较快的时候,可以用diskless(磁盘慢设为yes),否则使用磁盘(磁盘快设为no)
#diskless复制的延迟时间,设置0为关闭,在延迟时间内连接的新客户端,会一起通过disk方式同步数据,但是一旦复制开始还没有结束之前,master节点不会在接受新的slave的复制请求,直到下一次同步开始。
repl-diskless-sync-delay 30
#slave根据master指定的时间进行周期性的PING监测
repl-ping-slave-period 10
#复制连接的超时时间,需要大于repl-ping-slave-period,否则会经常超时
repl-timeout 60
#在socket模式下是否在slave套接字发送SYNC之后禁用TCP_NODELAY,如果选择“yes”,redis将使用更少的TCP包和带宽来向slaves发送数据,但是这将使数据传输到slave上有延迟,Linux内核的默认配置会达到40毫秒,如果你选择了“no”,数据传输到salve的延迟将会减少但要使用更多的带宽。
repl-disable-tcp-nodelay no
#复制缓冲区内存大小,只有在slave连接之后才分配内存
repl-backlog-size 512mb
#多次时间master没有slave连接,就清空backlog缓冲区
repl-backlog-ttl 3600
#当master不可用,Sentinel会根据slave的优先级选举一个master,最低的优先级slave,当选master,而配置成0,永远不会被选举。
replica-priority 100
#设置redis 连接密码
requirepass foobared
#重命名一些高危命令
rename-command
#Redis最大连接客户端
maxclients 10000
#最大内存,单位为bytes字节,8G内存的计算方式8(G)1024(MB)1024(KB)*1024(Kbyte),需要注意的时slave的输出缓冲区是不计算在maxmemory内。
maxmemory
#是否开启AOF日志记录,默认redis使用的时rdb方式持久化,这种方式在许多应用中已经足够用了,但是redis如果中途宕机,会导致可能有几分钟的数据丢失(取决于dumpd数据的间隔时间),根据save来策略进行持久化,Append Only File是另一种持久化方式,可以提供更好的持久化特征,Redis会把每次写入的数据在接收后都写入appendonly.aof文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。
appendonly yes
#AOF文件名
appendfilename "appendonly.aof"
#aof持久化策略的配置,no表示不执行fsync,由操作系统保证数据同步到磁盘,always表示每次写入都执行fsync,以保证数据同步到磁盘,everysec表示每秒执行一次fsync,可能会导致丢失这1s数据。
appendfsync everysec
#在aof rewrite期间,是否对aof新纪录的append暂缓使用文件同步策略,主要考虑磁盘IO开支和请求阻塞时间。默认为no,表示"不暂缓",新的aof记录仍然会被立即同步,Linux的默认fsync策略是30秒,如果为yes可能丢失30秒数据,但由于yes性能较好而且会避免出现阻塞因此比较推荐。
no-appendfsync-on-rewrite no
#当aof log增长超过指定百分比例时,重新AOF文件,设置为0表示不指定重写Aof日志,重写是为了是aof体积保持最小,但是还可以确保保存最完整的数据
auto-aof-rewrite-percentage 100
#触发aof rewrite的最小文件大小
auto-aof-rewrite-min-size 64mb
#是否加载由于其他原因导致的末尾异常的AOF文件(主进程被kill/断电等)
aof-load-truncated yes
#redis4.0新增RDB-AOF混合持久化格式,在开启这个功能之后,AOF重写产生的文件将同时包含RDB格式的内容和AOF格式的内容,其中RDB格式的内容用于记录已有的数据,而AOF格式的内存则用于记录最近发生了变化的数据,这样Redis就可以同时兼有RDB持久化和AOF持久化的优点(既能够快速的生成重新文件,也能够在出现问题时,快速的载入数据)。
aof-use-rdb-preamble yes
#lua脚本的最大执行时间,单位为毫秒
lua-time-limit 10000
#是否开启集群模式,默认时单机模式
cluster-enabled yes
#由node节点自动生成的集群配置文件
cluster-config-file nodes-6379.conf
#集群中node节点连接超时时间
cluster-node-timeout 15000
#在执行故障转移的时候可能有些节点和master断开一段时间数据比较旧,这些节点就不适用于选举为master,超过这个时间就不会被进行故障转移
cluster-replica-validity-factor 10
#集群迁移屏障,一个主节点拥有的至少正常工作的从节点,及如果主节点的slave节点故障后会将多余的从节点分配到当前节点成为其新的从节点。
cluster-migration-barrler 1
#集群请求槽位全部覆盖,如果一个主库宕机也没有备份库就会出现集群槽位不全,那么yes情况下redis集群槽位验证不全就不再对外提供服务,而no则可以继续使用但是会出现查询数据查不到的情况(因为有数据丢失)。
cluster-require-full-coverage no
#Slow log是Redis用来记录查询执行时间的日志系统,slow log保存在内存里面,读写速度非常快,因此你可以放心的使用它,不必担心因为开启slow log而损害Redis的速度
#以微妙为单位的慢日志记录,为负数会禁用慢日志,为0会记录每个命令操作。
slowlog-log-slower-than 10000
#记录多少条慢日志保存在队列,超出后会删除最早的,以此滚动删除。
slowlog-max-len 128
Redis持久化
redis 虽然是一个内存级别的缓存程序,即 redis 是使用内存进行数据的缓存的,但是其可以将内存的数据按照一定的策略保存到硬盘上,从而实现数据持久保存的目的, redis 支持两种不同方式的数据持久化保存机制,分别是
RDB和AOF
RDB 模式:
RDB: 基于时间的快照, 只保留当前最新的一次快照, 特点是执行速度比较快,缺点是可能会丢失从上次快照到当前时间点之间未做快照的数据。
RDB 实现的具体过程 Redis 从主进程先 fork 出一个子进程,使用写时复制机制,子进程将内存的数据保存为一个临时文件,比如 dump.rdb.temp,当数据保存完成之后再将上一次保存的 RDB 文件替换掉,然后关闭子进程,这样可以保存每一次做 RDB 快照的时候保存的数据都是完整的,因为直接替换 RDB 文件的时候可能会出现突然断电等问题而导致 RDB 文件还没有保存完整就突然关机停止保存而导致数据丢失的情况,可以手动将每次生成的 RDB 文件进程备份,这样可以最大化保存历史数据。
RDB 模式的优缺点
-
优点:
-
- RDB 快照保存了某个时间点的数据,可以通过脚本执行 bgsave(非阻塞)或者 save(阻塞)命令自定义时间点备份,可以保留多个备份,当出现问题可以恢复到不同时间点的版本。-可以最大化 IO 的性能,因为父进程在保存 RDB 文件的时候唯一要做的是 fork 出一个子进程,然后的-操作都会有这个子进程操作,父进程无需任何的 IO 操作
-
- RDB 在大量数据比如几个 G 的数据,恢复的速度比 AOF 的快
-
缺点:
-
- 不能时时的保存数据,会丢失自上一次执行 RDB 备份到当前的内存数据
-
- 数据量非常大的时候,从父进程 fork 的时候需要一点时间,可能是毫秒或者秒或者分钟,取决于磁盘 IO 性能。
AOF 模式
AOF:按照操作顺序依次将操作添加到指定的日志文件当中,特点是数据安全性相对较高, 缺点是即使有些操作是重复的也会全部记录。
AOF 和 RDB 一样使用了写时复制机制, AOF 默认为每秒钟 fsync 一次,即将执行的命令保存到 AOF文件当中,这样即使 redis 服务器发生故障的话顶多也就丢失 1 秒钟之内的数据,也可以设置不同的 fsync 策略,或者设置每次执行命令的时候执行 fsync, fsync 会在后台执行线程,所以主线程可以继续处理用户的正常请求而不受到写入 AOF 文件的 IO 影响
AOF 模式优缺点:
- AOF 的文件大小要大于 RDB 格式的文件根据所使用的 fsync 策略(fsync 是同步内存中 redis 所有已经修改的文件到存储设备),默认是append fsync everysec,即每秒执行一次 fsync