redis缓存固然高效,可是它会占用我们系统中宝贵的内存资源,特别是当我们的项目运行了一段时间后,我们需要看一下redis占用了多少内存,那么可以用“info”命令查看。
直接使用info命令会显示Redis所有的信息,我们只查看memory这一栏,所以可这样执行命令:
info memory
used_memory:855344 //数据占用了多少内存(字节)
used_memory_human:835.30K //数据占用了多少内存(带单位的,可读性好)
used_memory_rss:5992448 //redis占用了多少内存
used_memory_peak:856576 //占用内存的峰值(字节)
used_memory_peak_human:836.50K //占用内存的峰值(带单位的,可读性好)
used_memory_lua:37888 //lua引擎所占用的内存大小(字节)
mem_fragmentation_ratio:7.36 //内存碎片率
mem_allocator:jemalloc-5.1.0 //redis内存分配器版本,在编译时指定的。有libc、jemalloc、tcmalloc这3种。
maxmemory:1073741824 //最大占用内存。
如果一个项目的数据量比较大,就要经常用info来看内存的使用量,这样才能让项目更稳定。
Redis一般默认是不限制最大占用内存的,也就是(maxmemory参数),为了不让Redis把服务器内存全部占用,我们需要给它设置一个合理的值。
设置的方法,修改配置文件maxmemory参数:
然后重启Redis。
提示:
不重启Redis修改配置参数的方法可直接在客户端命令行使用config命令。
config set 参数名 参数值 config get 参数名
如果不设置maxmemory或者设置为0,64位系统是不限制内存的,32位系统最多使用3GB内存。
一般推荐Redis设置最大内存为物理内存的一半,例如服务器的物理内存是4G,Redis最大内存可设置为2G。
既然提供了最大内存限制, 那么当我们程序达到最大值时, Redis使用了多种策略进行置换。如果设置了maxmemory,一般都要设置过期策略。
设置的方法,修改配置文件maxmemory-policy参数:
Redis有六种过期策略:
volatile-lru -> 使用LRU算法删除一个键(只对设置了生存时间的键)
allkeys-lru -> 使用LRU算法删除一个键
volatile-random -> 随机删除一个键(只对设置了生存时间的键)
allkeys-random -> 随机删除一个键
volatile-ttl -> 删除生存时间最近的一个键
noeviction -> 不删除,直接在写操作时返回错误(默认值)。
LRU算法,least Recently Used,最近最少使用算法。也就是说默认删除最近最少使用的KEY。
注意一点!redis并不会准确地删除所有键中最近最少使用的键,而是随机抽取n个键,删除这n个键中最近最少使用的键。这个n也是可以设置的,对应位置是配置文件中的maxmeory-samples。
LFU算法,是新加的淘汰算法。
volatile-random和allkeys-random策略, Redis直接在相应的数据集上随机并置换.
volatile-ttl需要抽样, 抽样的大小由maxmemory-samples控制, 默认maxmemory-samples为5, 抽样越大算法精确度越高,但是消耗也越大.
volatile-lru和allkeys-lru是对抽样的数据中选出最近最久未使用的Key置换出去.这里抽样的大小默认是16, 如果我们设置maxmemory-samples并且大于16的话, 抽样值和最大的保持一致.Redis设置了一个可置换池, 大小为16, 每次先进行抽样, 抽样之后与置换池中的数据进行比较, 选出最近最久未使用的16个Key放入置换池中, 从置换池中再选择一个Key进行置换。
扩展阅读《redis为什么内存不宜过大》