缓存学习(五):Redis安装、配置

目录

1.安装

2.配置

2.1 include

2.2 loadmodule

2.3 网络配置

2.4 通用配置

2.5 RDB配置

2.6 主从配置

2.7 安全配置

2.8 maxclients

2.9 内存管理

2.10 AOF配置

2.11 Lua脚本最大执行时间

2.12 slowlog

2.13 高级配置


1.安装

安装本身比较简单,就是去官网下载源码包,解压后执行make和make install即可,不过有可能会遇到一个错误:

fatal error: jemalloc/jemalloc.h: No such file or directory
 #include <jemalloc/jemalloc.h>
          ^~~~~~~~~~~~~~~~~~~~~

该问题在README.md有描述,只要在make时使用

make MALLOC=libc

即可

完整命令如下:

wget http://download.redis.io/releases/redis-5.0.4.tar.gz
tar -zxvf redis-5.0.4.tar.gz
cd redis-5.0.4/
make MALLOC=libc
make install

然后可以执行 redis-server -v来验证有没有安装成功:

root@Yhc-Surface:~/redis-5.0.4# redis-server -v
Redis server v=5.0.4 sha=00000000:0 malloc=libc bits=64 build=172bab0d8aa0a3b7

2.配置

这里的配置主要是指redis-server的配置。

首先是redis-server的-h选项输出:

root@Yhc-Surface:~/redis-5.0.4# redis-server -h
Usage: ./redis-server [/path/to/redis.conf] [options]
       ./redis-server - (read config from stdin)
       ./redis-server -v or --version
       ./redis-server -h or --help
       ./redis-server --test-memory <megabytes>

Examples:
       ./redis-server (run the server with default conf)
       ./redis-server /etc/redis/6379.conf
       ./redis-server --port 7777
       ./redis-server --port 7777 --replicaof 127.0.0.1 8888
       ./redis-server /etc/myredis.conf --loglevel verbose

Sentinel mode:
       ./redis-server /etc/sentinel.conf --sentinel

可以看出,redis-server支持通过命令行选项直接指定本机节点和集群主节点,还支持通过配置文件配置单机和集群环境,以及哨兵节点。

命令行配置比较简单,哨兵配置暂时不看,所以这里主要看redis.conf文件的配置。

此处没有包括集群相关的配置,以及被标注为实验性功能的碎片整理功能的配置。

2.1 include

redis支持通过include引用其他配置文件的配置,并且可以同时引用多个配置文件:

include ~/first.conf
include ~/second.conf

include引入的配置可以被覆盖,conf文件中,在前面的配置可以被后面的配置覆盖,因此,如果需要动态调整配置,最好将include写在开头处,反之,如果不希望模板中的配置被覆盖掉,可以把include写到结尾处。

2.2 loadmodule

模块是Redis 4提出的,可以在 Redis Module Hub 找到很多模块,然后在redis.conf中通过loadmodule加载:

loadmodule ~/first.so
loadmodule ~/second.so

和include一样,这里也可以加载多个模块。配置的模块会在Redis服务器实例启动时加载。

除了在配置文件中加载模块,Redis也支持在运行中通过 MODULE LOAD和MODULE UNLOAD命令动态加载/卸载模块。

2.3 网络配置

1)bind

即Redis接收哪些主机发来的连接,如果不配置,则默认接受所有连接,是不安全的,Redis未授权访问详解 - FreeBuf专栏·安全之光 是一个借助Redis漏洞进行免密登录的案例。默认配置 bind 127.0.0.1 代表只允许本地访问。

2)port

即Redis监听的端口,默认6379。

3)protected-mode

默认yes,当没有配置bind和密码时,会强制只能本地访问。

4)tcp-backlog

backlog是已连接但未进行accept处理的SOCKET队列大小,如果这个队列满了,将会发送“Connection Refused”错误信息给客户端,默认511,如果设置的太大,可能会导致请求来没来得及处理就已经超时。

5)unixsocket

配置Redis监听的Socket文件,没有默认值,即不显式配置的话就不监听

6)timeout

默认0,即客户端断开后立即关闭连接,单位为秒

7)tcp-keepalive

