redis过期策略

在使用redis做缓存的时候,我们常常会设置过期时间。那么redis是如何清理这些过期的数据呢?

答案是: 定期删除 + 惰性删除

  • 定期删除: redis每100ms就会随机抽查删除过期的数据。但是这种方法有时候会留下大量过期但没有被抽查到的过期数据,白白浪费内存。
  • 惰性删除: 惰性删除此时就派上用场了,当用户获取数据时,redis会先检查该数据有没有过期,如果过期就删除。

听上去定期删除+惰性删除好像很完美的样子,but过期的数据用户又没有及时访问,那么内存中还是会存在大量的过期数据。此时应该采用redis内存淘汰机制。

redis内存淘汰机制

  • noeviction:内存不足以写入新数据的时候会直接报错。
  • allKeys-lru:内存不足以写入新数据时候,移除最近最少使用的key。
  • allKeys-random: 内存不足以写入新数据时,随机移除key。
  • volatile-lru: 内存不足以写入新数据时,在设置了过期时间的key当中移除最近最少使用的key。
  • volatile-random: 内存不足以写入新数据时,在设置了过期时间的key中,随即移除key。
  • volatile-ttl: 内存不足以写入新数据时,在设置了过期时间的key当中移除最先过期的key。

上面六种你可以这么记:

  • 不移除直接报错: noeviction。
  • 在所有key中移除: 1.allKeys-lru 2. allKeys-random
  • 在设置了过期时间的key中移除: 1. volatile-lru 2. volatile-random 3.volatile-ttl

一般常用allKeys-lru

实现一个简单的lru(最近最少使用算法)

package com.amber;

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map; public class LRULinkedHashMap<K, V> extends LinkedHashMap<K, V> {
//最大容量
private final int maxCapacity ;
// 默认增长因子
private static final float DEFAULT_LOAD_FACTOR = 0.75f; public LRULinkedHashMap(int maxCapacity) {
super(maxCapacity, DEFAULT_LOAD_FACTOR, true);
this.maxCapacity = maxCapacity;
} @Override
protected boolean removeEldestEntry(Map.Entry<K, V> entry) {
if(size()>maxCapacity)
return true;
else
return false;
} public static void main(String[] args) {
LRULinkedHashMap<String, String> lruLinkedHashMap = new LRULinkedHashMap(5);
lruLinkedHashMap.put("1", "1");
lruLinkedHashMap.put("2", "2");
lruLinkedHashMap.put("3", "3");
lruLinkedHashMap.put("4", "4");
lruLinkedHashMap.put("5", "5");
Iterator<Map.Entry<String, String>> iterator = lruLinkedHashMap.entrySet().iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
lruLinkedHashMap.get("1");
System.out.println("超出最大容量");
lruLinkedHashMap.put("6", "6");
iterator = lruLinkedHashMap.entrySet().iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
} }
}

结果

1=1
2=2
3=3
4=4
5=5
超出最大容量
3=3
4=4
5=5
1=1
6=6 Process finished with exit code 0

根据上述结果可以看到,当超出最大容量时移除的是第二个结点,而不是第一个结点,因此一个简单的lru算法就实现了

super(maxCapacity, DEFAULT_LOAD_FACTOR, true);

调用的是父类的

    public LinkedHashMap(int var1, float var2, boolean var3) {
super(var1, var2);
this.accessOrder = var3;
}

accessOrder为true表示会把最新访问的数据放到最后一个节点,默认false

