redis数据库
redis配置
logfile
#日志文件位置及文件名称
bind 0.0.0.0
#监听地址,可以有多个 如bind 0.0.0.0 127.0.0.1
daemonize yes
#yes启动守护进程运行,即后台运行,no表示不启用
pidfile /var/run/redis.pid
# 当redis在后台运行的时候,Redis默认会把pid文件在在/var/run/redis.pid,也可以配置到其他地方。
# 当运行多个redis服务时,需要指定不同的pid文件和端口
port 6379
# 指定redis运行的端口,默认是6379
unixsocket
#sock文件位置
unixsocketperm
#sock文件权限
timeout 0
# 设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接, 0是关闭此设置
loglevel debug
# 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
logfile ""
# 日志文件配置,默认值为stdout,标准输出,若后台模式会输出到/dev/null
syslog-enabled
# 是否以syslog方式记录日志,yes开启no禁用,与该配置相关配置syslog-ident 和syslog-facility local0 分别是指明syslog的ident和facility
databases 16
#配置可用的数据库个数,默认值为16,默认数据库为0,数据库范围在0-(database-1)之间
always-show-logo yes #4.0以后新增配置
#是否配置日志显示redis徽标,yes显示no不显示
################################ 快照相关配置 #################################
save 900 1
save 300 10
save 60 10000
#配置快照(rdb)促发规则,格式:save <seconds> <changes>
#save 900 1 900秒内至少有1个key被改变则做一次快照
#save 300 10 300秒内至少有300个key被改变则做一次快照
#save 60 10000 60秒内至少有10000个key被改变则做一次快照
dbfilename dump.rdb
#rdb持久化存储数据库文件名,默认为dump.rdb
stop-write-on-bgsave-error yes
#yes代表当使用bgsave命令持久化出错时候停止写RDB快照文件,no则代表继续写
rdbchecksum yes
#开启rdb文件校验
dir "/etc"
#数据文件存放目录,rdb快照文件和aof文件都会存放至该目录
################################# 复制相关配置参数 #################################
slaveof <masterip> <masterport>
#设置该数据库为其他数据库的从数据库,设置当本机为slave服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
masterauth <master-password>
#主从复制中,设置连接master服务器的密码(前提master启用了认证)
slave-serve-stale-data yes
# 当从库同主机失去连接或者复制正在进行,从机库有两种运行方式:
# 1) 如果slave-serve-stale-data设置为yes(默认设置),从库会继续相应客户端的请求
# 2) 如果slave-serve-stale-data是指为no,除了INFO和SLAVOF命令之外的任何请求都会返回一个错误"SYNC with master in progress"
repl-ping-slave-period 10
#从库会按照一个时间间隔向主库发送PING命令来判断主服务器是否在线,默认是10秒
repl-timeout 60
#设置主库批量数据传输时间或者ping回复时间间隔超时时间,默认值是60秒
# 一定要确保repl-timeout大于repl-ping-slave-period
repl-backlog-size 1mb
#设置复制积压大小,只有当至少有一个从库连入才会释放。
slave-priority 100
#当主库发生宕机时候,哨兵会选择优先级最高的一个称为主库,从库优先级配置默认100,数值越小优先级越高
min-slaves-to-write 3
min-slaves-max-lag 10
#设置某个时间断内,如果从库数量小于该某个值则不允许主机进行写操作,以上参数表示10秒内如果主库的从节点小于3个,则主库不接受写请求,min-slaves-to-write 0代表关闭此功能。
################################## 安全相关配置 ###################################
requirepass
#客户端连接认证的密码,默认为空,即不需要密码,若配置则命令行使用AUTH进行认证
maxclients 10000
# 设置同一时间最大客户端连接数,4.0默认10000,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,
# 如果设置 maxclients 0,表示不作限制。
# 当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
maxmemory 4gb
#设置最大使用的内存大小
maxmemory-policy noeviction
#设置达到最大内存采取的策略:
# 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)
# 4.0默认noeviction代表不删除任何key,只在写操作时候返回错误。
maxmemory-samples 5
#LRU,LFU等算法样本设置,默认5个key
############################## AOF相关配置###############################
appendonly no
# 设置AOF持久化,yes开启,no禁用,开启后redis会把所接收到的每一次写操作请求都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态。
# 但是这样会造成appendonly.aof文件过大,所以redis还支持了BGREWRITEAOF指令,对appendonly.aof 进行重写。
appendfilename "appendonly.aof"
#设置AOF文件名
appendfsync everysec
# AOF文件写策略,Redis支持三种同步AOF文件的策略:
# no: 不进行同步,交给操作系统去执行 ,速度较快
# always: always表示每次有写操作都调用fsync方法强制内核将该写操作写入到文件,速度会慢, 但是安全,因为每次写操作都在AOF文件中.
# everysec: 表示对写操作进行累积,每秒同步一次,折中方案.
# 默认是"everysec",按照速度和安全折中这是最好的。
no-appendfsync-on-rewrite no
# AOF策略设置为always或者everysec时,后台处理进程(后台保存或者AOF日志重写)会执行大量的I/O操作
# 在某些Linux配置中会阻止过长的fsync()请求。注意现在没有任何修复,即使fsync在另外一个线程进行处理,为了减缓这个问题,可以设置下面这个参数no-appendfsync-on-rewrite
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
#当AOF文件增长到一定大小的时候Redis能够调用BGREWRITEAOF对日志文件进行重写,它是这样工作的:Redis会记住上次进行些日志后文件的大小(如果从开机以来还没进行过重写,那日子大小在开机的时候确定)。
#基础大小会同现在的大小进行比较。如果现在的大小比基础大小大制定的百分比,重写功能将启动
# 同时需要指定一个最小大小用于AOF重写,这个用于阻止即使文件很小但是增长幅度很大也去重写AOF文件的情况
# 设置 percentage 为0就关闭这个特性
#auto-aof-rewrite-percentage 代表AOF文件每次重写文件大小(以百分数代表),100表示百分之百,即当文件增加了1倍(100%),则开始重写AOF文件
#auto-aof-rewrite-min-size 设置最小重写文件大小,避免文件小而执行太多次的重写
aof-load-truncated yes
#当redis突然运行崩溃时,会出现aof文件被截断的情况,Redis可以在发生这种情况时退出并加载错误,以下选项控制此行为。
#如果aof-load-truncated设置为yes,则加载截断的AOF文件,Redis服务器启动发出日志以通知用户该事件。
#否则,如果该选项设置为no,则服务器将中止并显示错误并停止启动。当该选项设置为no时,用户需要在重启之前使用“redis-check-aof”实用程序修复AOF文件在进行重启
################################## 慢查询配置 ###################################
slowlog-log-slower-than 10000
#Redis Slow Log 记录超过特定执行时间的命令。执行时间不包括I/O计算比如连接客户端,返回结果等,只是命令执行时间,可以通过两个参数设置slow log:一个是告诉Redis执行超过多少时间被记录的参数slowlog-log-slower-than(微秒,因此1000000代表一分钟
#另一个是slow log 的长度。当一个新命令被记录的时候最早的命令将被从队列中移除
slowlog-max-len 128
#慢查询命令记录队列长度设置,该队列占用内存,可以使用SLOWLOG RESET清空队列
############################### 高级配置 ###############################
hash-max-zipmap-entries 512
hash-max-zipmap-value 64
# 当hash中包含超过指定元素个数并且最大的元素没有超过临界时,hash将以一种特殊的编码方式(大大减少内存使用)来存储,这里可以设置这两个临界值
# Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,
# 这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。
list-max-ziplist-size -2
#Lists也以特殊方式编码,以节省大量空间。
#可以指定每个内部列表节点允许的条目数
#作为固定的最大大小或最大元素数。
#对于固定的最大大小,使用-5到-1表示:
#-5:最大大小:64 Kb < - 不建议用于正常工作负载
#-4:最大尺寸:32 Kb < - 不推荐
#-3:最大尺寸:16 Kb < - 可能不推荐
#-2:最大尺寸:8 Kb < - 好
#-1:最大尺寸:4 Kb < - 良好
#正数意味着存储_exactly_元素数量
#每个列表节点。
#性能最高的选项通常为-2(8 Kb大小)或-1(4 Kb大小)
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
# list数据类型多少节点以下会采用去指针的紧凑存储格式。
# list数据类型节点值大小小于多少字节会采用紧凑存储格式。
activerehashing yes
# Redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用
# 当你的使用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。
# 如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
#客户端输出缓冲区限制可用于强制断开客户端,由于某种原因,没有足够快地从服务器读取数据,常见的原因是Pub / Sub客户端不能像很快的消费一条消息,可以为三种不同类型的客户端设置不同的限制:
#normal - >普通客户端,包括MONITOR客户端
#subve - >从服务器客户端
#pubsub - >客户端订阅了至少一个pubsub通道或模式
#设置方法:client-output-buffer-limit 软限制大小 硬限制大小 秒数
#当客户端达到硬限制大小则立即断开连接,当客户端达到软限制时候并且在设置的秒数缓冲大小任然超了,则在设置的秒数后断开连接
key操作
del key #删除某个key
keys pattern #查看符合正则的所有key
exists key [key ...] #判断某个key是否存在,可支持多个,返回存在的个数
expire key seconds #刷新某个key过期时间
move key db #移动key到某个数据库
string操作
set key value [ex seconds] [px milliseconds] [nx|xx] #设置key为指定的字符串值。
#参数:
#ex seconds – 设置键key的过期时间,单位时秒
#px milliseconds – 设置键key的过期时间,单位时毫秒
#nx – 只有键key不存在的时候才会设置key的值
#xx – 只有键key存在的时候才会设置key的值
append key value #如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。 如果 key 不存在,那么它将首先创建一个空字符串的key,再执行追加操作,这种情况 append 将类似于 set 操作。
get key #获取key值,不存在则返回nil
getrange key start end #获取指定key值的索引开始位置和结束位置所对应的值,索引从0开始
getset key value #设置新的key值,并获取设置之前的值,如果key不存在则设置,并返回nil
mget key [key ...] #批量获取key的值
mset key value [key value ...] #批量设置key的值
decr key #数字类型的key自减操作,key类型不是数字则报错
incr key #数字类型key 自加操作,与decr相反
decrby key decrement #数字类型key指定减少数值
incrby key increment #数字类型key指定增加数值,与decrby相反
strlen key #获取key长度
list操作
lpush key value [value ...] #从列表左边放入一个或者多个元素
lpushx key value #当列表存在时,从左边放入一个元素
rpush key value [value ...] #从列表右边放入一个或者多个元素
rpushx key value #当列表存在时,从右边放入一个元素
lset key index value #根据索引设置列表中元素的值,当list不存在是报错
lindex key index #根据列表索引获取元素值,索引从0开始
linsert key before|after pivot value #在列表中,基于某个基准点插入值,pivot代表基准点
llen key #获取列表长度
lrange key start stop #根据索引获取列表中的元素,列表索引最后一个可以使用-1
lrem key count value #从存于 key 的列表里移除前 count 次出现的值为 value 的元素
#count > 0: 从头往尾移除值为 value 的元素
#count < 0: 从尾往头移除值为 value 的元素
#count = 0: 移除所有值为 value 的元素
lpop key #从列表左边删除一个元素
rpop key #从列表右边删除一个元素
rpoplpush source destination #删除source列表中的删除最后一个元素将其追加到destination列表
ltrim key start stop #根据索引start和stop保留列表元素
hash操作
hdel key field [field ...] #删除hash表中一个或多个字段
hexists key field #判断hash表中字段是否存在
hget key field #获取hash表中字段的值
hgetall key #获取hash表中所有字段
hset key field value # 设置hash表中字段的值
hsetnx key field value #只有当字段不存在时候才设置hash表中字段值,
hlen key #获取hash表中字段个数
hvals key #获取hash表中所有字段的值
hkeys key #获取hash表中所有的字段
hstrlen key field #获取hash表中指定字段的值的长度
hmset key field value [field value ...] #批量设置hash表中字段的值
hmget key field [field ...] #批量获取hash表中字段的值
集合set操作
sadd key member [member ...] #添加一个或多个元素到集合中
srem key member [member ...] #删除一个或多个集合中的元素
scard key #获取集合中元素数量
smembers key #返回集合中所有的元素
sinter key [key ...] #获取两个或两个以上集合的交集
sunion key [key ...] #获取两个或两个以上集合的并集
sdiff key [key ...] #获取两个或者两个以上集合的差集
sismember key member #判断元素是否是在指定集合中
smove source destination member #移动一个集合中的元素到另一个集合
spop key [count] #移除count个集合中元素,count可选参数,默认为1,即移除一个
有序集合
zadd key [nx|xx] [ch] [incr] score member [score member ...] #向一个有序集合添加成员(元素)
#参数:
#xx: 仅仅更新存在的成员,不添加新成员。
#nx: 不更新存在的成员。只添加新成员。
#ch: 修改返回值为发生变化的成员总数,原始是返回新添加成员的总数 (ch 是 changed 的意思)。更改的元素是新添加的成员,已经存在的成员更新分数。 所以在命令中指定的成员有相同的分数将不被计算在内。注:在通常情况下,zadd返回值只计算新添加成员的数量。
#incr: 当zadd指定这个选项时,成员的操作就等同zincrby命令,对成员的分数进行递增操作。
zcard key #获取有序集合中元素个数
zcount key min max #指定分数范围的元素个数
zincrby key increment member #为有序集的元素的score值加上增加指定的increment
zrange key start stop [withscores] #根据有序集合中分数区间获取集合中的元素
zrange key start stop [withscores] #获取有序集合中元素的排名
zrem key member [member ...] #删除有序集合中一个或多个元素
zscore key member #设置元素在集合中的分数
RDB持久化
save m n
#配置快照(rdb)促发规则,格式:save <seconds> <changes>
#save 900 1 900秒内至少有1个key被改变则做一次快照
#save 300 10 300秒内至少有300个key被改变则做一次快照
#save 60 10000 60秒内至少有10000个key被改变则做一次快照
#关闭该规则使用svae “”
dbfilename dump.rdb
#rdb持久化存储数据库文件名,默认为dump.rdb
stop-write-on-bgsave-error yes
#yes代表当使用bgsave命令持久化出错时候停止写RDB快照文件,no表明忽略错误继续写文件。
rdbchecksum yes
#在写入文件和读取文件时是否开启rdb文件检查,检查是否有无损坏,如果在启动是检查发现损坏,则停止启动。
dir "/etc/redis"
#数据文件存放目录,rdb快照文件和aof文件都会存放至该目录,请确保有写权限
rdbcompression yes
#是否开启RDB文件压缩,该功能可以节约磁盘空间
AOF配置参数
auto-aof-rewrite-min-size 64mb
#AOF文件最小重写大小,只有当AOF文件大小大于该值时候才可能重写,4.0默认配置64mb。
auto-aof-rewrite-percentage 100
#当前AOF文件大小和最后一次重写后的大小之间的比率等于或者等于指定的增长百分比,如100代表当前AOF文件是上次重写的两倍时候才重写。
appendfsync everysec
#no:不使用fsync方法同步,而是交给操作系统write函数去执行同步操作,在linux操作系统中大约每30秒刷一次缓冲。这种情况下,缓冲区数据同步不可控,并且在大量的写操作下,aof_buf缓冲区会堆积会越来越严重,一旦redis出现故障,数据
#always:表示每次有写操作都调用fsync方法强制内核将数据写入到aof文件。这种情况下由于每次写命令都写到了文件中, 虽然数据比较安全,但是因为每次写操作都会同步到AOF文件中,所以在性能上会有影响,同时由于频繁的IO操作,硬盘的使用寿命会降低。
#everysec:数据将使用调用操作系统write写入文件,并使用fsync每秒一次从内核刷新到磁盘。 这是折中的方案,兼顾性能和数据安全,所以redis默认推荐使用该配置。
aof-load-truncated yes
#当redis突然运行崩溃时,会出现aof文件被截断的情况,Redis可以在发生这种情况时退出并加载错误,以下选项控制此行为。
#如果aof-load-truncated设置为yes,则加载截断的AOF文件,Redis服务器启动发出日志以通知用户该事件。
#如果该选项设置为no,则服务将中止并显示错误并停止启动。当该选项设置为no时,用户需要在重启之前使用“redis-check-aof”实用程序修复AOF文件在进行启动。
appendonly no
#yes开启AOF,no关闭AOF
appendfilename appendonly.aof
#指定AOF文件名,4.0无法通过config set 设置,只能通过修改配置文件设置。
dir /etc/redis
#RDB文件和AOF文件存放目录
优缺点
RDB
优点:
- RDB 是一个非常紧凑(compact)的文件,体积小,因此在传输速度上比较快,因此适合灾难恢复。
- RDB 可以最大化 Redis 的性能:父进程在保存 RDB 文件时唯一要做的就是 fork 出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘 I/O 操作。
- RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
缺点:
- RDB是一个快照过程,无法完整的保存所以数据,尤其在数据量比较大时候,一旦出现故障丢失的数据将更多。
- 当redis中数据集比较大时候,RDB由于RDB方式需要对数据进行完成拷贝并生成快照文件,fork的子进程会耗CPU,并且数据越大,RDB快照生成会越耗时。
- RDB文件是特定的格式,阅读性差,由于格式固定,可能存在不兼容情况。
AOF
优点:
- 数据更完整,秒级数据丢失(取决于设置fsync策略)。
- 兼容性较高,由于是基于redis通讯协议而形成的命令追加方式,无论何种版本的redis都兼容,再者aof文件是明文的,可阅读性较好。
缺点:
- 数据文件体积较大,即使有重写机制,但是在相同的数据集情况下,AOF文件通常比RDB文件大。
- 相对RDB方式,AOF速度慢于RDB,并且在数据量大时候,恢复速度AOF速度也是慢于RDB。
- 由于频繁地将命令同步到文件中,AOF持久化对性能的影响相对RDB较大,但是对于我们来说是可以接受的。
混合持久化
优点:
- 混合持久化结合了RDB持久化 和 AOF 持久化的优点, 由于绝大部分都是RDB格式,加载速度快,同时结合AOF,增量的数据以AOF方式保存了,数据更少的丢失。
缺点:
- 兼容性差,一旦开启了混合持久化,在4.0之前版本都不识别该aof文件,同时由于前部分是RDB格式,阅读性较差
redis主从配置
########从库##############
slaveof <masterip> <masterport>
#设置该数据库为其他数据库的从数据库
masterauth <master-password>
#主从复制中,设置连接master服务器的密码(前提master启用了认证)
slave-serve-stale-data yes
# 当从库同主库失去连接或者复制正在进行,从库有两种运行方式:
# 1) 如果slave-serve-stale-data设置为yes(默认设置),从库会继续相应客户端的请求
# 2) 如果slave-serve-stale-data设置为no,除了INFO和SLAVOF命令之外的任何请求都会返回一个错误"SYNC with master in progress"
slave-priority 100
#当主库发生宕机时候,哨兵会选择优先级最高的一个称为主库,从库优先级配置默认100,数值越小优先级越高
slave-read-only yes
#从节点是否只读;默认yes只读,为了保持数据一致性,应保持默认
####主库##############
repl-disable-tcp-nodelay no
#在slave和master同步后(发送psync/sync),后续的同步是否设置成TCP_NODELAY假如设置成yes,则redis会合并小的TCP包从而节省带宽,但会增加同步延迟(40ms),造成master与slave数据不一致假如设置成no,则redis master会立即发送同步数据,没有延迟
#前者关注性能,后者关注一致性
repl-ping-slave-period 10
#从库会按照一个时间间隔向主库发送PING命令来判断主服务器是否在线,默认是10秒
repl-backlog-size 1mb
#复制积压缓冲区大小设置
repl-backlog-ttl 3600
#master没有slave一段时间会释放复制缓冲区的内存,repl-backlog-ttl用来设置该时间长度。单位为秒。
min-slaves-to-write 3
min-slaves-max-lag 10
#设置某个时间断内,如果从库数量小于该某个值则不允许主机进行写操作,以上参数表示10秒内如果主库的从节点小于3个,则主库不接受写请求,min-slaves-to-write 0代表关闭此功能。