redis常规配置
wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz
tar -zxvftcl8.6.1-src.tar.gz
cd tcl8.6.1
cd tcl8.6.1
./configure
make &&make install
wget https://codeload.github.com/antirez/redis/tar.gz/2.8.21--no-check-certificate
tar -zxvf 2.8.21
cd redis-2.8.21/
make test
*** [err]: Detectwrite load to master in tests/integration/replication-psync.tcl
#在速度较慢的机器上执行make test可能出现下列错误,无影响
make prefix= install
mkdir -p/usr/local/redies/{bin,conf,logs}
cp -a -R -psrc/redis-server /usr/local/redies/bin/
cp -a -R -psrc/redis-sentinel /usr/local/redies/bin/
cp -a -R -psrc/redis-check-dump /usr/local/redies/bin/
cp -a -R -psrc/redis-check-aof /usr/local/redies/bin/
cp -a -R -psrc/redis-cli /usr/local/redies/bin/
cp -a -R -psrc/redis-benchmark /usr/local/redies/bin/
启动
/usr/local/redies/bin/redis-server
注释:
redis 的默认端口号是6379
redis有两种存储方式,
默认是snapshot方式,实现方法是定时将内存的快照(snapshot)持久化到硬盘,这种方式缺点是持久化之后如果出现crash则会丢失一段数据
aof方式,即append only mode,在写入内存数据的同时将操作命令保存到日志文件
后台形式运行redis,默认复制过去的redis.conf文件daemonize参数为no,所以不会在后台运行。
[root@localhostredis-2.8.21]# ll
总计 208
-rw-rw-r-- 1 rootroot 32625 06-04 17:32 00-RELEASENOTES
-rw-rw-r-- 1 rootroot 53 06-04 17:32 BUGS
-rw-rw-r-- 1 rootroot 1439 06-04 17:32 CONTRIBUTING
-rw-rw-r-- 1 rootroot 1487 06-04 17:32 COPYING
drwxrwxr-x 6 rootroot 4096 07-23 01:57 deps
-rw-r--r-- 1 rootroot 18 07-23 21:53 dump.rdb
-rw-rw-r-- 1 rootroot 11 06-04 17:32 INSTALL
-rw-rw-r-- 1 rootroot 151 06-04 17:32 Makefile
-rw-rw-r-- 1 rootroot 4223 06-04 17:32 MANIFESTO
-rw-rw-r-- 1 rootroot 5201 06-04 17:32 README
-rw-rw-r-- 1 rootroot 36141 06-04 17:32 redis.conf
-rwxrwxr-x 1 rootroot 271 06-04 17:32 runtest
-rwxrwxr-x 1 rootroot 281 06-04 17:32 runtest-sentinel
-rw-rw-r-- 1 rootroot 7109 06-04 17:32 sentinel.conf
drwxrwxr-x 2 rootroot 4096 07-23 21:29 src
drwxrwxr-x 9 rootroot 4096 06-04 17:32 tests
drwxrwxr-x 3 rootroot 4096 06-04 17:32 utils
[root@localhostredis-2.8.21]# cp redis.conf /usr/local/redies/
bin/ conf/ logs/
[root@localhostredis-2.8.21]# cp redis.conf /usr/local/redies/conf/
[root@localhostredis-2.8.21]# cd /usr/local/redies/conf/
[root@localhostconf]# ls
redis.conf
[root@localhostconf]# vim redis.conf
修改其37行
daemonize yes
后台启动
/usr/local/redies/bin/redis-server/usr/local/redies/conf/redis.conf
ps aux | grep redis
启动多个redis实例
复制配置文件为其他名称,例如redis6380.conf
cp/usr/local/redies/conf/redis.conf /usr/local/redies/conf/redis6380.conf
vim/usr/local/redies/conf/redis6380.conf
修改其45行
port 6380
启动第二个服务
/usr/local/redies/bin/redis-server/usr/local/redies/conf/redis6380.conf
ps aux | grep redis 可以查看到有2个进程
调用服务
/usr/local/redies/bin/redis-cli
增加set 获取get 删除 del 模糊查找keys
info 查看redis信息
127.0.0.1:6379>info
# Server
redis_version:2.8.21
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:2e41229a123e3da5
redis_mode:standalone
os:Linux2.6.18-164.el5 i686
arch_bits:32
multiplexing_api:epoll
gcc_version:4.1.2
process_id:21734
run_id:db82fa4902c83e25ac885cf8df6618dffd16bab8
tcp_port:6379
uptime_in_seconds:822
uptime_in_days:0
hz:10
lru_clock:11597683
config_file:/usr/local/redies/conf/redis.conf
# Clients
connected_clients:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
# Memory
used_memory:634064
used_memory_human:619.20K
used_memory_rss:1691648
used_memory_peak:634064
used_memory_peak_human:619.20K
used_memory_lua:24576
mem_fragmentation_ratio:2.67
mem_allocator:jemalloc-3.6.0
# Persistence
loading:0
rdb_changes_since_last_save:8
rdb_bgsave_in_progress:0
rdb_last_save_time:1437660221
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:-1
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
# Stats
total_connections_received:1
total_commands_processed:17
instantaneous_ops_per_sec:0
total_net_input_bytes:558
total_net_output_bytes:252
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:4
keyspace_misses:3
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
# CPU
used_cpu_sys:0.08
used_cpu_user:0.00
used_cpu_sys_children:0.00
used_cpu_user_children:0.00
# Keyspace
db0:keys=4,expires=0,avg_ttl=0
127.0.0.1:6379>
redis.conf 配置参数解析(后面有更详细解释)
############################常用##########################################
daemonize yes 是否作为守护进程运行(是否后台运行)
pidfile redis.pid 如果后台运行则需要指定一个pid
port 6379 redis监听的端口
tcp-backlog 511 tcp监听的最大容纳数量
bind 127.0.0.1 绑定主机
timeout 300 客户端闲置多少秒后,断开连接
tcp-keepalive 0 tcp心跳包
logfile notice 定义日志级别
logfile"" 指定日志文件的位置
databases 16 可用数据库数
save 900 1 当有一条key数据被改变,900秒刷新到disk一次
save 300 10 当有10条key数据被改变,300秒刷新到disk一次
save 60 10000 当有1w条key数据被改变时,60秒刷新到disk一次
stop-writes-on-bgsave-erroryes 如果最后一次保存失败,则停止接受写操作
rdbcompression yes 是否在dump .rdb数据库的时候使用LZF压缩字符串
rdbchecksum yes 是否校验rdb文件
dbfilename dump.rdb 本地数据库文件名
dir ./ 本地数据存放路径
############################主从复制##########################################
# slaveof<masterip> <masterport> 当本机为从服务时,设置主服务的ip及端口
# masterauth<master-password> 当本机为从服务时,设置主服务的连接密码
slave-serve-stale-datayes 当slave与master断开或正复制slave表现
slave-read-only yes 配置slave实体是否接受写入操作
#repl-ping-slave-period 10 每10秒向主库发送ping
# repl-timeout 60 主库批量数据传输及ping回复,要大于ping时间
repl-disable-tcp-nodelayno 发送到slave的延迟降低
# repl-backlog-size1mb 设置复制的后台日志大小
# repl-backlog-ttl3600 master不再连接slave后,释放日志时间
slave-priority 100 master宕机后,多个slave中值最小的升为master
# maxclients 10000 最大客户端连接数
# maxmemory<bytes> 最大内存使用设置
appendonly no 是否在每次更新后进行日志记录
appendfilename"appendonly.aof" 更新日志文件名
# appendfsyncalways 更新日志条件 always每次更新后手动调用
appendfsynceverysec everysec每秒同步一次
# appendfsync no no等操作系统进行数据缓存同步到磁盘
############################虚拟内存#########################################
vm-enabled no 是否开启vm功能
vm-swap-file/tmp/redis.swap 虚拟文件路径
vm-max-memory 0 将所有大于此项数据存入虚拟内存
vm-page-size 32
vm-page 134217728
vm-max-threads 4
注:(最后有更详细解释)
redis 主从切换
环境介绍:
master 192.168.0.151 redis, sentinel
slave1 192.168.0.199 redis, sentinel
slave2 192.168.0.243 redis, sentinel
-----安装redis
wgethttp://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz
tar -zxvf tcl8.6.1-src.tar.gz
cd tcl8.6.1
cd unix/
./configure
make
make install
wgethttps://codeload.github.com/antirez/redis/tar.gz/2.8.21 --no-check-certificate
tar -zxvf 2.8.21
cd redis-2.8.21/
make prefix=install
make test
mkdir -p /usr/local/redis/{bin,conf,logs}
cd /soft/redis-2.8.21/
cp -a -R -p src/redis-server /usr/local/redis/bin/
cp -a -R -p src/redis-sentinel /usr/local/redis/bin/
cp -a -R -p src/redis-check-dump /usr/local/redis/bin/
cp -a -R -p src/redis-check-aof /usr/local/redis/bin/
cp -a -R -p src/redis-cli /usr/local/redis/bin/
cp -a -R -p src/redis-benchmark /usr/local/redis/bin/
cp redis.conf /usr/local/redis/conf/redis.conf
vim /usr/local/redis/conf/redis.conf
修改成daemonize yes
###########以上为3台机器的公共配置#################
-----修改主服务器配置文件
[root@localhostconf]# pwd
/usr/local/redies/conf
[root@localhostconf]# vim redies.conf
添加
masterauthredispass
requirepassredispass
-----修改2台从服务器配置文件
[root@localhostconf]# pwd
/usr/local/redies/conf
[root@localhostconf]# vim redies.conf
添加
slaveof192.168.0.151 6379
masterauthredispass
requirepassredispass
-----启动主和从服务器
/usr/local/redis/bin/redis-server/usr/local/redis/conf/redis.conf
-----查看主redis的信息
[root@localhost ~]#/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 -a redispass inforeplication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.0.199,port=6379,state=online,offset=169,lag=0
slave1:ip=192.168.0.243,port=6379,state=online,offset=169,lag=1
master_repl_offset:169
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:168
-----查看从redis的信息
########第一台从服务器
[root@localhost ~]#/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 -a redispass inforeplication
# Replication
role:slave
master_host:192.168.0.151
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:183
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
######第二台从服务器
[root@localhost ~]#/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 -a redispass inforeplication
# Replication
role:slave
master_host:192.168.0.151
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:183
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
-----测试主从同步是否成功
######在master操作
######在slave操作
可以看出主从同步成功,在从上添加失败,因为"开起了只读模式,所以从将不能写入数据,可以保证数据只从主服务器同步至从服务器"
-----配置redis sentinel集群监控服务
master添加一份vim /usr/local/redis/conf/sentinel.conf(也可以在安装文件下修改复制)
port 26379
dir /usr/local/redis
sentinel monitormymaster 192.168.0.151 6379 2
sentinel auth-passmymaster redispass
sentineldown-after-milliseconds mymaster 30000
sentinelparallel-syncs mymaster 1
sentinelfailover-timeout mymaster 180000
sentinelcan-failover mymaster yes(该句可能出错,可以删除)
slave1添加一份vim /usr/local/redis/conf/sentinel.conf(也可以在安装文件下修改复制)
port 26479
dir/usr/local/redis
sentinel monitormymaster 192.168.0.151 6379 2
sentinel auth-passmymaster redispass
sentineldown-after-milliseconds mymaster 30000
sentinelparallel-syncs mymaster 1
sentinelfailover-timeout mymaster 180000
sentinelcan-failover mymaster yes(该句可能出错,可以删除)
slave2添加一份vim /usr/local/redis/conf/sentinel.conf(也可以在安装文件下修改复制)
port 26579
dir/usr/local/redis
sentinel monitormymaster 192.168.0.151 6379 2
sentinel auth-passmymaster redispass
sentineldown-after-milliseconds mymaster 30000
sentinelparallel-syncs mymaster 1
sentinelfailover-timeout mymaster 180000
sentinelcan-failover mymaster yes(该句可能出错,可以删除)
-----分别在主从上启动sentinel(注意:此时redis是开着的)
/usr/local/redis/bin/redis-sentinelsentinel.conf --sentinel
注意观察日志会在本机上显示另2台机器加入到集群中
-----关闭master服务器
master显示离开集群
[15798] 28 Jul00:45:37.816 # +odown master mymaster 192.168.0.151 6379 #quorum 3/2
slave显示master离开集群
[17640] 28 Jul 00:45:39.139# -odown master mymaster 192.168.0.151 6379
[17640] 28 Jul00:45:39.139 # +failover-end master mymaster 192.168.0.151 6379
slave间开始选择并升级成master,显示现象
[17640] 28 Jul00:45:39.139 # +switch-master mymaster 192.168.0.151 6379 192.168.0.243 6379
-----查询状态
###############slave1上查询
[root@localhost ~]#/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 -a redispass inforeplication
# Replication
role:slave
master_host:192.168.0.243
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:16351
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
#######slave2上查询
[root@localhost ~]#/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 -a redispass inforeplication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.0.199,port=6379,state=online,offset=18480,lag=0
master_repl_offset:18480
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:18479
以上说明,master掉线后,slave之间选择了一台升级为master
-----重新启动原master,观察状态
[root@localhostconf]# /usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 -a redispass inforeplication
# Replication
role:slave
master_host:192.168.0.243
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:414898
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
#########查看现master状态
[root@localhost ~]#/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 -a redispass inforeplication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.0.199,port=6379,state=online,offset=410640,lag=0
slave1:ip=192.168.0.151,port=6379,state=online,offset=410640,lag=0
master_repl_offset:410922
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:410921
说明在原master启动后,并没有重新将master移交出去
选举算法如下:(偶不大懂)
“每个sentinel实例都持有其他的sentinels信息,在Leader选举过程中(当为leader的sentinel实例失效时,有可能master server并没失效,注意分开理解),sentinel实例将从所有的sentinels集合中去除“can-failover = no”和状态为SDOWN的sentinels,在剩余的sentinels列表中按照runid按照“字典”顺序排序后,取出runid最小的sentinel实例,并将它“投票选举”为Leader,并在其他sentinel发送的“is-master-down-by-addr”指令时将推选的runid追加到响应中。每个sentinel实例都会检测“is-master-down-by-addr”的响应结果,如果“投票选举”的leader为自己,且状态正常的sentinels实例中,“赞同者”的自己的sentinel个数不小于(>=) 50% + 1,且不小与<quorum>,那么此sentinel就会认为选举成功且leader为自己。
在sentinel.conf文件中,我们期望有足够多的sentinel实例配置“can-failoveryes”,这样能够确保当leader失效时,能够选举某个sentinel为leader,以便进行failover。如果leader无法产生,比如较少的sentinels实例有效,那么failover过程将无法继续。
在Leader触发failover之前,首先wait数秒(随即0~5),以便让其他sentinel实例准备和调整(有可能多个leader??),如果一切正常,那么leader就需要开始将一个salve提升为master,此slave必须为状态良好(不能处于SDOWN/ODOWN状态)且权重值最低(redis.conf中)的,当master身份被确认后,开始failover”
以上为常用设置,以下为文件全文配置解析(2.8为例)
daemonizeno 默认情况下, redis 不是在后台运行的,如果需要在后台运行,把该项的值更改为 yes
daemonizeyes
# 当 redis 在后台运行的时候, Redis 默认会把 pid 文件放在 /var/run/redis.pid ,你可以配置到其他地址。
# 当运行多个 redis 服务时,需要指定不同的 pid 文件和端口
pidfile/var/run/redis_6379.pid
# 指定 redis 运行的端口,默认是 6379
port6379
# 在高并发的环境中,为避免慢客户端的连接问题,需要设置一个高速后台日志
tcp-backlog511
# 指定 redis 只接收来自于该 IP 地址的请求,如果不进行设置,那么将处理所有请求
#bind 192.168.1.100 10.0.0.1
#bind 127.0.0.1
# 设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接
#0 是关闭此设置
timeout0
#TCP keepalive
# 在 Linux 上,指定值(秒)用于发送 ACKs 的时间。注意关闭连接需要双倍的时间。默认为 0 。
tcp-keepalive0
# 指定日志记录级别,生产环境推荐 notice
#Redis 总共支持四个级别: debug 、 verbose 、 notice 、 warning ,默认为verbose
#debug 记录很多信息,用于开发和测试
#varbose 有用的信息,不像 debug 会记录那么多
#notice 普通的 verbose ,常用于生产环境
#warning 只有非常重要或者严重的信息会记录到日志
loglevelnotice
# 配置 log 文件地址
# 默认值为 stdout ,标准输出,若后台模式会输出到 /dev/null 。
logfile/var/log/redis/redis.log
# 可用数据库数
# 默认值为 16 ,默认数据库为 0 ,数据库范围在 0- ( database-1 )之间
databases16
################################ 快照 #################################
# 保存数据到磁盘,格式如下 :
# save<seconds> <changes>
# 指出在多长时间内,有多少次更新操作,就将数据同步到数据文件 rdb 。
# 相当于条件触发抓取快照,这个可以多个条件配合
# 比如默认配置文件中的设置,就设置了三个条件
# save900 1 900 秒内至少有 1 个 key 被改变
# save300 10 300 秒内至少有 300 个 key 被改变
# save60 10000 60 秒内至少有 10000 个 key 被改变
#save 900 1
#save 300 10
#save 60 10000
# 后台存储错误停止写。
stop-writes-on-bgsave-erroryes
# 存储至本地数据库时(持久化到 rdb 文件)是否压缩数据,默认为 yes
rdbcompressionyes
#RDB 文件的是否直接偶像 chcksum
rdbchecksumyes
# 本地持久化数据库文件名,默认值为 dump.rdb
dbfilenamedump.rdb
# 工作目录
# 数据库镜像备份的文件放置的路径。
# 这里的路径跟文件名要分开配置是因为 redis 在进行备份时,先会将当前数据库的状态写入到一个临时文件中,等备份完成时,
# 再把该该临时文件替换为上面所指定的文件,而这里的临时文件和上面所配置的备份文件都会放在这个指定的路径当中。
#AOF 文件也会存放在这个目录下面
# 注意这里必须制定一个目录而不是文件
dir/var/lib/redis-server/
################################# 复制 #################################
# 主从复制 . 设置该数据库为其他数据库的从数据库 .
# 设置当本机为 slav 服务时,设置 master 服务的 IP 地址及端口,在 Redis 启动时,它会自动从 master 进行数据同步
#slaveof <masterip><masterport>
# 当 master 服务设置了密码保护时 ( 用 requirepass 制定的密码 )
#slave 服务连接 master 的密码
#masterauth <master-password>
# 当从库同主机失去连接或者复制正在进行,从机库有两种运行方式:
#1) 如果 slave-serve-stale-data 设置为 yes( 默认设置 ) ,从库会继续响应客户端的请求
#2) 如果 slave-serve-stale-data 是指为 no ,出去 INFO 和 SLAVOF 命令之外的任何请求都会返回一个
# 错误 "SYNC withmaster in progress"
slave-serve-stale-datayes
# 配置 slave 实例是否接受写。写 slave 对存储短暂数据(在同 master 数据同步后可以很容易地被删除)是有用的,但未配置的情况下,客户端写可能会发送问题。
# 从 Redis2.6 后,默认 slave 为 read-only
slaveread-onlyyes
# 从库会按照一个时间间隔向主库发送 PINGs. 可以通过 repl-ping-slave-period 设置这个时间间隔,默认是 10 秒
#repl-ping-slave-period 10
#repl-timeout 设置主库批量数据传输时间或者 ping 回复时间间隔,默认值是 60 秒
# 一定要确保 repl-timeout 大于 repl-ping-slave-period
#repl-timeout 60
# 在 slave socket 的 SYNC 后禁用 TCP_NODELAY
# 如果选择“ yes ” ,Redis 将使用一个较小的数字 TCP 数据包和更少的带宽将数据发送到 slave , 但是这可能导致数据发送到 slave 端会有延迟 , 如果是 Linux kernel 的默认配置,会达到 40 毫秒 .
# 如果选择 "no" ,则发送数据到 slave 端的延迟会降低,但将使用更多的带宽用于复制 .
repl-disable-tcp-nodelayno
# 设置复制的后台日志大小。
# 复制的后台日志越大, slave 断开连接及后来可能执行部分复制花的时间就越长。
# 后台日志在至少有一个 slave 连接时,仅仅分配一次。
#repl-backlog-size 1mb
# 在 master 不再连接 slave 后,后台日志将被释放。下面的配置定义从最后一个slave 断开连接后需要释放的时间(秒)。
#0 意味着从不释放后台日志
#repl-backlog-ttl 3600
# 如果 master 不能再正常工作,那么会在多个 slave 中,选择优先值最小的一个slave 提升为 master ,优先值为 0 表示不能提升为 master 。
slave-priority100
# 如果少于 N 个 slave 连接,且延迟时间 <=M 秒,则 master 可配置停止接受写操作。
# 例如需要至少 3 个 slave 连接,且延迟 <=10 秒的配置:
#min-slaves-to-write 3
#min-slaves-max-lag 10
# 设置 0 为禁用
# 默认 min-slaves-to-write 为 0 (禁用), min-slaves-max-lag 为 10
################################## 安全 ###################################
# 设置客户端连接后进行任何其他指定前需要使用的密码。
# 警告:因为 redis 速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行 150K 次的密码尝试,这意味着你需要指定非常非常强大的密码来防止暴力破解
#requirepass foobared
# 命令重命名 .
# 在一个共享环境下可以重命名相对危险的命令。比如把 CONFIG 重名为一个不容易猜测的字符。
# 举例 :
#rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
# 如果想删除一个命令,直接把它重命名为一个空字符 "" 即可,如下:
#rename-command CONFIG ""
################################### 约束 ###################################
# 设置同一时间最大客户端连接数,默认无限制, Redis 可以同时打开的客户端连接数为 Redis 进程可以打开的最大文件描述符数,
# 如果设置 maxclients0 ,表示不作限制。
# 当客户端连接数到达限制时, Redis 会关闭新的连接并向客户端返回 max number ofclients reached 错误信息
#maxclients 10000
# 指定 Redis 最大内存限制, Redis 在启动时会把数据加载到内存中,达到最大内存后, Redis 会按照清除策略尝试清除已到期的 Key
# 如果 Redis 依照策略清除后无法提供足够空间,或者策略设置为 ”noeviction” ,则使用更多空间的命令将会报错,例如 SET, LPUSH 等。但仍然可以进行读取操作
# 注意: Redis 新的 vm 机制,会把 Key 存放内存, Value 会存放在 swap 区
# 该选项对 LRU 策略很有用。
#maxmemory 的设置比较适合于把 redis 当作于类似 memcached 的缓存来使用,而不适合当做一个真实的 DB 。
# 当把 Redis 当做一个真实的数据库使用的时候,内存使用将是一个很大的开销
#maxmemory <bytes>
# 当内存达到最大值的时候 Redis 会选择删除哪些数据?有五种方式可供选择
#volatile-lru -> 利用 LRU 算法移除设置过过期时间的 key (LRU: 最近使用 LeastRecentlyUsed )
#allkeys-lru -> 利用 LRU 算法移除任何 key
#volatile-random -> 移除设置过过期时间的随机 key
#allkeys->random -> remove a randomkey, any key
#volatile-ttl -> 移除即将过期的 key(minor TTL)
#noeviction -> 不移除任何可以,只是返回一个写错误
# 注意:对于上面的策略,如果没有合适的 key 可以移除,当写的时候 Redis 会返回一个错误
# 默认是 : volatile-lru
#maxmemory-policy volatile-lru
#LRU 和 minimal TTL 算法都不是精准的算法,但是相对精确的算法 ( 为了节省内存 ) ,随意你可以选择样本大小进行检测。
#Redis 默认的灰选择 3 个样本进行检测,你可以通过 maxmemory-samples 进行设置
#maxmemory-samples 3
##############################AOF###############################
# 默认情况下, redis 会在后台异步的把数据库镜像备份到磁盘,但是该备份是非常耗时的,而且备份也不能很频繁,如果发生诸如拉闸限电、拔插头等状况,那么将造成比较大范围的数据丢失。
# 所以 redis 提供了另外一种更加高效的数据库备份及灾难恢复方式。
# 开启 append only 模式之后, redis 会把所接收到的每一次写操作请求都追加到appendonly.aof 文件中,当 redis 重新启动时,会从该文件恢复出之前的状态。
# 但是这样会造成 appendonly.aof 文件过大,所以 redis 还支持了BGREWRITEAOF 指令,对 appendonly.aof 进行重新整理。
# 你可以同时开启 asynchronousdumps 和 AOF
appendonlyno
#AOF 文件名称 ( 默认 :"appendonly.aof")
#appendfilename appendonly.aof
#Redis 支持三种同步 AOF 文件的策略 :
#no: 不进行同步,系统去操作 . Faster.
#always: always 表示每次有写操作都进行同步 . Slow, Safest.
#everysec: 表示对写操作进行累积,每秒同步一次 . Compromise.
# 默认是 "everysec" ,按照速度和安全折中这是最好的。
# 如果想让 Redis 能更高效的运行,你也可以设置为 "no" ,让操作系统决定什么时候去执行
# 或者相反想让数据更安全你也可以设置为 "always"
# 如果不确定就用 "everysec".
#appendfsync always
appendfsynceverysec
#appendfsync no
#AOF 策略设置为 always 或者 everysec 时,后台处理进程 ( 后台保存或者 AOF 日志重写 ) 会执行大量的 I/O 操作
# 在某些 Linux 配置中会阻止过长的 fsync() 请求。注意现在没有任何修复,即使fsync 在另外一个线程进行处理
# 为了减缓这个问题,可以设置下面这个参数 no-appendfsync-on-rewrite
no-appendfsync-on-rewriteno
#AOF 自动重写
# 当 AOF 文件增长到一定大小的时候 Redis 能够调用 BGREWRITEAOF 对日志文件进行重写
# 它是这样工作的: Redis 会记住上次进行些日志后文件的大小 ( 如果从开机以来还没进行过重写,那日子大小在开机的时候确定 )
# 基础大小会同现在的大小进行比较。如果现在的大小比基础大小大制定的百分比,重写功能将启动
# 同时需要指定一个最小大小用于 AOF 重写,这个用于阻止即使文件很小但是增长幅度很大也去重写 AOF 文件的情况
# 设置 percentage 为 0 就关闭这个特性
auto-aof-rewrite-percentage100
auto-aof-rewrite-min-size64mb
################################LUASCRIPTING #############################
# 一个 Lua 脚本最长的执行时间为 5000 毫秒( 5 秒),如果为 0 或负数表示无限执行时间。
lua-time-limit5000
################################LOWLOG################################
#Redis Slow Log 记录超过特定执行时间的命令。执行时间不包括 I/O 计算比如连接客户端,返回结果等,只是命令执行时间
# 可以通过两个参数设置 slow log :一个是告诉 Redis 执行超过多少时间被记录的参数 slowlog-log-slower-than( 微妙 ) ,
# 另一个是 slow log 的长度。当一个新命令被记录的时候最早的命令将被从队列中移除
# 下面的时间以微妙为单位,因此 1000000 代表一秒。
# 注意指定一个负数将关闭慢日志,而设置为 0 将强制每个命令都会记录
slowlog-log-slower-than10000
# 对日志长度没有限制,只是要注意它会消耗内存
# 可以通过 SLOWLOGRESET 回收被慢日志消耗的内存
# 推荐使用默认值 128 ,当慢日志超过 128 时,最先进入队列的记录会被踢出
slowlog-max-len128
################################ 事件通知 #############################
# 当事件发生时, Redis 可以通知 Pub/Sub 客户端。
# 可以在下表中选择 Redis 要通知的事件类型。事件类型由单个字符来标识:
#K Keyspace 事件,以 _keyspace@<db>_ 的前缀方式发布
#E Keyevent 事件,以 _keysevent@<db>_ 的前缀方式发布
#g 通用事件(不指定类型),像 DEL, EXPIRE, RENAME, …
#$ String 命令
#s Set 命令
#h Hash 命令
#z 有序集合命令
#x 过期事件(每次 key 过期时生成)
#e 清除事件(当 key 在内存被清除时生成)
#A g$lshzxe 的别称,因此 ”AKE” 意味着所有的事件
#notify-keyspace-events 带一个由 0 到多个字符组成的字符串参数。空字符串意思是通知被禁用。
# 例子:启用 list 和通用事件:
#notify-keyspace-events Elg
# 默认所用的通知被禁用,因为用户通常不需要改特性,并且该特性会有性能损耗。
# 注意如果你不指定至少 K 或 E 之一,不会发送任何事件。
notify-keyspace-events“”
############################## 高级配置 ###############################
# 当 hash 中包含超过指定元素个数并且最大的元素没有超过临界时,
#hash 将以一种特殊的编码方式(大大减少内存使用)来存储,这里可以设置这两个临界值
#Redis Hash 对应 Value 内部实际就是一个 HashMap ,实际这里会有 2 种不同实现,
# 这个 Hash 的成员比较少时 Redis 为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的 HashMap 结构,对应的 valueredisObject 的 encoding 为zipmap,
# 当成员数量增大时会自动转成真正的 HashMap, 此时 encoding 为 ht 。
hash-max-zipmap-entries512
hash-max-zipmap-value64
# 和 Hash 一样,多个小的 list 以特定的方式编码来节省空间。
#list 数据类型节点值大小小于多少字节会采用紧凑存储格式。
list-max-ziplist-entries512
list-max-ziplist-value64
#set 数据类型内部数据如果全部是数值型,且包含多少节点以下会采用紧凑格式存储。
set-max-intset-entries512
# 和 hashe 和 list 一样 , 排序的 set 在指定的长度内以指定编码方式存储以节省空间
#zsort 数据类型节点值大小小于多少字节会采用紧凑存储格式。
zset-max-ziplist-entries128
zset-max-ziplist-value64
#Redis 将在每 100 毫秒时使用 1 毫秒的 CPU 时间来对 redis 的 hash 表进行重新hash ,可以降低内存的使用
# 当你的使用场景中,有非常严格的实时性需要,不能够接受 Redis 时不时的对请求有 2 毫秒的延迟的话,把这项配置为 no 。
# 如果没有这么严格的实时性要求,可以设置为 yes ,以便能够尽可能快的释放内存
activerehashingyes
# 客户端的输出缓冲区的限制,因为某种原因客户端从服务器读取数据的速度不够快,
# 可用于强制断开连接(一个常见的原因是一个发布 / 订阅客户端消费消息的速度无法赶上生产它们的速度)。
# 可以三种不同客户端的方式进行设置:
#normal -> 正常客户端
#slave -> slave 和 MONITOR 客户端
#pubsub -> 至少订阅了一个 pubsub channel 或 pattern 的客户端
# 每个 client-output-buffer-limit 语法 :
#client-output-buffer-limit <class><hard limit> <soft limit><soft seconds>
# 一旦达到硬限制客户端会立即断开,或者达到软限制并保持达成的指定秒数(连续)。
# 例如,如果硬限制为 32 兆字节和软限制为 16 兆字节 /10 秒,客户端将会立即断开
# 如果输出缓冲区的大小达到 32 兆字节,客户端达到 16 兆字节和连续超过了限制10 秒,也将断开连接。
# 默认 normal 客户端不做限制,因为他们在一个请求后未要求时(以推的方式)不接收数据,
# 只有异步客户端可能会出现请求数据的速度比它可以读取的速度快的场景。
# 把硬限制和软限制都设置为 0 来禁用该特性
client-output-buffer-limitnormal 0 0 0
client-output-buffer-limitslave 256mb 64mb60
client-output-buffer-limitpubsub 32mb 8mb60
#Redis 调用内部函数来执行许多后台任务,如关闭客户端超时的连接,清除过期的Key ,等等。
# 不是所有的任务都以相同的频率执行,但 Redis 依照指定的“ Hz ”值来执行检查任务。
# 默认情况下,“ Hz ”的被设定为 10 。
# 提高该值将在 Redis 空闲时使用更多的 CPU 时,但同时当有多个 key 同时到期会使 Redis 的反应更灵敏,以及超时可以更精确地处理。
# 范围是 1 到 500 之间,但是值超过 100 通常不是一个好主意。
# 大多数用户应该使用 10 这个预设值,只有在非常低的延迟的情况下有必要提高最大到 100 。
hz10
# 当一个子节点重写 AOF 文件时,如果启用下面的选项,则文件每生成 32M 数据进行同步。
aof-rewrite-incremental-fsyncyes