用来配置发送保持连接的ACK的时间间隔,默认300,即每300秒发送一次ACK以保持连接。

2.4 通用配置

1)daemonize

是否以后台模式启动,默认no,如果设置为yes,则写入pid到/var/run/redis.pid(可配置)

2)pidfile

指定后台模式pid文件的位置

3)loglevel

指定日志级别,有:debug、verbose、notice、warning四种级别(内容越来越少),默认notice。

4)logfile

指定日志输出位置,默认为空,即输出到标准输出(后台模式则丢弃日志)

5)使用system logger

一共三个配置项:

  • syslog-enabled:默认no,代表是否启用系统的日志记录
  • syslog-ident:设置在系统日志中的名称
  • syslog-facility:设置使用的系统日志设备,可以是USER,或者LOCAL0~LOCAL7

6)databases

redis也是有 数据库 的概念的,必须选中数据库才能操作数据,默认16个数据库,并默认选中DB0,即第一个数据库

7)always-show-logo

是否显示LOGO,默认yes

2.5 RDB配置

1)save

格式为:save <seconds> <changes>,代表在seconds秒内,如果有至少changes个修改,则持久化到磁盘上,例如下列默认配置:

save 900 1 //如果过了15分钟,有过至少1次改动,则持久化
save 300 10 //如果过了5分钟,有过至少10次改动,则持久化
save 60 10000 //如果过了1分钟,有过至少10000次改动,则持久化

如果没有配置save,或者配置了 save "",则不持久化

2)stop-writes-on-bgsave-error

默认yes,即持久化失败后停止写入,以免运维感知不到持久化异常。

3)rdbcompression

是否在持久化时对string对象使用LZF进行压缩,默认yes,但是会消耗CPU

4)rdbchecksum

是否向RDB文件写入校验码,默认yes,no的话就写入0,即跳过校验

5)dbfilename

即RDB文件的名称,默认dump.rdb

6)dir

即RDB存放的位置,默认在Redis工作目录下

2.6 主从配置

1)slaveof

即将本节点配置为指定节点的从节点,格式为:slaveof <masterip> <masterport>

2)masterauth

主节点可能配置了密码,可以在此配置密码,以完成认证,格式为:masterauth <master-password>

3)slave-serve-stale-data

即(作为从节点的)本节点,当与主节点断开连接后,是否继续为客户端提供服务,默认yes,但是可能会造成不一致

4)slave-read-only

从节点是否只读,默认yes,如果是一些存活期短的数据,可以写在从节点上,一方面能够减轻写压力,另一方面与主节点同步后这些数据就消失了,也不会影响整体一致性

5)repl-diskless-sync

这一条是配置主从节点同步方式,默认no,即同步时需要先创建一个RDB文件,把主节点的数据写进来再恢复,这种方式的好处在于,可以将集群配置为树状结构,让已完成同步的从节点为未完成同步的从节点提供数据,从而大幅加快同步速度,坏处在于,如果硬盘很慢,那么读写RDB文件将会大幅降低节点同步效率;如果配置为yes,则不写入RDB文件,而是直接同步进内存

6)repl-diskless-sync-delay

设置主节点在无盘传输前等待多久,因为同步过程是阻塞的,如果不等待就直接开始同步,那么有些新加入的节点就不能及时同步数据、提供服务,必须等到下次同步,如果设置了延时,就可以让更多的从节点加入同步过程,默认设置5秒

7)repl-ping-slave-period

从节点每隔一段时间就向主节点发送PING,该项就是设置这个发送间隔,默认10秒

8)repl-timeout

设置分区超时时间,主要应用于:

  • 同步时数据包传输时间
  • 主从节点互PING

如果以上两个操作所用时间超过了超时时间,则认为分区连接中断,默认60秒

9)repl-disable-tcp-nodelay

默认no,代表发送较小的数据包,这种方式延迟小,但是带宽占用大,yes则是发送较大的数据包,带宽占用小,但是延迟比较大

10)repl-backlog-size、repl-backlog-ttl

分区的backlog可以理解为一个缓存,用来保存从节点的最近的数据包,如果从节点又很快重新连接上来,就可以根据这些数据包恢复工作,最多进行一次增量同步,这样就避免了全量同步带来的开销,repl-backlog-size代表这个缓存大小,默认设置为1MB,repl-backlog-ttl代表这个缓存的存活时间,默认3600秒,设置为0代表永不淘汰

