- 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-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算法
什么是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开源社区,或者访问: