关于java:Redis内存满了会怎么样

30次阅读

共计 1405 个字符,预计需要花费 4 分钟才能阅读完成。

Redis 占用内存大小

1、通过配置文件配置

通过在 Redis 装置目录上面的 redis.conf 配置文件中增加以下配置设置内存大小

// 设置 Redis 最大占用内存大小为 100M
maxmemory 100mb

redis 的配置文件不肯定应用的是装置目录上面的 redis.conf 文件,启动 redis 服务的时候是能够传一个参数指定 redis 的配置文件的

2、通过命令批改

Redis 反对运行时通过命令动静批改内存大小

// 设置 Redis 最大占用内存大小为 100M
127.0.0.1:6379> config set maxmemory 100mb
// 获取设置的 Redis 能应用的最大内存大小
127.0.0.1:6379> config get maxmemory

Redis 的内存淘汰

既然能够设置 Redis 最大占用内存大小,那么配置的内存就有用完的时候。那在内存用完的时候,还持续往 Redis 外面增加数据不就没内存可用了吗?

实际上 Redis 定义了几种策略用来解决这种状况:

  • noeviction(默认策略):对于写申请不再提供服务,间接返回谬误(DEL 申请和局部非凡申请除外)
  • allkeys-lru:从所有 key 中应用 LRU 算法进行淘汰
  • volatile-lru:从设置了过期工夫的 key 中应用 LRU 算法进行淘汰
  • allkeys-random:从所有 key 中随机淘汰数据
  • volatile-random:从设置了过期工夫的 key 中随机淘汰
  • volatile-ttl:在设置了过期工夫的 key 中,依据 key 的过期工夫进行淘汰,越早过期的越优先被淘汰

当应用 volatile-lru、volatile-random、volatile-ttl 这三种策略时,如果没有 key 能够被淘汰,则和 noeviction 一样返回谬误

如何获取及设置内存淘汰策略

获取以后内存淘汰策略:

127.0.0.1:6379> config get maxmemory-policy

通过配置文件设置淘汰策略(批改 redis.conf 文件):

maxmemory-policy allkeys-lru

通过命令批改淘汰策略:

127.0.0.1:6379> config set maxmemory-policy allkeys-lru

LRU 在 Redis 中的实现

近似 LRU 算法

Redis 应用的是近似 LRU 算法,它跟惯例的 LRU 算法还不太一样。近似 LRU 算法通过随机采样法淘汰数据,每次随机出 5(默认)个 key,从外面淘汰掉最近起码应用的 key。

能够通过 maxmemory-samples 参数批改采样数量:

例:maxmemory-samples 10

maxmenory-samples 配置的越大,淘汰的后果越靠近于严格的 LRU 算法

Redis 为了实现近似 LRU 算法,给每个 key 减少了一个额定减少了一个 24bit 的字段,用来存储该 key 最初一次被拜访的工夫。

Redis3.0 对近似 LRU 的优化

Redis3.0 对近似 LRU 算法进行了一些优化。新算法会保护一个候选池(大小为 16),池中的数据依据拜访工夫进行排序,第一次随机选取的 key 都会放入池中,随后每次随机选取的 key 只有在拜访工夫小于池中最小的工夫才会放入池中,直到候选池被放满。当放满后,如果有新的 key 须要放入,则将池中最初拜访工夫最大(最近被拜访)的移除。

当须要淘汰的时候,则间接从池中选取最近拜访工夫最小(最久没被拜访)的 key 淘汰掉就行。

本文由猿必过 YBG 公布

正文完
 0