导图社区 redis知识点汇总
详细的描述了redis的5种结构及其常用指令,介绍redis事务,redis同步策略等,需要的朋友,可收藏。
编辑于2021-07-15 12:23:40redis知识点
redis数据结构
类型:string、hash、list、set、zset
string
相关指令
set
将字符串值关联到key,如果key的值已经存在,则直接覆盖旧值
setnx
只在键 key 不存在的情况下, 将键 key 的值设置为 value 。
setex
将键 key 的值设置为 value , 并将键 key 的生存时间设置为 seconds 秒钟。
get
获取指定key的值,如果返回值为nil,说明当前数据库不存在这个key
incr
为键 key 储存的数字值加上一。
2种常见情况
如果键 key 不存在, 那么它的值会先被初始化为 0 , 然后再执行 INCR 命令。
如果键 key 储存的值不能被解释为数字, 那么 INCR 命令将返回一个错误。
incrby
为键 key 储存的数字值加上指定值。
decr
为键 key 储存的数字值减一。
decrby
为键 key 储存的数字值加上指定值。
使用场景
计数
hash
相关指令
hset
将哈希表 hash 中域 field 的值设置为 value 。
2种情况
如果给定的哈希表并不存在, 那么一个新的哈希表将被创建并执行 HSET 操作。
如果域 field 已经存在于哈希表中, 那么它的旧值将被新值 value 覆盖。
返回值
当 HSET 命令在哈希表中新创建 field 域并成功为它设置值时, 命令返回 1 ; 如果域 field 已经存在于哈希表, 并且 HSET 命令成功使用新值覆盖了它的旧值, 那么命令返回 0 。
hsetnx
当且仅当域 field 尚未存在于哈希表的情况下, 将它的值设置为 value。
hget
HGET 命令在默认情况下返回哈希表中给定域的值。
hexists
检查给定域 field 是否存在于哈希表 hash 当中。存在返回1,不存在返回0
hdel
删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
hlen
返回哈希表 key 中域的数量。
hgetall
返回哈希表 key 中,所有的域和值。
使用场景
结构化对象
list
相关指令
lpush
将一个或多个值 value 插入到列表 key 的表头
说明
如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头: 比如说,对空列表 mylist 执行命令 LPUSH mylist a b c ,列表的值将是 c b a ,这等同于原子性地执行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三个命令。
lpushx
将值 value 插入到列表 key 的表头,当且仅当 key 存在并且是一个列表。
说明
和 lpush 命令相反,当 key 不存在时, LPUSHX 命令什么也不做。
rpush
将一个或多个值 value 插入到列表 key 的表尾(最右边)。
说明
如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表尾:比如对一个空列表 mylist 执行 RPUSH mylist a b c ,得出的结果列表为 a b c ,等同于执行命令 RPUSH mylist a 、 RPUSH mylist b 、 RPUSH mylist c 。
rpushx
将值 value 插入到列表 key 的表尾,当且仅当 key 存在并且是一个列表。
说明
和 rpush 命令相反,当 key 不存在时, RPUSHX 命令什么也不做。
lpop
移除并返回列表 key 的头元素。
rpop
移除并返回列表 key 的尾元素。
lindex
返回列表 key 中,下标为 index 的元素。
linsert
用法
LINSERT key BEFORE|AFTER pivot value
将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。 当 pivot 不存在于列表 key 时,不执行任何操作。 当 key 不存在时, key 被视为空列表,不执行任何操作。 如果 key 不是列表类型,返回一个错误。
说明
如果命令执行成功,返回插入操作完成之后,列表的长度。 如果没有找到 pivot ,返回 -1 。 如果 key 不存在或为空列表,返回 0 。
lset key index
将列表 key 下标为 index 的元素的值设置为 value 。
说明
当 index 参数超出范围,或对一个空列表( key 不存在)进行 LSET 时,返回一个错误。
lrange key start stop
返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。
说明
下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
使用场景
做消息队列、基于lrange命令的分页功能
set
相关指令
sadd key member [member …]
将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
sismember key member
判断 member 元素是否是集合 key 的成员。是返回1,否则返回0
spop key
移除并返回集合中的一个随机元素。
srem key member
移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。
smove source destination member
将member从source移到destination中
scard key
返回集合 key 的基数(集合中元素的数量)。
smembers key
返回集合 key 中的所有成员。
使用场景
全局去重,因为set集合的元素不能重复
zset
相关指令
zadd key score member [[score member] [score member] …]
将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。
zrem key member [member …]
移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
zscore key member
返回有序集 key 中,成员 member 的 score 值。
zcard key
返回有序集 key 的基数(member的数量)。
zcount key min max
返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
zrange key start stop [WITHSCORES]
返回有序集 key 中,指定区间内的成员。
使用场景
排序
查看类型操作的指令:help @类型名
指令大全
数据库相关指令
exists
检查给定的key是否存在,存在返回1,否则返回0
type
返回key所存储的值的类型
rename key newkey
重命名
move
将当前数据库的key移动到指定的数据库中
del
删除给定的一个或多个key
randomkey
从当前数据库随机返回一个key
dbsize
返回当前数据库的key的数量
keys
查找所有符合给定模式的key
匹配规则
* 可以匹配0或多个任意字符
?可以匹配一个任意字符
[]可以匹配[]中的一个字符
匹配实例
KEYS * 匹配数据库中所有 key 。
KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
KEYS h*llo 匹配 hllo 和 heeeeello 等。
KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo。
sort
排序
用法
升序
sort key
降序
sort key desc
说明
在5种数据类型中,只有列表和有序集合是有序的,因此可以对这2种结构的进行排序
flushdb
清空当前数据库所有key
flushall
清空所有数据库的key
select
切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值。
swapdb
对换指定的两个数据库, 使得两个数据库的数据立即互换。
redis应用场景
缓存
redis持久化
redis持久化方式
RDB快照持久化
方式1:客户端执行save指令,会导致服务器阻塞无法进其他操作
方式2:客户端执行bgsave指令,服务器会创建子进程进行持久化操作
方式3:在配置文件SNAPSHOTTING部分配置save <seconds> <changes>
方式4:客户端执行SHUTDOWN,会触发服务器进行持久化操作
方式5:当一台redis服务器连接另一台redis服务器,并向对方发送SYNC命令来开始一次复制操作的时候,如果主服务器目前没有在执行BGSAVE操作,或者主服务器并非刚刚执行完BGSAVE操作,那么主服务器就会执行BGSAVE命令。
AOF持久化
指令:save、bgsave
SAVE
SAVE执行一个同步保存操作,将当前Redis实例的所有数据快照以RDB文件的形式保存到硬盘。很少使用这个指令,通常用BGSAVE替代。
缺点:会阻塞所有客户端
BGSAVE
BGSAVE指令执行后立即返回OK,然后redis会fork出一个新子进程,原来的redis进程(父进程)继续处理客户端的请求,而子进程负责将数据保存到磁盘,然后退出
BBGREWRITEAOF
执行一个 AOF文件 重写操作。重写会创建一个当前 AOF 文件的体积优化版本。
优点:即使 BGREWRITEAOF 执行失败,也不会有任何数据丢失,因为旧的 AOF 文件在 BGREWRITEAOF 成功之前不会被修改。
redis复制
指令
SLAVEOF
用法1:SLAVEOF host port
功能:在运行时动态修改复制功能的行为。将当前服务器转为指定服务器的从属服务器。
注意:如果当前服务器已经是某个主服务器的从属服务器,那么执行SLAVEOF host port将使当前服务器停止对久主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步。
用法2: SLAVEOF NO ONE
功能:对一个从属服务器执行命令 SLAVEOF NO ONE 将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得数据不会被丢弃。
ROLE
用法:ROLE
功能:返回服务器实例在复制中担任的角色,这个角色可以是master、slave或者sentinel。除了角色之外,命令还会返回与该角色相关的其他信息:主服务器将返回属下从服务器的 IP 地址和端口。从服务器将返回自己正在复制的主服务器的 IP 地址、端口、连接状态以及复制偏移量。Sentinel 将返回自己正在监视的主服务器列表。
redis复制的重要方面
redis使用异步复制
从 Redis 2.8 开始, 从服务器会以每秒一次的频率向主服务器报告复制流(replication stream)的处理进度。
一个主服务器可以有多个从服务器
复制功能不会阻塞主服务器
即使有一个或多个从服务器正在进行初次同步, 主服务器也可以继续处理命令请求。
复制功能也不会阻塞从服务器
只要在 redis.conf 文件中进行了相应的设置, 即使从服务器正在进行初次同步, 服务器也可以使用旧版本的数据集来处理命令查询。不过, 在从服务器删除旧版本数据集并载入新版本数据集的那段时间内, 连接请求会被阻塞。 你还可以配置从服务器, 让它在与主服务器之间的连接断开时, 向客户端发送一个错误。
复制功能可以单纯地用于数据冗余
也可以通过让多个从服务器处理只读命令请求来提升扩展性(scalability): 比如说, 繁重的 SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern …]] [ASC | DESC] [ALPHA] [STORE destination] 命令可以交给附属节点去运行。
可以通过复制功能来让主服务器免于执行持久化操作
只要关闭主服务器的持久化功能, 然后由从服务器去执行持久化操作即可。
复制功能运行原理及步骤
1.无论是初次连接还是重新连接, 当建立一个从服务器时, 从服务器都将向主服务器发送一个 SYNC 命令。
2.接到 SYNC 命令的主服务器将开始执行 BGSAVE , 并在保存操作执行期间, 将所有新执行的写入命令都保存到一个缓冲区里面。
3.当 BGSAVE 执行完毕后, 主服务器将执行保存操作所得的 .rdb 文件发送给从服务器, 从服务器接收这个 .rdb 文件, 并将文件中的数据载入到内存中。
4.之后主服务器会以 Redis 命令协议的格式, 将写命令缓冲区中积累的所有内容都发送给从服务器。
部分重同步
从 Redis 2.8 开始, 在网络连接短暂性失效之后, 主从服务器可以尝试继续执行原有的复制进程(process), 而不一定要执行完整重同步操作。
问题及注意事项
redis事务
事务相关指令
MULTI
开启事务
EXEC
执行事务
WATCH
对指定的键进行监视
UNWATCH
取消对所有被监视的键的监视
DISCARD
放弃MULTI之后的所有键的执行
简单事务(流水线事务)
流程
当redis从一个客户端那里接收到MULTI命令时,redis会将这个客户端之后发送的所有命令都放到一个队列里面,直到这个客户端发送EXEC命令为止,然后redis就会在不被打断的情况下,一个接一个的执行存储在队列里的命令。
问题
简单事务在EXEC被调用之前不会执行任何实际操作,所以用户将没办法根据读取到的数据来做决定
优点
可以通过减少客户端与redis服务器之间的网络通信次数来提升Redis在执行多个命令时的性能
复杂事务
流程
假如某个(或某些) key 正处于 WATCH 命令的监视之下,且事务块(MULTI与EXEC之间的内容)中有和这个(或这些) key 相关的命令,那么 EXEC 命令只在这个(或这些) key 没有被其他命令所改动的情况下执行并生效,否则该事务被打断(abort)。
redis为啥不对事务加锁
因为加锁有可能会造成长时间的等待,所以redis为了尽可能的减少客户端的等待时间,并不会在执行WATCH命令时对数据进行加锁。相反地,redis只会在数据已经被其他客户端抢先修改了的情况下,通知执行了WATCH的客户端,这种做法被称为乐观锁。
redis锁
redis性能测试及优化
redis性能测试工具
redis-benchmark
参数介绍
-h
指定服务器主机名,默认127.0.0.1
-p
指定服务器端口号,默认6379
-s
指定服务器socket
-c
指定客户端的数量,也可称之为并发量,默认值为50
-n
指定请求数,默认值为10000
-d
指定SET/GET值的数据大小,以字节为单位,默认值为2
-k
值为1或0,1表示keep alive,0表示reconnect,默认值为1
-r
SET/GET/INCR使用随机key,SADD使用随机值
-P
通过管道传输<numreq>请求,默认值为1
-q
强制退出redis,仅显示query/sec值
-csv
以csv格式输出
-l
生成循环,永久执行测试
-t
仅运行以逗号分隔的测试命令列表
-I
Idle模式,仅打开n个Idle连接并等待
运行结果会展示一些常用命令或-t参数指定的命令在1秒内可以执行的次数
查询性能参数指令
info
获取所有与redis服务相关的信息
信息分类
server
client
memory
persistence
stat
replication
cpu
commandstats
cluster
keyspace
用法示例
info cpu
info memory
info stats
性能指标
redis分片
redis过期策略及内存淘汰机制
redis过期策略
定时过期
每个设置过期时间的key都需要设置一个定时器,到过期时间就会立即删除。
优点:可以立即清理过期的数据,对内存很友好
缺点:会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量
惰性过期
只有当访问一个key时,才会判断该key是否已过期,过期则清除。
优点:可以最大化节约CPU资源
缺点:极端情况下可能出现大量过期的key未被访问,从而不会清除数据,占用大量内存
定期过期
每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。
该策略是定时策略与惰性策略的折中方案,通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
内存淘汰策略
内存淘汰策略定义:redis用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据。
内存淘汰策略分类
noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。
allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。
如何设置内存淘汰策略
配置文件中LIMITS部分的maxmemory-policy可以配置内存淘汰策略
示例:maxmemory-policy noeviction
总结
Redis的内存淘汰策略的选取并不会影响过期的key的处理。内存淘汰策略用于处理内存不足时的需要申请额外空间的数据;过期策略用于处理过期的缓存数据。
redis常见问题
缓存雪崩
定义:同一时间缓存大量失效,导致后面的请求会直接访问数据库,造成数据库短时间内承受大量请求而崩溃。
解决方法
方式1:缓存的过期时间设置随机,防止同一时间大量数据过期现象发生
方式2:一般并发量不是特别多的时候,使用最多的解决方案是加锁排队
患者击穿
缓存穿透
redis配置文件解读
redis配置文件中划分了很多部分
INCLUDES部分
GENERAL部分
port:6379
配置端口号
tcp-backlog 511
设置TCP最大的积压的数量,当每秒有大量请求过来时设置的最大请求积压数量,要配合系统的具体参数配合使用
bind 127.0.0.1
服务器只会与绑定的IP上的redis客户端连接,bind后可以有多个IP,注释这个配置可以允许所有IP上的客户端进行连接
timeout 0
在客户端空闲了多少秒之后关闭连接,0表示永不关闭连接
tcp-keepalive 0
服务器发送ack给客户端的间隔秒数,0表示不发送ack给客户端,需掌握TCP3次握手
loglevel notice
指定日志级别
debug:有大量信息,开发或测试时使用
verbose:有很多很少有用的信息,但是没有debug那么多
notice:显示适度的有用信息
warning:只记录非常重要/关键的消息
logfile ""
指定日志文件名
databases 16
设置数据库的数量
SNAPSHOTTING部分:快照持久化
save <seconds> <changes>
自上次快照起,如果指定秒数(seconds)内发生写操作的次数大于changes,那么redis就会自动执行BGSAVE指令进行快照持久化操作
stop-writes-on-bgsave-error yes
当快照持久化失败时,是否停止执行redis写操作,默认为yes,通常设为no
rdbcompression yes
是否压缩快照持久化的文件,即.rdb文件
rdbchecksum yes
是否启用.rdb文件的校验和
校验和的功能:判断文件是否已经损毁
dbfilename dump.rdb
指定快照持久化的文件名,默认为dump.rdb
dir ./
指定快照持久化文件所在目录,AOF持久化产生的文件也会位于该目录下,默认为./,即redis安装目录
REPLICATION部分:复制
slaveof <masterip> <masterport>
指定redis主服务器的IP地址与端口号
masterauth <master-password>
redis主服务器的密码
slave-serve-stale-data yes
当从服务器与主服务器断开连接时,从服务器是否响应客户端的请求,默认yes,即响应客户端的请求,但是数据可能是旧的(主服务器可能对该数据进行了更新或其他操作),如果设置为no,那么当有客户端向从服务器请求时(除了INFO、SAVEOF指令),从服务器会响应 SYNC with master in progress
slave-read-only yes
从服务器是否只允许客户端进行读操作,默认为yes
repl-diskless-sync no
是否无盘复制,默认为no
知识扩展
复制传输方式
磁盘备份传输
流程:Redis主机创建一个新进程,将RDB文件写入磁盘。之后,文件由父进程以增量方式传输到从属进程。
特点:使用磁盘备份复制,在生成RDB文件时,只要当前生成RDB文件的子系统完成工作,就可以将更多的从机排队并与RDB文件一起提供服务。
无盘传输
流程:Redis主机创建了一个新进程,直接将RDB文件写入从套接字,而不需要接触磁盘。
特点:使用无盘复制,一旦传输 开始,新的从设备将进入队列,新的传输将在当前传输终止时开始。
repl-diskless-sync-delay 5
无盘复制时,设置同步延时时间,单位为秒
详细解释
启用无盘复制时,可以配置服务器等待的延迟,以便生成通过套接字将RDB传输到从属服务器的子级。
这一点很重要,因为一旦传输开始,就不可能为到达的新从设备提供服务,这些设备将排队等待下一次RDB传输,因此服务器会等待一个延迟,以便让更多的从设备到达。
延迟以秒为单位指定,默认为5秒。要完全禁用它,只需将其设置为0秒,传输将尽快开始。
repl-ping-slave-period 10
从服务器在预定义的时间间隔内发送ping到服务器。默认值为10秒。
repl-timeout 60
设置复制超时的时间,单位为秒。
根据3个指标设置超时时间
1.从从机的角度看,同步期间的大容量传输I/O。
2.从从服务器(数据、ping)的角度看,主服务器超时。
3.从主机的角度来看,从机超时(REPLCONF ACK pings)。
重点
要确保该值大于为repl-ping-slave-period指定的值,否则每当主服务器和从属服务器之间的通信量低时都会检测到超时。
repl-disable-tcp-nodelay no
同步后在从属套接字上是否禁用TCP_NODELAY
yes:Redis将使用较少的TCP数据包和较少的带宽将数据发送到从属服务器。但这可能会增加数据在从机端出现的延迟,对于Linux内核使用默认配置,最长为40毫秒。
no:数据出现在从属端的延迟将减少,但复制将使用更多带宽。
总结:默认情况下,我们会针对低延迟进行优化,但在流量非常大的情况下,或者当主服务器和从服务器之间有很多跳跃时,将其设置为“是”可能是个好主意。
repl-backlog-size 1mb
设置复制backlog区域的大小
知识详解
backlog
backlog是一个缓冲区,当从机断开连接一段时间时,它会累积从机数据,因此当从机需要重新连接时,通常不需要完全重新同步,部分重新同步就足够了,只需传递从机在断开连接时丢失的部分数据。
backlog越大,从服务器断开连接的时间越长,以后能够执行部分重新同步的时间就越长。
只有当至少有一个从机连接时,才会分配backlog。
repl-backlog-ttl 3600
从最后一个从机断开连接到释放backlog缓冲区所需的秒数
知识详解
在一段时间内主节点不再连接从节点之后,积压的任务将被释放。该选项配置从最后一个从机断开连接到释放backlog缓冲区所需的秒数。
值为0意味着永远不会释放backlog。
slave-priority 100
设置salve优先级,默认优先级为100。
知识详解
slave优先级是Redis在INFO输出中发布的整数。
Redis Sentinel使用它来选择一个从服务器,以便在主服务器不再正常工作时升级为主服务器。
一个低优先级的奴隶被认为更适合提升,所以举例来说,如果有三个优先级为10、100、25的奴隶,哨兵会选择优先级为10的奴隶,这是最低的。
但是特殊优先级为0表示slave无法执行master角色,因此Redis Sentinel永远不会选择优先级为0的slave进行升级。
min-slaves-to-write 3 min-slaves-max-lag 10
如果连接的从机少于3个,并且延迟小于或等于10秒,则主服务器可能停止接受写操作。
知识详解
延迟如何计算
根据从设备接收到的最后一次ping(通常每秒发送一次)来计算。
此选项不保证N(这里是3)个副本将接受写入,但会将在没有足够的从机可用的情况下丢失写入的暴露时间限制在指定的秒数内。
min-slaves-to-write设置为0表示禁用--主服务器可能停止接受写操作功能
SECURITY部分:安全
requirepass 12345
设置redis服务器的密码
LIMITS部分:限制
maxclients 10000
设置同时连接的客户端的最大数量
知识详解
默认情况下,此限制设置为10000个客户端,但是如果Redis服务器无法配置进程文件限制以允许指定的限制,则允许的最大客户端数将设置为当前文件限制减去32(因为Redis保留了一些文件描述符供内部使用)。 一旦达到限制,Redis将关闭所有新连接,并发送错误“max number of clients reached”。
persistence-available [(yes)|no]
设置redis是否需要持久化操作。如果redis只使用内存不需要持久化操作,那么AOF/RDB持久化机制就没用了。作为一种优化,在Windows版本的Redis中可以关闭所有持久性。这将把堆分配重定向到系统堆分配器,并禁用可能导致fork()操作的命令:BGSAVE和BGREWRITEAOF。这个标志不能与配置AOF和RDB操作的任何其他标志组合使用。
maxmemory <bytes>
设置redis的最大内存,单位为字节
知识详解
1.不要使用超过指定字节数的内存。
2.当达到内存限制时,Redis将根据所选的逐出策略删除keys(请参阅maxmemory策略)。
3.如果Redis无法根据策略删除keys,或者如果策略设置为“noeviction”,Redis将开始对使用更多内存的命令(如set、LPUSH等)进行错误应答,并继续回复GET等只读命令。
4.当将Redis用作LRU缓存或为实例设置硬内存限制(使用“noeviction”策略)时,此选项通常很有用。
5.警告:如果在maxmemory处于打开状态的实例上附加了从设备,则从已用内存计数中减去为从属设备提供数据所需的输出缓冲区的大小,这样网络问题/重新同步(resyncs)将不会触发key被删除的一个循环,反过来,slave的输出缓冲区充满了被逐出的del keys,从而触发了更多key的删除,以此类推,直到数据库被完全清空。
6.简而言之。如果您连接了从机,建议您为maxmemory设置一个下限,以便系统上有一些空闲的RAM用于从机输出缓冲区(但如果策略为“noeviction”,则不需要这样做)。
7.警告:未设置maxmemory将导致Redis在达到堆限制时终止,并出现内存不足异常。
8.注意:由于Redis使用系统分页文件来分配堆内存,所以Windows任务管理器或其他工具(如ProcessExplorer)显示的工作集内存使用情况并不总是准确的。例如,在后台保存RDB或AOF文件之后,工作集值可能会显著下降。为了检查redis服务器用于存储数据的正确内存量,请使用INFO client命令。INFO命令只显示用于存储redis数据的内存,而不是Windows进程为满足自身需求而使用的额外内存。INFO命令未报告的额外内存量可以通过减去Windows任务管理器报告的峰值工作集和INFO命令报告的已用内存峰值来计算。
maxmemory-policy noeviction
当内存达到maxmemory时,Redis将如何选择要删除的内容。 指定内存淘汰策略,策略有noevicition、allkeys-lru等6种策略
maxmemory-samples 3
LRU和minimal TTL算法不是精确算法,而是近似算法(为了节省内存),因此您也可以选择要检查的样本大小。例如,对于default Redis,将检查3个键并选择最近使用的一个键。
APPEND ONLY MODE部分:AOF持久化
appendonly no
是否启用AOF持久化,默认为no
appendfilename "appendonly.aof"
设置AOF持久化的文件名
appendfsync [everysec | always | no]
AOF持久化的同步方式
everysec:每秒执行一次同步,显示的将多个写命令同步到硬盘
always:每个redis写命令都要同步写入硬盘,会严重降低redis的速度
no:系统自动决定何时进行同步
no-appendfsync-on-rewrite no
如果应用系统无法忍受延迟,而可以容忍少量的数据丢失,则设置为yes。 如果应用系统无法忍受数据丢失,则设置为no。
auto-aof-rewrite-percentage 100
指定触发自动重写aof文件的条件
自动重写aof文件。 Redis能够在AOF日志大小按指定的百分比增长时自动重写日志文件,并隐式调用BGREWRITEAOF。
它是这样工作的:Redis在最近一次重写之后记住AOF文件的大小(如果重新启动后没有重写,则使用启动时AOF的大小)。 将此基本大小与当前大小进行比较。如果当前大小大于指定的百分比,并且当前文件大于 auto-aof-rewrite-min-size 指定的大小,则会触发重写。 需要配合auto-aof-rewrite-min-size 参数使用。
值为0时禁用自动AOF重写功能
auto-aof-rewrite-min-size 64mb
指定触发自动重写aof文件的条件
需要配合 auto-aof-rewrite-percentage 参数使用。共同决定触发aof文件重写的条件。 为要重写的AOF文件指定最小大小,这对于避免重写AOF文件非常有用,即使达到了百分比增加,但它仍然很小。
aof-load-truncated yes
设置aof文件末尾被截断时redis服务器是否能启动
知识详解
在Redis启动过程中,当AOF数据加载回内存时,可能会发现AOF文件在末尾被截断。 当运行Redis的系统时,可能会发生这种情况崩溃,尤其是在没有data=ordered选项的情况下装载ext4文件系统时(但是,当Redis自动崩溃或中止,但操作系统仍然正常工作时,这种情况就不会发生)。
Redis可以在出现错误时退出,也可以加载尽可能多的数据(现在是默认值),如果发现AOF文件在结尾处被截断,则可以启动。
以下选项控制此行为: 如果aof load truncated设置为yes,则加载一个截断的aof文件,Redis服务器开始发出一个日志来通知用户事件。 否则,如果该选项设置为 no,则服务器会因错误而中止并拒绝启动。 当该选项设置为no时,用户需要在重新启动服务器之前使用“redis check AOF”实用程序修复AOF文件。
请注意,如果发现AOF文件在中间被损坏,服务器仍将退出并返回一个错误。此选项仅适用于Redis将尝试从AOF文件读取更多数据,但找不到足够字节的情况。
LUA SCRIPTING部分
lua-time-limit 5000
Lua脚本的最长执行时间(毫秒)
知识详解
如果达到最大执行时间,Redis将记录在允许的最长时间之后脚本仍在执行中,并将开始以错误的方式答复查询。
当长时间运行的脚本超过最大执行时间时,只有SCRIPT KILL和SHUTDOWN NOSAVE命令可用。第一个命令可用于停止尚未调用write命令的脚本。第二种方法是在脚本已经发出write命令但用户不想等待脚本自然终止的情况下关闭服务器的唯一方法。
将其设置为0或负值,以无限制地执行而不发出警告
REDIS CLUSTER部分
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
cluster-slave-validity-factor 10
cluster-migration-barrier 1
cluster-require-full-coverage yes
SLOW LOG部分
slowlog-log-slower-than 10000
记录超过指定执行时间的命令,时间单位为微秒
知识详解
执行时间不包括与客户机对话、发送应答等I/O操作,而只是实际执行命令所需的时间(这是命令执行的唯一一个阶段,线程被阻塞,不能同时处理其他请求)。
slowlog-max-len 128
设置慢日志的最大长度
记录新命令时,最旧的命令将从记录的命令队列中删除
LATENCY MONITOR部分
latency-monitor-threshold 0
指定延时监视的时间阈值,默认值0表示禁用延迟监视。 单位为毫秒。
知识详解
Redis延迟监控子系统: 在运行时对不同的操作进行采样,以收集与Redis实例可能的延迟源相关的数据。
通过LATENCY命令,用户可以打印图形并获取报告。
系统只记录在大于或等于通过延迟监视器阈值配置指令指定的毫秒数的时间内执行的操作。当其值设置为零时,将关闭延迟监视器。
默认情况下,延迟监视是禁用的,因为如果没有延迟问题,则通常不需要延迟监视,并且收集数据会对性能产生影响,虽然影响很小,但可以在大负载下进行测量。
如果需要,可以使用命令“CONFIG SET latency-monitor-threshold <millises>”在运行时轻松启用延迟监视。
Event notification 部分
ADVANCED CONFIG部分
hash-max-ziplist-entries 512
当散列有少量的条目,并且最大的条目不超过给定的阈值时,使用内存高效的数据结构对散列进行编码。
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing 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
hz 10
aof-rewrite-incremental-fsync yes