【redis】redis的过期策略的更多相关文章

  1. redis系列之------过期策略

    前言 我们都知道redis是常驻在内存当中的,因此他的效率比MySQL要快很多很多.但又引发了另外一个问题,内存从本质上讲,它是昂贵的,不能用于大量的长时间的存储,他是“不安全不稳定的“,并且有可能存 ...

  2. Redis 内存溢出过期策略

    1: 设置内存最大值, 如果该主机只作为 redis 服务器, 无其它比较占用资源的服务, 建议设置为内存的 3/4 大小, 单位 B 2: 设置内存溢出解决策略, 推荐 1-5 任选一种, 不推荐 ...

  3. Redis过期策略

    一.设置过期时间 expire key time(以秒为单位) -- 这是最常用的方式 setex(String key, int seconds, String value) -- 字符串独有的方式 ...

  4. Redis数据过期策略详解

    http://www.cnblogs.com/xuliangxing/p/7151812.html 本文对Redis的过期机制简单的讲解一下 讲解之前我们先抛出一个问题,我们知道很多时候服务器经常会用 ...

  5. Redis的过期策略和内存淘汰策略(转)

    Redis的过期策略 我们都知道,Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间.Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理. ...

  6. Redis学习笔记--Redis数据过期策略详解

    本文对Redis的过期机制简单的讲解一下 讲解之前我们先抛出一个问题,我们知道很多时候服务器经常会用到redis作为缓存,有很多数据都是临时缓存一下,可能用过之后很久都不会再用到了(比如暂存sessi ...

  7. Redis学习笔记--Redis数据过期策略详解==转

    本文对Redis的过期机制简单的讲解一下 讲解之前我们先抛出一个问题,我们知道很多时候服务器经常会用到redis作为缓存,有很多数据都是临时缓存一下,可能用过之后很久都不会再用到了(比如暂存sessi ...

  8. 了解Redis过期策略及实现原理

    我们在使用redis时,一般会设置一个过期时间,当然也有不设置过期时间的,也就是永久不过期. 当我们设置了过期时间,redis是如何判断是否过期,以及根据什么策略来进行删除的. redis设置过期时间 ...

  9. Redis过期策略(转)

    1.设置过期时间 expire key time(以秒为单位)--这是最常用的方式 setex(String key, int seconds, String value)--字符串独有的方式 具体的 ...

  10. 第九章 Redis过期策略

    注:本文主要参考自<Redis设计与实现> 1.设置过期时间 expire key time(以秒为单位)--这是最常用的方式 setex(String key, int seconds, ...

随机推荐

  1. scrapy框架来爬取壁纸网站并将图片下载到本地文件中

    首先需要确定要爬取的内容,所以第一步就应该是要确定要爬的字段: 首先去items中确定要爬的内容 class MeizhuoItem(scrapy.Item): # define the fields ...

  2. Xampp error:Port 80 in use by "Unable to open process" with PID 4

    今天打开Apache的时候报错: Port 80 in use by "Unable to open process" with PID 4 通过点击与“Apache”模块同一行上 ...

  3. 如何把安全证书导入到java中的cacerts证书库

    每一步:进入某个https://www.xxx.com开头的网站,把要导入的证书下载, 在该网页上右键 >> 属性 >> 点击"证书" >> 再 ...

  4. maven war包打包去除jar包瘦身

    1.pom文件配置 <!-- war包 --> <plugin> <groupId>org.apache.maven.plugins</groupId> ...

  5. 利用Python与selenium自动化模拟登陆12306官网!

    近年来,12306的反爬越来越来严重,从一年前的 获取tk参数后到现在增加了 JS.CSS等加密方式! 目前大部分人利用的登陆方式都是利用selenium ,此文也不例外. 环境:        Wi ...

  6. IDEA 导入 Maven 项目后报错 cannot resolve symbol 解决办法

    这两天整理项目,导入新的 Maven 项目时出现 cannot resolve symbol ,即使 rebuild 也没有用.解决办法如下: 1. File -> Close Project: ...

  7. 记一次arch滚挂后,更换lts内核

    背景 因为arch的滚动升级模式,每天pacman -Syu已经是一种习惯了(虽然我是使用yay的),升级过程中会连内核一起升级,但不会立刻生效,通常要等到下次重启时才会生效. 因为此前使用的是有一点 ...

  8. IDEA 学习笔记之 Java项目开发深入学习(1)

    Java项目开发深入学习(1): 定义编译输出路径: 继承以上工程配置 重新定义新的项目编译路径 添加source目录:点击添加,再点击移除: 编译项目: 常用快捷键总结: Ctrl+Space 代码 ...

  9. Eclipse导入别人项目爆红叉

    1.导入项目之前,请确认工作空间编码已设置为utf-8:window->Preferences->General->Wrokspace->Text file encoding- ...

  10. java架构之路-(分布式zookeeper)zookeeper真实使用场景

    上几次博客,我说了一下Zookeeper的简单使用和API的使用,我们接下来看一下他的真实场景. 一.分布式集群管理✨✨✨ 我们现在有这样一个需求,请先抛开Zookeeper是集群还是单机的概念,下面 ...