PHP开发:Redis 内存满了怎么办?

  • Redis占用内存大小
  • Redis的内存淘汰
  • LRU算法
  • LRU在Redis中的实现
  • LFU算法
  • 问题

Redis占用内存大小

咱们知道Redis是基于内存的key-value数据库,由于系统的内存大小有限,因此咱们在使用Redis的时候能够配置Redis能使用的最大的内存大小。php

一、经过配置文件配置

经过在Redis安装目录下面的redis.conf配置文件中添加如下配置设置内存大小面试

//设置Redis最大占用内存大小为100M
maxmemory 100mb
redis的配置文件不必定使用的是安装目录下面的redis.conf文件,启动redis服务的时候是能够传一个参数指定redis的配置文件的

二、经过命令修改

Redis支持运行时经过命令动态修改内存大小redis

//设置Redis最大占用内存大小为100M
127.0.0.1:6379> config set maxmemory 100mb
//获取设置的Redis能使用的最大内存大小
127.0.0.1:6379> config get maxmemory
若是不设置最大内存大小或者设置最大内存大小为0,在64位操做系统下不限制内存大小,在32位操做系统下最多使用3GB内存

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-lruvolatile-randomvolatile-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算法

什么是LRU?

上面说到了Redis可以使用最大内存使用完了,是可使用LRU算法进行内存淘汰的,那么什么是LRU算法呢?并发

LRU(Least Recently Used),即最近最少使用,是一种缓存置换算法。在使用内存做为缓存的时候,缓存的大小通常是固定的。当缓存被占满,这个时候继续往缓存里面添加数据,就须要淘汰一部分老的数据,释放内存空间用来存储新的数据。这个时候就可使用LRU算法了。其核心思想是:若是一个数据在最近一段时间没有被用到,那么未来被使用到的可能性也很小,因此就能够被淘汰掉。

 

LRU在Redis中的实现

近似LRU算法

Redis使用的是近似LRU算法,它跟常规的LRU算法还不太同样。近似LRU算法经过随机采样法淘汰数据,每次随机出5(默认)个key,从里面淘汰掉最近最少使用的key。框架

能够经过maxmemory-samples参数修改采样数量:例:maxmemory-samples 10 maxmenory-samples配置的越大,淘汰的结果越接近于严格的LRU算法

Redis为了实现近似LRU算法,给每一个key增长了一个额外增长了一个24bit的字段,用来存储该key最后一次被访问的时间。dom

 

以上内容但愿帮助到你们,更多PHP大厂PDF面试文档,PHP进阶架构视频资料,PHP精彩好文免费获取能够关注公众号:PHP开源社区,或者访问:

2021金三银四大厂面试真题集锦,必看!

四年精华PHP技术文章整理合集——PHP框架篇

四年精华PHP技术文合集——微服务架构篇

四年精华PHP技术文合集——分布式架构篇

四年精华PHP技术文合集——高并发场景篇

四年精华PHP技术文章整理合集——数据库篇

相关文章
相关标签/搜索