之前我们说互联网业务的繁荣造就了MySQL的飞速发展,但是在大数据爆发的短短几年,关系型数据库由于自身技术的限制,在应对高并发、海量数据的处理上也出现了瓶颈,无法应对大数据的使用要求,在这种背景之下,NoSQL技术得到了快速发展,redis内存数据库也应运而生。redis是基于C语言开发的内存数据库,也是目前最流行的的K-V存储数据库。Redis在应对高并发、低延迟、海量数据处理的分布式系统中展现了其卓越的性能,它已经成为互联网大型系统的标准配置了。今天我们先介绍下redis的安装部署以及参数解析,让我们一起进入redis的世界吧(吐血ing)。
1. 安装部署
#首先下载安装包:
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
#新建redis用户
shell>groupadd redis
shell>useradd -g redis -d /home/redis redis
#解压编译
shell>tar -zxvf redis-4.0.10.tar.gz
shell>cd redis-4.0.10
shell>make
shell>make install //install的时候,redis的命令会被拷贝到/usr/local/bin下
#复制执行程序到bin目录,主要是为了便于管理,此步骤也可省略。
shell>mkdir bin
shell>cp src/redis-server bin/
shell>cp src/redis-check-aof bin/
shell>cp src/redis-cli bin/
shell>cp src/redis-sentinel bin/
shell>cp src/redis-trib.rb bin/
shell>cp src/redis-check-rdb bin/
shell>cp src/redis-benchmark bin/
#新建conf配置文件目录
shell>mkdir conf
shell>cp redis.conf conf/
#修改程序的属组
shell>chown -R redis.redis redis-4.0.10/
#设置软连接,不把redis目录固定到指定的版本上,有利于后续升级
shell>ln -sv redis-4.0.10 /usr/local/redis
shell>chown -R redis.redis /usr/local/redis
#启动redis服务
#客户端交互
shell>redis-cli -h 127.0.0.1 -p 6379 //不加-h和-p的话默认是127.0.0.1 6379
127.0.0.1:6379>
#关闭redis服务
shell>redis-cli shutdown
2. 配置文件参数说明
#通用配置(GENERAL)
1. daemonize no
redis是否作为守护进程的方式运行。
2. pidfile /var/run/redis.pid
当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
3. loglevel notice
日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose。
4. logfile “”
日志输出的路径及文件名称。
5. databases 16
数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id。
#网络相关(NETWORK)
1. bind 127.0.0.1
绑定的主机地址,只有绑定的主机才能访问。
2. port 6379
指定Redis监听端口,默认端口为6379,之所以选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码, MERZ取自意大利歌女Alessia Merz,来自程序员的浪漫。
3. tcp-backlog 511
TCP三次握手后会将接受的连接放到队列中,tcp-backlog就是队列的大小。该参数受操作系统影响,在linux操作系统中,如果/proc/sys/net/core/somaxconn小于tcp-backlog,那么在redis启动时会看到如下日志,并建议将/proc/sys/net/core/somaxconn调大。# WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
4. tcp-keepalive 300
检测TCP连接活性的周期,默认300s,也就是每隔5分钟对它创建的TCP连接进行活性检测,防止大量的死链接占用系统资源。建议维护成60s。
5. timeout 300
客户端空闲连接的超时时间,一旦空闲时间达到了timeout,客户端就会被关闭,如果设置为0的话就不进行检测。
#客户端配置(CLIENTS)
1. maxclients 128
同一时间客户端最大连接数,默认10000个连接,当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息。
#快照持久化(SNAPSHOTTING)
1. save <seconds> <changes>
指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,Redis默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
2.stop-writes-on-bgsave-error yes
默认情况下,如果redis最后一次后台保存失败,redis将停止接受写操作。如果后台保存进程重新工作了,redis也将自动的允许写操作。建议改成no。
3. dir ./
指定本地数据库存放目录
4. dbfilename dump.rdb
指定本地数据库文件名,默认值为dump.rdb
5. rdbcompression yes
指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,RDB会消耗CPU,但是可大幅度降低文件的体积,建议开启。
6. rdbchecksum yes
读取和写入的时候是否支持CRC64校验,默认开启
#安全相关(SECURITY)
1. requirepass foobared
设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭
#AOF相关(APPEND ONLY MODE)
1. appendonly yes
指定是否在每次更新操作后进行日志记录。Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
2. appendfilename appendonly.aof
指定更新日志文件名,默认为appendonly.aof
3. appendfsync everysec
指定日志刷到磁盘的机制,共有3个可选值:
no:由操作系统自行决定数据缓存何时刷到磁盘,相对较快。
always:每次更新操作后手动调用fsync()将数据写到磁盘,性能相对较慢,但是最安全。
everysec:每秒刷新到磁盘一次
4. no-appendfsync-on-rewrite no
指定后台aof文件在rewrite期间会调用fsync,默认为no,表示要调用fsync。
5. auto-aof-rewrite-percentage 100
表示redis触发aof文件rewrite的条件,默认100,表示与上次rewrite的aof文件大小相比,当aof的增长量超过上次aof文件大小的100%时就会触发backgroup rewrit。若配置为0,会禁用rewrite。
6. auto-aof-rewrite-min-size 64mb
指定触发rewrite的aof文件大小,若aof文件小于该值,及时文件增量达到auto-aof-rewrite-percentage配置的值时,也不会触发rewrite。即这两个条件同时满足时才触发rewrite。
7. aof-load-truncated yes
redis在执行恢复时,当最后一条指令被截断时,如果配置的yes时redis会记录日志并继续,如果设置为no时,redis会失败退出。
8. aof-rewrite-incremental-fsync yes
AOF重写过程中,是否采用增量文件同步的策略。
#复制相关(REPLICATION)
1. slaveof <masterip> <masterport>
设置当本机为slav服务器时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步。
2. masterauth <master-password>
当master服务设置了密码保护时,slav服务连接master的密码。
3. slave-serve-stale-data yes
当slave与master失去连接之后,或者当数据正在复制传输的时候,slave可以继续接受客户端的请求,否则会返回给客户端如下信息:“SYNC with master in progress”
4. slave-read-only yes
从库是否只读
5. repl-diskless-sync no
全量同步时是否先把快照存于本地,如果存于本地会占用磁盘IO,但是可以服用RDB文件,如果不存于磁盘就会直接把RDB文件发给从库,复用性降低。从库较少时建议设置为yes,采用不存储磁盘的方式。
6. repl-diskless-sync-delay 5
当repl-diskless-sync参数为yes时,采用不存储磁盘时,master等待一定时间,等待更多的从库要求增量复制,然后进行并行复制。
7. repl-disable-tcp-nodelay no
向从库传输数据时,是否禁用socket的TCP_NODELAY选项。若配置为yes则禁用TCP_NODELAY,则TCP协议栈会合并小包统一发送,这样可以节省带宽,但是会造成从库的延迟。若配置为no,表明启用TCP_NODELAY,则TCP协议栈会实时传输数据,减少了从库的延迟,但是需要更大的带宽。建议配置为no以减少从库的延迟。
8. slave-priority 100
从库的优先级。集群模式下,优先级越小越容易被选为主库,但是若配置为0,那么该slave永远不会成为master。
#内存管理(MEMORY MANAGEMENT)
1. maxmemory <bytes>
指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会根据maxmemory-policy清除策略先尝试清除已到期或即将到期的Key,当此方法处理后,仍然到达最大内存设置,将无法再使用SET、LPUSH进行写入操作,但仍然可以进行GET操作。
maxmemory-policy提供了8种清除策略:
valatie-lru:从所有最近最少访问数据范围内查找设置了过期时间的数据进行淘汰。
allkeys-lru:从所有数据范围内查找最近最少使用的数据进行淘汰。
volatile-random:从设置了过期时间的数据范围内随机选择key进行删除。
allkeys-random:从所有数据范围内随机选择key进行删除。
Noevction:不执行任何淘汰策略,当达到内存限制后会报错。默认为此策略
volatile-ttl:从设置了过期时间的数据范围内挑选将要过期的数据进行淘汰。
Redis4.X版本开始支持LFU算法。
valatie-lfu:在设置了过期时间的键空间中,移除使用次数最少的key。
allkeys-lfu:在所有键空间范围内,移除使用次数最少的key。
#慢日志(SLOW LOG)
1. slowlog-log-slower-than 10000
慢查询被记录的阀值(单位微秒)
2. slowlog-max-len 128
最多记录慢查询的条数。
#集群参数(REDIS CLUSTER)
1. cluster-enabled yes
开启集群功能
2. cluster-config-file nodes-6379.conf
集群配置文件
3. cluster-node-timeout 15000
集群节点超时时间(单位毫秒)
4. cluster-migration-barrier 1
主从节点切换需要的最少从节点个数。
5. cluster-require-full-coverage yes
集群是否需要所有的slot都分配给在线节点才能正常访问。
6. repl-ping-slave-period 10
从服务器每隔一定时间向服务器发送ping探测,时间间隔由该参数配置。
7. cluster-slave-validity-factor 10
从节点有效判断因子,当从节点与主节点最后通信时间超过(((cluster-node-timeout) * (slave-validity-factor)) + (repl-ping-slave-period))时,对应的从节点不具备故障转移资格,防止断线时间过长的从节点进行故障转移。设置为0表示从节点永不过期。