11)slave-priority

用来设置从节点优先级,值越低优先级越高,在主节点宕机后,哨兵节点会优先选择高优先级的从节点晋升为主节点,默认值为100

12)分区规模配置

min-slaves-to-write和min-slaves-max-lag限定了一个分区的规模,设前者的值为N,后者的值为M,则一个可以正常执行写入操作的分区,必须有N个延迟小于等于M的从节点。默认配置:N=3,M=10

13)slave-announce-ip、slave-announce-port

一个从节点可以用一个ip-port对标记,但是如果使用了NAT或端口转发时,可能会导致同一个从节点被重复标记,可以使用该配置进行唯一标记

2.7 安全配置

1)requirepass

为服务器设置一个密码

2)rename-command

修改命令名称,主要是为了防止一些关键命令被滥用,例如config,如果某个命令被设置为空字符串,则表示废弃

2.8 maxclients

代表最多允许同时连接多少个客户端,默认10000

2.9 内存管理

1)maxmemory

代表Redis最多可以存储多少字节的数据,当存储的数据到达上限之后,就会触发缓存清除

2)maxmemory-policy

代表Redis缓存清除策略,有如下选项:

  • volatile-lru -> 对过期数据采用LRU策略清除,直到空间足够或者无数据可以清除(此时回退到默认策略)
  • allkeys-lru -> 对所有数据采用LRU策略清除,直到空间足够
  • volatile-lfu -> 对过期数据采用LFU策略清除,直到空间足够或者无数据可以清除(此时回退到默认策略)
  • allkeys-lfu -> 对所有数据采用LFU策略清除,直到空间足够
  • volatile-random -> 对过期数据随机清除,直到空间足够
  • allkeys-random -> 对所有数据随机清除
  • volatile-ttl -> 根据ttl属性,删除即将过期的数据
  • noeviction -> 默认策略,仅响应读请求,对写请求返回错误

3)maxmemory-samples

上述的算法不是精确算法,默认情况下,Redis抽出5个数据,对其中最符合策略的一个进行清除,如果调大取样率,则效果更好但也更消耗CPU,反之亦然

4)懒删除

默认的del命令是阻塞命令,虽然Redis提供了unlink等非阻塞命令,但是其他操作造成的数据清除还是阻塞的,比如上述的缓存清除,此时就需要配置懒删除,以非阻塞方式释放内存。这些选项默认都是no。

  • lazyfree-lazy-eviction :代表是否在缓存数据清除时使用非阻塞方式
  • lazyfree-lazy-expire :代表数据过期清除时是否使用非阻塞方式
  • lazyfree-lazy-server-del : 代表由于其他命令导致的数据清除时,是否使用非阻塞方式
  • slave-lazy-flush :代表由于全量同步导致数据清除时是否使用非阻塞方式

2.10 AOF配置

AOF是另一种持久化方案,RDB在持久化时,由于用时较长,可能会导致最近若干时间内的改动丢失,AOF采用增量方式持久化,最多丢失1秒的更改。

AOF和RDB可以共存,如果启用AOF,则会在Redis服务器启动时加载AOF文件进行数据恢复。

1)appendonly

表示是否启用AOF,默认no

2)appendfilename

设置AOF文件的名称

3)appendfsync

代表持久化频率,有三个选项:

  • always:每次修改都触发fsync,将数据刷写到硬盘上
  • no:不触发fsync,由操作系统管理数据的刷写
  • everysec(默认):每秒触发一次fsync

4)no-appendfsync-on-rewrite

如果appendfsync为always或everysec时,Redis可能阻塞fsync调用太久,该选项可以使Redis在有其他进程调用fsync时不会去触发fsync,即退化为appendfsync no,可以在一定程度上缓解问题,不过也会导致可能有数据来不及持久化

5)自动重写时机

Redis会记住上一次重写后AOF文件的大小,然后根据当前大小与auto-aof-rewrite-percentage(默认100)和auto-aof-rewrite-min-size(默认64MB)的值进行比较,如果达到配置值,则自动触发重写

