本文来自Redis深度历险核心原理与应用实践-钱文品书籍
一、过期时间
1、Redis的所有的数据结构都是可以设置过期时间,时间一到,Redis会自动删除相应的对象,需要主要的是,过期是以对象为单位的,不如一个hash结构的过期是整个hash对象的过期,而不是其中的某个子key的过期。
2、如果一个字符串已经设置了过期时间,然后你调用set方法修改它,它的过期时间会小时的。Redis的字符串是动态字符串,是可以修改的字符串,字符串的最大长度是512MB。
以华为云的免费版Redis 5.0【宣传一哈】演示一下过期时间的设置.【设置过期时间是秒级】
二、扩容策略
字符串扩容机制介绍:
1、类似Java中的ArrayList和LinkedList的预分配冗余空间的方式减少内存的频繁分配。
2、内部实际分配的空间容量大于字符串的长度。
3、在字符串长度小于1M之前,扩容空间采用加倍策略,也就是保留100%的冗余空间。
4、当字符串长度超过1MB之后,为了避免加倍后的冗余空间过大而导致浪费,每次扩容只会多分配1MB大小的冗余空间。
三、内存回收策略
1、Redis并不总是将空闲内存立即归还给操作系统。
2、如果当前Redis内存有10GB,当你删除1GB的key后,再去观察内存,你会发现内存变化不会太大。原因是操作系统系统是页为单位回收内存的,这个页上只要还有一个key在使用,那么他就不会被回收。Redis虽然删除了1GB的key,但是这些key分散到不同页面了,每个页面都还有其他的key存在,这就导致了内存不会被立即回收。flushdb后然后再观察内存,会发现内存确实被回收了,原因是所有的key到被干掉了,页面都被清理干净了,当然就会被操作系统立即回收了。
3、Redis虽然无法保证立即回收已经删除的key的内存,但是它会重新使用那些尚未被回收的空闲内存。
四、内存分配算法
1、Redis为了保持自身结构的简单性,在内存分配方面直接交给第三方内存分配库区实现,目前Redis使用jemalloc库来管理内存的。
info memory
mem_allocator:jemalloc-5.1.0
附【List列表右边进右边出-栈】
【右边进、左边出-队列】
五、慢查询日志
1、默认的慢查询的时间值是10000us,就是10ms秒
config get slowlog-log-slower-than
2、默认存储128条
config get slowlog-max-len
3、查看慢查询日志
slowlog get
[3]获得慢查询日志格式
1) 1) (integer) 5 # 日志的唯一标识符
# 命令执行时的Unix时间戳
3) (integer) 6 # 命令执行的时长,单位微妙
4) 1) "set" # 命令
2) "score" # 命令参数
3) "1" # 命令值
5) "127.0.0.1:55186"
它决定 slow log 最多能保存多少条日志, slow log 本身是一个 FIFO 队列,当队列大小超过 slowlog-max-len 时,最旧的一条日志将被删除,而最新的一条日志加入到 slow log ,是保留在内存中的,仅仅记录命令的执行耗时,如客户端的发送回复、耗时是不记录在内的.
4、SLOWLOG RESET【清空日志】
5、获取慢查询队列的当前长度 slowlog len
附:限制最大使用内存以及相应的实际内存超过maxmemory时,Redis的几种可选的淘汰策略
maxmemory:134217728 maxmemory_human:128.00M maxmemory_policy:volatile-lru
尝试淘汰设置了过期时间的key,最少使用的key优先1被淘汰,没有设置过期时间的key不会被淘汰,这样可以保证需要持久化的数据不会突然丢失.
allkeys-xxx策略:会对所有的key进行淘汰.
volatile-xxx策略:只会针对带过期时间的key进行淘汰.线上Redis是提供缓存功能还是持久环功能选择,视情况而定.
附:Redis的常用配置参数,以华为云Redis的建议值参考如下
hash-max-ziplist-entries 512 1~10,000 512
hash-max-ziplist-value 64 1~10,000 64
latency-monitor-threshold 0 0~86,400,000 0
lua-time-limit 5,000 100~5,000 5,000
master-read-only no yes,no no
maxclients 10,000 1,000~50,000 10,000
maxmemory-policy volatile-lru volatile-lru,allkeys-lru,volatile-lfu,allkeys-lfu,volatile-random,allkeys-random,volatile-ttl,noeviction volatile-lru
notify-keyspace-events Ex 请参考该参数的描述。 Ex
proto-max-bulk-len 536,870,912 1,048,576~536,870,912 536,870,912
set-max-intset-entries 512 1~10,000 512
slowlog-log-slower-than 10,000 0~1,000,000 10,000
slowlog-max-len 128 0~1,000 128
timeout 0 0~7,200 0
zset-max-ziplist-entries 128 1~10,000 128
zset-max-ziplist-value 64 1~10,000