redis大型攻略


一:redis的简介、下载和安装

二:redis主从

三:redis在线升级

四:redis多实例

五:redis常见的操作

六:reids配置详解



    实验环境:CentOS-6.5-x86_64   redis-2.8.9.tar.gz


一:redis的简介、下载和安装

    Redis是一个key-valu存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步

    Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿memcached类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。 

    Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

    简介简单了解下即可!PS:Redis的官网地址是http://redis.io/

    下载地址:http://download.redis.io/releases/redis-2.8.9.tar.gz  


下面就是安装步骤了!(主:192.168.210.102)

    [root@bogon ~]# cd /usr/local/src/
    [root@bogon src]# wget -c http://download.redis.io/releases/redis-2.8.9.tar.gz  
    [root@bogon src]# tar xf redis-2.8.9.tar.gz 
    [root@bogon src]# cd redis-2.8.9                                   //在redis-2.8.9 目录下面有个README文档,有兴趣的,可以去看看!
    [root@bogon src]# make                                             //如果出现如下错误信息,说明你的机器上没有安装gcc gcc-c++ tcl
    make[3]: gcc:命令未找到 
    /bin/sh: cc: command not found    
    [root@bogon redis-2.8.9]# yum install -y gcc gcc-c++ tcl           //yum完成后,再次make,就不会报错了
    [root@bogon src]# make                                             //竟然又出现错误了
    cd src && make all
    make[1]: Entering directory `/usr/local/src/redis-2.8.9/src'
    CC adlist.o
    在包含自 adlist.c:34 的文件中:
    zmalloc.h:50:31: 错误:jemalloc/jemalloc.h:没有那个文件或目录
    zmalloc.h:55:2: 错误:#error "Newer version of jemalloc required"
    make[1]: *** [adlist.o] 错误 1
    make[1]: Leaving directory `/usr/local/src/redis-2.8.9/src'
    make: *** [all] 错误 2                                            //这个错误该怎么解决呢?很简单,把redis目录删除,重新tar xf redis-2.8.9.tar.gz,再次进入新的redis目录下,make,就不会报错了
    [root@bogon redis-2.8.9]# rm -rf redis-2.8.9
    [root@bogon redis-2.8.9]# tar xf redis-2.8.9.tar.gz 
    [root@bogon redis-2.8.9]# cd redis-2.8.9
    [root@bogon redis-2.8.9]# make
    Hint: To run 'make test' is a good idea ;)
    make[1]: Leaving directory `/usr/local/src/redis-2.8.9/src'
    [root@bogon redis-2.8.9]# echo $?                                //echo $? 返回状态码是0,make基本上就没问题了
    0
    [root@bogon redis-2.8.9]# make test                              //不放心,就用make test检测一下。但是在[35/36 done]: unit/obuf-limits (68 seconds)这里,会停止大概几分钟,并不是卡住了,请耐心等待
    \o/ All tests passed without errors!                             //经过几分钟的等待,出现这个,就表示没有错误了
    
    PS:其实在make那步,可以用make PREFIX=/usr/local/redis/ install  意思是,我们可以选择redis的安装路径,然后在make test。
    
    [root@bogon redis-2.8.9]# mkdir -pv /usr/local/redis/{bin,conf}
    mkdir: 已创建目录 "/usr/local/redis"
    mkdir: 已创建目录 "/usr/local/redis/bin"
    mkdir: 已创建目录 "/usr/local/redis/conf"
    [root@bogon redis-2.8.9]# cd src/                                //进入src目录下,因为我们在make时,会产生5个文件,分别是: redis-benchmark  redis-check-aof redis-check-dump redis-cli redis-server 
    [root@bogon src]# pwd                                            //后面会解释这几个文件作用
    /usr/local/src/redis-2.8.9/src
    [root@bogon src]# cp redis-benchmark redis-check-aof redis-check-dump redis-sentinel redis-server redis-cli /usr/local/redis/bin/  
    [root@bogon src]# cd ../ && cp redis.conf /usr/local/redis/conf/ //从redis-2.8.9目录下拷贝redis配置文件redis.conf到/usr/local/redis/conf/我们刚才建立的conf目录下  
    [root@bogon redis-2.8.9]#  vi /usr/local/redis/conf/redis.conf   //注意,我们修改的redis.conf文件是在/usr/local/redis/conf/目录下的,而不是redis-2.8.9目录下的,切记!
    将配置文本中的daemonize yes 由no改为yes,启动守护进程。          //redis.conf配置文本中,我们可以定义很多东西,比如redis的日志及日志存放的路径,redis产生的数据名称,默认是dump.rdb,我们可以去修改它的名字,它的存放路径等等
    修改完毕后,保存退出,启动redis。                                                   
    [root@bogon redis-2.8.9]# /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf //每次都写这么长长的一串,很不方便,我们将redis添加到环境变量中去,我们就可以直接redis-server了。redis启动,要带上redis.conf的配置文件
    [root@bogon redis-2.8.9]# echo "PATH=$PATH:/usr/local/redis/bin/" >> /etc/profile
    [root@bogon redis-2.8.9]# .  /etc/profile
    为redis提供启动脚本
    [root@bogon redis-2.8.9]# cp  /usr/local/src/redis-2.8.9/utils/redis_init_script  /etc/init.d/redis
    修改文件
    在第二行添加 # chkconfig: 2345 80 90  注意:前面的#带上
    以下内容根据实际情况做修改
    EXEC=/usr/local/redis/bin/redis-server
    CLIEXEC=/usr/local/redis/bin/redis-cli
    PIDFILE=/usr/local/redis/var/redis.pid
    CONF="/usr/local/redis/etc/redis.conf"
    [root@bogon redis-2.8.9]# chkconfig --add redis
    [root@bogon redis-2.8.9]# service redis start
    [root@bogon redis-2.8.9]# redis-cli 
    127.0.0.1:6379> set 1 2
    OK
    127.0.0.1:6379> get 1
    "2"
    127.0.0.1:6379> quit     
    [root@bogon redis-2.8.9]#                                         //至此,redis安装完成了
    
二:redis主从(master/slave)    
    Redis的master/slave数据复制方式可以是一主一从或者是一主多从的方式,Redis在master是非阻塞模式,也就是说在slave执行数据同步的时候master是可以接受客户端的请求的,并不影响同步数据的一致性,然而在slave端是阻塞模式的,slave在同步master数据时,并不能够响应客户端的查询。
    Redis的 master/slave 模式下,master提供数据读写服务,而slave只提供读服务。
    Redis的master/slave的配置方式是在slave主机的Redis目录下的redis.conf配置文件中添加:
    安装redis(从:192.168.210.101)
    [root@bogon src]# wget -c http://download.redis.io/releases/redis-2.8.9.tar.gz 
    [root@bogon src]# yum -y install gcc gcc-c++ tcl
    [root@bogon src]# tar xf redis-2.8.9.tar.gz
    [root@bogon redis-2.8.9]# cd redis-2.8.9
    [root@bogon redis-2.8.9]# make PREFIX=/usr/local/redis install       //注意:我在这里,选择安装路径了,完成后,会在/usr/local/redis/下面产生一个bin目录。其中bin目录中就有了5个文件。这就不需要我们去拷贝了。
    [root@bogon redis-2.8.9]# make test
    [root@bogon redis-2.8.9]# mkdir -pv /usr/local/redis/{log,conf}     //一个是存放log日志,另一个是存放配置文件的
    [root@bogon redis-2.8.9]# mkdir -pv /data/redis                     //这里是存放数据的,就是那个dump.rdb
    [root@bogon redis-2.8.9]# cd /usr/local/redis/conf
    [root@bogon conf]# cp /usr/local/src/redis-2.8.9/redis.conf .
    [root@bogon conf]# vi redis.conf
    在从服务器上,我们修改redis.conf这几个地方:
        daemonize yes                                                   //由no改成yes
        logfile ""                                                      //日志存放路径,这里等写上redis6379.log,这个文档会在/usr/local/redis/log/下自动生成,日志名字可以随便写!改成 logfile "/usr/local/redis/log/redis6379.log" 
        slaveof  <masterip> <masterport>                                //slaveof 主服务器ip地址 端口,改成 slaveof 192.168.210.102 6379 
        dir ./                                                          //改成dir /data/redis,我们前面创建的一个专门用来放数据的
    [root@bogon conf]# echo "PATH=$PATH:/usr/local/redis/bin/" >>/etc/profile 
    [root@bogon conf]# . /etc/profile
    [root@bogon conf]# redis-server /usr/local/redis/conf/redis.conf    //启动脚本,我就不写了
    [root@bogon conf]# redis-cli -p 6379                                //如果你以后遇到,redis的默认端口不是6379,那么带上端口启动
    127.0.0.1:6379> get 1
    "null"                                                              //为什么会是null呢?明明在主的redis上面,我们set 1 2 ,那么,在从服务器上面的redis,我们去get 1,应该会得到2,我们去看看日志!
    [root@bogon conf]# vim ../log/redis6379.log
    日志显示:
    [5925] 30 Jul 19:37:29.147 # Server started, Redis version 2.8.9
    [5925] 30 Jul 19:37:29.147 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sys    ctl vm.overcommit_memory=1' for this to take effect.
    [5925] 30 Jul 19:37:29.147 * The server is now ready to accept connections on port 6379
    [5925] 30 Jul 19:37:29.148 * Connecting to MASTER 192.168.210.102:6379
    [5925] 30 Jul 19:37:29.148 * MASTER <-> SLAVE sync started
    [5925] 30 Jul 19:37:29.149 * Non blocking connect for SYNC fired the event.
    [5925] 30 Jul 19:37:29.150 * Master replied to PING, replication can continue...
    [5925] 30 Jul 19:37:29.150 * Partial resynchronization not possible (no cached master)
    很明显,我们的防火墙没有关闭,但是在实际,线上服务器上,你可不能直接用iptables -F。。。去把redis端口放开即可!
    [root@bogon conf]# iptables -F                                      //这里就是直接清空了,因为是虚拟机
    [root@bogon conf]# /etc/init.d/iptables save                        //使得上一步生效,主服务器上,也要关闭防火墙
    [root@bogon conf]# redis-cli -p 6379
    127.0.0.1:6379> get 1
    "2"
    127.0.0.1:6379> info                                                //get得到了2了,主从同步了!也可以使用info测试
    # Keyspace
    db0:keys=1,expires=0,avg_ttl=0
    

三:redis在线升级                                                       PS:把服务器上的redis给升级到redis-3.0.3
    [root@bogon conf]# redis-server -v                                      
    Redis server v=2.8.9 sha=00000000:0 malloc=jemalloc-3.2.0 bits=64 build=68789c703e196441  //查看版本
    redis默认有持久化的特点,持久化是由2个方式起作用的,一个是快照方式,一个是日志追加方式。
    快照方式:
        这种方式就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名是dump.rdb。客户端也可以使用bgsave或者save命令通知redis做一次快照的持久化。save操作是在主线程中保存快照的,由于redis是用一个主线程来处理所有用户的请求的。这种方式会阻塞所有用户的请求。每次快照持久化都是将内存中的数据完整的写入到硬盘一次,并不是增量的只同步增量数据。如果数据量大的话,写操作会比较多,必然会引起大量的磁盘IO,可能会严重影响性能。 
        注意:由于快照方式是在一定的间隔时间去做一次,所以如果redis意外宕机的话,就会丢失最后一次快照后的所有数据的修改。
    日志追加方式:(Append-only file)
        aof比快照方式有更好的持久化性,是由于在使用aof持久化方式时,redis会将每一个收到的写命令都通过write函数追加到文件中(默认是appendonly.aof)。当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于os会在内核中缓存 write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。不过我们可以通过配置文件告诉redis我们想要通过fsync函数强制os写入到磁盘的时机。(原理性比较强,不对请指出来!)
    
    [root@bogon conf]# redis-cli
    127.0.0.1:6379> get 1
    "2" 
     127.0.0.1:6379> quit
    [root@bogon conf]# cd /usr/local/src
    [root@bogon src]#  wget -c http://download.redis.io/releases/redis-3.0.3.tar.gz 
    [root@bogon src]# tar xf redis-3.0.3.tar.gz 
    [root@bogon src]# cd redis-3.0.3
    [root@bogon redis-3.0.3]# mkae
    [root@bogon redis-3.0.3]# cd src/                                                                                  
    [root@bogon src]# cp redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin/  //覆盖掉,关于这步,我也不太肯定,到底会不会对线上的redis服务有什么影响,有会的,指点一下呗!
    [root@bogon src]# redis-cli 
    127.0.0.1:6379> get 1
    "2"
    127.0.0.1:6379> quit
    [root@bogon src]# redis-server -v
    Redis server v=3.0.3 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=398767c84084f77f
    [root@bogon src]# pwd
    /usr/local/src/redis-3.0.3/src/redis-3.0.3/src
    [root@bogon src]#                                                                            //即使主从上redis的版本变了不一样了,可是依旧能够主从同步!
    
        
四:redis多实例
    
    这次,我们在从上做实验!从上的版本目前是  [root@bogon conf]# redis-server -v
    Redis server v=2.8.9 sha=00000000:0 malloc=jemalloc-3.2.0 bits=64 build=68789c703e196441
    
    [root@bogon conf]# cd /usr/local/redis/
    [root@bogon redis]# ls
    bin  conf  log
    [root@bogon redis]# mkdir -pv /home/test/redis
    mkdir: 已创建目录 "/home/test"
    mkdir: 已创建目录 "/home/test/redis"
    [root@bogon redis]# mkdir -pv /home/test/redis/{log,bin,conf,data}
    mkdir: 已创建目录 "/home/test/redis/log"
    mkdir: 已创建目录 "/home/test/redis/bin"
    mkdir: 已创建目录 "/home/test/redis/conf"
    mkdir: 已创建目录 "/home/test/redis/data"
    [root@bogon redis]# cp /usr/local/redis/conf/redis.conf /home/test/redis/conf/redis6380.conf  //拷配置文件,名字注意区别。
    [root@bogon redis]# vim !$
    修改配置文件了,注意端口改成6380,日志的路径,数据的路径等等。
    [root@bogon redis]# redis-server /home/test/redis/conf/redis6380.conf                         //启动6380这个实例
    [root@bogon redis]# redis-cli 
    127.0.0.1:6379> quit
    [root@bogon redis]# redis-cli -p 6380                                                         //与redis交互要带上端口,否则就是默认的6379
    127.0.0.1:6380> get 1
    (nil)
    127.0.0.1:6380> get 3
    (nil)
    127.0.0.1:6380> quit                                                                          //新的数据,没有受到别的redis的影响!
    [root@bogon redis]#
    
    总结一下:所谓的单主机多redis实例,就是一个非常方便的redis多用技术, 他的实现方法也是非常简答,就是把配置文件拷贝一份,到你指定的地方,改一改,,然后就去用redis-server ,带上实例的配置文件,启动就ok了!
    
    
    
五:redis常见的操作    
    
    就初级运维而言,学会了安装redis,主从,升级,实例,和对其原理性的知识懂得一点,就可以了。但是,平时,工作当中,redis操作,我们也要会使用一些简单的。
    redis-server 带上配置文件,这就是启动redis的命令
    redis-cli 带上端口号,     在linux上与redis实现交互
    redis-cli shutdown         关闭redsi,redis进程没有了

六:reids配置详解,随便看看吧!

    

# Redis.conf 配置文件

# daemonize no 默认情况下,redis不是在后台运行的,如果需要在后台运行,把该项的值更改为yes

daemonize yes

# 当redis在后台运行的时候,Redis默认会把pid文件放在/var/run/redis.pid,你可以配置到其他地址。

当运行多个redis服务时,需要指定不同的pid文件和端口

pidfile /var/run/redis.pid


# 指定redis运行的端口,默认是6379

port 6379


# 指定redis只接收来自于该IP地址的请求,如果不进行设置,那么将处理所有请求,

# 在生产环境中最好设置该项

# bind 127.0.0.1


# Specify the path for the unix socket that will be used to listen for

incoming connections. There is no default, so Redis will not listen

# on a 

unix socket when not specified.

#

# unixsocket /tmp/redis.sock

unixsocketperm 755


# 设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接

# 0是关闭此设置

timeout 

0


# 指定日志记录级别

# Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose

debug  记录很多信息,用于开发和测试

# varbose 有用的信息,不像debug会记录那么多

notice 普通的verbose,常用于生产环境

# warning 只有非常重要或者严重的信息会记录到日志

loglevel debug


# 配置log文件地址

# 默认值为stdout,标准输出,若后台模式会输出到/dev/null

#logfile stdout

logfile /var/log/redis/redis.log


# To enable logging to the system logger, just set 'syslog-enabled' to 

yes,

# and optionally update the other syslog parameters to suit your 

needs.

# syslog-enabled no


# Specify the syslog identity.

# syslog-ident redis


# Specify the syslog facility.  Must be USER or between LOCAL0-LOCAL7.

syslog-facility local0


# 可用数据库数

# 默认值为16,默认数据库为0,数据库范围在0-(database-1)之间

databases 16


################################ 快照  #################################

#

# 保存数据到磁盘,格式如下:

#

#   save <seconds> <changes>

#

#   

指出在多长时间内,有多少次更新操作,就将数据同步到数据文件rdb。

#   相当于条件触发抓取快照,这个可以多个条件配合

#   

#   

比如默认配置文件中的设置,就设置了三个条件

#

#   save 900 1  900秒内至少有1个key被改变

#   save 300 

10  300秒内至少有300个key被改变

#   save 60 10000  60秒内至少有10000个key被改变


save 900 1

save 300 10

save 60 10000


# 存储至本地数据库时(持久化到rdb文件)是否压缩数据,默认为yes

rdbcompression yes


# 本地持久化数据库文件名,默认值为dump.rdb

dbfilename dump.rdb


# 工作目录

#

# 数据库镜像备份的文件放置的路径。

这里的路径跟文件名要分开配置是因为redis在进行备份时,先会将当前数据库的状态写入到一个临时文件中,等备份完成时,

再把该该临时文件替换为上面所指定的文件,而这里的临时文件和上面所配置的备份文件都会放在这个指定的路径当中。

#

AOF文件也会存放在这个目录下面

#

# 注意这里必须制定一个目录而不是文件

dir ./


################################# 复制 #################################


# 主从复制. 设置该数据库为其他数据库的从数据库.

设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步

#

# slaveof <masterip> <masterport>


# 当master服务设置了密码保护时(用requirepass制定的密码)

# slav服务连接master的密码

#

masterauth <master-password>



# 当从库同主机失去连接或者复制正在进行,从机库有两种运行方式:

#

# 1) 

如果slave-serve-stale-data设置为yes(默认设置),从库会继续相应客户端的请求

#

# 2) 

如果slave-serve-stale-data是指为no,出去INFO和SLAVOF命令之外的任何请求都会返回一个

#    错误"SYNC with 

master in progress"

#

slave-serve-stale-data yes


# 从库会按照一个时间间隔向主库发送PINGs.可以通过repl-ping-slave-period设置这个时间间隔,默认是10秒

#

repl-ping-slave-period 10


# repl-timeout 设置主库批量数据传输时间或者ping回复时间间隔,默认值是60秒

一定要确保repl-timeout大于repl-ping-slave-period

# repl-timeout 60


################################## 安全 ###################################


# 设置客户端连接后进行任何其他指定前需要使用的密码。

警告:因为redis速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行150K次的密码尝试,这意味着你需要指定非常非常强大的密码来防止暴力破解

#

requirepass foobared


# 命令重命名.

#

# 在一个共享环境下可以重命名相对危险的命令。比如把CONFIG重名为一个不容易猜测的字符。

#

举例:

#

# rename-command CONFIG 

b840fc02d524045429941cc15f59e41cb7be6c52

#

如果想删除一个命令,直接把它重命名为一个空字符""即可,如下:

#

# rename-command CONFIG ""

################################### 约束 ####################################

# 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,

# 如果设置 

maxclients 0,表示不作限制。

# 当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients 

reached错误信息

#

# maxclients 128


# 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key

Redis同时也会移除空的list对象

#

# 当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作

#

# 注意:Redis新的vm机制,会把Key存放内存,Value会存放在swap区 maxmemory的设置比较适合于把redis当作于类似memcached的缓存来使用,而不适合当做一个真实的DB。

# 当把Redis当做一个真实的数据库使用的时候,内存使用将是一个很大的开销

# maxmemory <bytes>


# 当内存达到最大值的时候Redis会选择删除哪些数据?有五种方式可供选择

#

# volatile-lru -> 利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used )

# allkeys-lru -> 利用LRU算法移除任何key

# volatile-random -> 移除设置过过期时间的随机key

allkeys->random -> remove a random key, any key

# volatile-ttl -> 移除即将过期的key(minor TTL)

# noeviction -> 不移除任何可以,只是返回一个写错误

#

注意:对于上面的策略,如果没有合适的key可以移除,当写的时候Redis会返回一个错误

#

# 写命令包括: set setnx 

setex append

#       incr decr rpush lpush rpushx lpushx linsert lset 

rpoplpush sadd

#       sinter sinterstore sunion sunionstore sdiff sdiffstore 

zadd zincrby

#       zunionstore zinterstore hset hsetnx hmset hincrby incrby 

decrby

#       getset mset msetnx exec sort

#

# 默认是:

#

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 进行重新整理。

# 你可以同时开启asynchronous dumps 和 AOF

appendonly no

# AOF文件名称 (默认: "appendonly.aof")

# appendfilename appendonly.aof

# Redis支持三种同步AOF文件的策略:

#

# no: 不进行同步,系统去操作 . Faster.

# always: 

always表示每次有写操作都进行同步. Slow, Safest.

# everysec: 表示对写操作进行累积,每秒同步一次. 

Compromise.

#

# 默认是"everysec",按照速度和安全折中这是最好的。

# 如果想让Redis能更高效的运行,你也可以设置为"no",让操作系统决定什么时候去执行

# 或者相反想让数据更安全你也可以设置为"always"

#

# 如果不确定就用 "everysec".

# appendfsync always

appendfsync everysec

# appendfsync no

# AOF策略设置为always或者everysec时,后台处理进程(后台保存或者AOF日志重写)会执行大量的I/O操作

# 在某些Linux配置中会阻止过长的fsync()请求。注意现在没有任何修复,即使fsync在另外一个线程进行处理

# 为了减缓这个问题,可以设置下面这个参数no-appendfsync-on-rewrite

#

# This means that while 

another child is saving the durability of Redis is

# the same as "appendfsync 

none", that in pratical terms means that it is

# possible to lost up to 30 

seconds of log in the worst scenario (with the

# default Linux 

settings).

#

# If you have latency problems turn this to "yes". Otherwise 

leave it as

# "no" that is the safest pick from the point of view of 

durability.

no-appendfsync-on-rewrite no


# Automatic rewrite of the append only file.

# AOF 自动重写

# 当AOF文件增长到一定大小的时候Redis能够调用 BGREWRITEAOF 对日志文件进行重写

# 它是这样工作的:Redis会记住上次进行些日志后文件的大小(如果从开机以来还没进行过重写,那日子大小在开机的时候确定)

# 基础大小会同现在的大小进行比较。如果现在的大小比基础大小大制定的百分比,重写功能将启动

同时需要指定一个最小大小用于AOF重写,这个用于阻止即使文件很小但是增长幅度很大也去重写AOF文件的情况

# 设置 percentage 

为0就关闭这个特性

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

################################## SLOW LOG ###################################

# Redis Slow Log 记录超过特定执行时间的命令。执行时间不包括I/O计算比如连接客户端,返回结果等,只是命令执行时间

#

可以通过两个参数设置slow log:一个是告诉Redis执行超过多少时间被记录的参数slowlog-log-slower-than(微妙),

# 另一个是slow log 的长度。当一个新命令被记录的时候最早的命令将被从队列中移除下面的时间以微妙微单位,因此1000000代表一分钟。

# 注意制定一个负数将关闭慢日志,而设置为0将强制每个命令都会记录

slowlog-log-slower-than 10000

# 对日志长度没有限制,只是要注意它会消耗内存

# 可以通过 SLOWLOG RESET 

回收被慢日志消耗的内存

slowlog-max-len 1024

############################### ADVANCED CONFIG ###############################

# 当hash中包含超过指定元素个数并且最大的元素没有超过临界时,

# hash将以一种特殊的编码方式(大大减少内存使用)来存储,这里可以设置这两个临界值

# Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,

# 这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,

# 当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。

hash-max-zipmap-entries 512

hash-max-zipmap-value 64

# list数据类型多少节点以下会采用去指针的紧凑存储格式。

list数据类型节点值大小小于多少字节会采用紧凑存储格式。

list-max-ziplist-entries 512

list-max-ziplist-value 64

# set数据类型内部数据如果全部是数值型,且包含多少节点以下会采用紧凑格式存储。

set-max-intset-entries 512

# zsort数据类型多少节点以下会采用去指针的紧凑存储格式。

zsort数据类型节点值大小小于多少字节会采用紧凑存储格式。

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

# Redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用 当你的使用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。

# 如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存

activerehashing yes

################################## INCLUDES ###################################

# 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件

include /path/to/local.conf

# include /path/to/other.conf