6)aof-load-truncated

Redis在启动时会自动加载AOF文件,如果因为操作系统崩溃导致AOF文件不完整,默认情况下(即该配置为yes),Redis会尝试尽可能多地读取数据并恢复,如果此配置项为no,则Redis会拒绝启动并报错

7)aof-use-rdb-preamble

相当于把AOF文件变成 RDB+AOF元数据 ,这样做读写都会更快,不过可能导致格式问题,所以默认为no

2.11 Lua脚本最大执行时间

lua-time-limit指定了脚本最多允许运行多少毫秒,如果一个脚本运行时间超过该时长,就会对接下来的请求响应错误,此时可以使用script kill结束脚本,或shutdown nosave关闭服务器。

2.12 slowlog

slowlog用来统计慢查询,需要注意的是,这里只统计了命令本身调用所用的时间,而不包括命令调用导致的I/O时间(如连接客户端等),所以slowlog没有记录不代表没有超时操作。

1)slowlog-log-slower-than

表示slowlog记录调用时间在多少毫秒以上的慢查询,默认10000

2)slowlog-max-len

代表slowlog记录最近多少个慢查询记录,默认128

2.13 高级配置

1)数据结构配置

Redis支持的数据结构,如string、hash、set等,都会根据存储的数据规模大小,对底层的数据结构进行转换,例如hash,在数据量较小时,会以链表的形式存储,当数据量足够大时,就会转换为hashtable,此处的配置就是各数据结构底层结构转换的阈值:

  • hash-max-ziplist-entries(默认512)、hash-max-ziplist-value(默认64):即当哈希表存储了超过512条数据,或者单条数据超过64字节时,就会转换为hashtable
  • list-max-ziplist-size(默认-2):该值设置了list的容量,取值范围是:负值(-5~-1),分别代表64、32、16、8、4KB,或者正数,例如3,则代表3KB
  • list-compress-depth(默认0):代表从头、尾起压缩多少个节点,0代表不压缩,对于一个链表 head-node1-node2-node3-tail,如果压缩深度设置为2,则仅有node2不压缩。
  • zset-max-ziplist-entries(默认128)、zset-max-ziplist-value(默认64):作用和hash的一样,转换为跳跃表
  • hll-sparse-max-bytes(默认3000):HyperLogLog用来统计不同元素的数量,当元素数少于这里的配置值时,以稀疏形式表示,超过配置值后变为密集表示
  • activerehashing(默认yes):Redis的hashtable默认使用懒重哈希策略,可能导致重哈希操作积压太多,如果该项设为yes,就会立即进行重哈希,从而节约内存

2)客户端缓存配置

  • client-output-buffer-limit:配置客户端输出缓存,默认配置如下:
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

后面四个项的意思是:

1)类型:有normal、slave、pubsub三种,分别代表普通客户端、连接到从节点的客户端、订阅了pubsub通道的客户端

2) hard-limit:当缓存大小到达hard-limit时,直接断开

3)soft-limit、soft-seconds:当缓存大小到达soft-limit时,等待soft-seconds秒后断开

  • client-query-buffer-limit:配置客户端查询缓存,默认1GB

3)其他服务器配置

  • proto-max-bulk-len:默认512MB,即批量请求的大小最多512MB
  • hz:默认10,用来配置Redis检查需要执行的后台任务的频率,该值越大,延迟越小,但是CPU消耗更大
  • aof-rewrite-incremental-fsync:默认yes,即每积累32MB数据就调用fsync刷写进磁盘

4)LFU配置

Redis提供了两个LFU的配置项:lfu-log-factor(默认10)、lfu-decay-time(默认1)。

LFU策略下,Redis的计数器有8位,默认值为5,最大值为255(2的8次方减1),如果每次访问都增大,很容易溢出,所以采用了概率增大计数器的方式。当一个键被访问时,首先从0到1中随机选一个值R,然后用旧值参与计算计数器增大概率P,公式为:1/(oldvalue*lfu_log_factor+1),当R<P时,计数器增大。

lfu-decay-time代表计数器值的半衰期,默认1代表每过1分钟,计数器值减半(小于等于10时则减1),如果设置为0,则每次扫描计数器时进行减半。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章