Java实现redis缓存效果变量过期

简介: Java实现redis缓存效果变量过期

1 实现

redis中的Expire命令用于设置 key 的过期时间,key 过期后将不再可用。不过有些变量我们不需要设置到redis中,只要存到本地就可以了,也需要过期时间,也可以同样方法定义一个全局变量的map之后键是变量,值是时间每次都进行比较。

public class ExpireModel<T> {
  /**
   * 值
   * 
   */
  private T value;
  /**
   * 值设置时间(时间戳,毫秒)
   * 
   * @author ybwei
   */
  private Long setTime;
  /**
   * 过期时长(毫秒)
   */
  private Long expireTime;
  /**
   * @param value
   * @param expireTime
   */
  public ExpireModel(T value, Long expireTime) {
    super();
    this.value = value;
    this.expireTime = expireTime;
    this.setTime = System.currentTimeMillis();
  }
  /**
   * @Description:
   * @return
   */
  public T getValue() {
    T result = null;
    if (System.currentTimeMillis() - this.setTime <= this.expireTime) {
      result = this.value;
    }
    return result;
  }
}

2 测试

/**
 * @throws InterruptedException
 * @Description:
 */
@Test
public void testExpire() throws InterruptedException {
  // 失效时间1秒
  ExpireModel<String> em = new ExpireModel<>("aa", 1000L);
  log.info("value:{}", em.getValue());
  // 休眠时间2秒
  TimeUnit.SECONDS.sleep(2);
  log.info("value:{}", em.getValue());
}

结果展示:

[INFO ] 2022-08-27 11:32:46.680 [main] com.spring.pro.test.model.ExpireTest - value:aa
[INFO ] 2022-08-27 11:32:48.692 [main] com.spring.pro.test.model.ExpireTest - value:null

3 接口

import javax.annotation.PostConstruct;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.spring.pro.model.ExpireModel;
@RestController
public class IndexController {
  private ExpireModel<String> em = null;
  /**
   * 失效时间(2秒)
   * 
   */
  private Long expireTime = 10 * 1000L;
  private int index = 0;
  /**
   * @Description:
   * @Author: ybwei
   * @Date: 2019年12月25日 上午11:14:58
   */
  @PostConstruct
  public void init() {
    em = new ExpireModel<String>("aa", expireTime);
  }
  /**
   * @Description:
   * @return
   */
  @GetMapping("/getValue")
  public String getValue() {
    String value = em.getValue();
    if (value == null) {
      value="bb" + index;
      em = new ExpireModel<String>(value, expireTime);
      index++;
    }
    return value;
  }
  }

4 使用HashMap方法实现

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class CacheService {
    private Map<String, Map<String, Object>> map = new HashMap<String, Map<String, Object>>();
    /**
     * 设置变量值
     * @param key
     * @param ex  保存的时间毫秒
     * @param value  变量值
     */
    public void setex(String key, Long ex, String value){
        Map<String, Object> m = new HashMap<String,Object>();
        m.put("ex", ex); //剩余的时间毫秒
        m.put("extime", new Date().getTime() + ex); //具体过期的时间戳毫秒
        m.put("value", value);
        map.put(key, m);
    }
    public String get(String key){
        expor(key);
        if(map.containsKey(key)){
            Map<String, Object> obj = map.get(key);
            return String.valueOf(obj.get("value"));
        }
        return null;
    }
    /**
     * 计算剩余时间
     * @param key
     */
    private void expor(String key){
        if(map.containsKey(key)){
            Map<String, Object> obj = map.get(key);
            Long ex = (Long) obj.get("ex");
            Long extime = (Long) obj.get("extime");
            if(extime < new Date().getTime()){
                map.remove(key);
            }else{
                obj.put("ex", extime - new Date().getTime());
                map.put(key, obj);
            }
        }
    }
    /**
     * 获取变量剩余时间
     * @param key
     * @return
     */
    public Long ttl(String key){
        expor(key);
        if(map.containsKey(key)){
            return (Long) map.get(key).get("ex");
        }
        return null;
    }
}


目录
相关文章
|
存储 Java
# 【Java全栈学习笔记-U1-day02】变量+数据类型+运算符
本篇笔记主要围绕Java全栈学习的第二天内容展开,涵盖了变量、数据类型、运算符以及Scanner类的应用。首先介绍了变量的概念与命名规范,以及如何定义和使用变量;接着详细讲解了Java中的基本数据类型,包括整型、浮点型、字符型、布尔型等,并通过实例演示了数据类型的运用。随后,深入探讨了各类运算符(赋值、算术、关系、逻辑)及其优先级,帮助理解表达式的构成。最后,介绍了如何利用Scanner类实现用户输入功能,并通过多个综合示例(如计算圆面积、购物打折、变量交换及银行利息计算)巩固所学知识。完成相关作业将进一步加深对这些基础概念的理解与实践能力。
282 13
|
9月前
|
存储 SQL NoSQL
Redis-常用语法以及java互联实践案例
本文详细介绍了Redis的数据结构、常用命令及其Java客户端的使用,涵盖String、Hash、List、Set、SortedSet等数据类型及操作,同时提供了Jedis和Spring Boot Data Redis的实战示例,帮助开发者快速掌握Redis在实际项目中的应用。
679 1
Redis-常用语法以及java互联实践案例
|
NoSQL Java API
在Java环境下如何进行Redis数据库的操作
总的来说,使用Jedis在Java环境下进行Redis数据库的操作,是一种简单而高效的方法。只需要几行代码,就可以实现复杂的数据操作。同时,Jedis的API设计得非常直观,即使是初学者,也可以快速上手。
471 94
|
12月前
|
缓存 监控 NoSQL
Redis 实操要点:Java 最新技术栈的实战解析
本文介绍了基于Spring Boot 3、Redis 7和Lettuce客户端的Redis高级应用实践。内容包括:1)现代Java项目集成Redis的配置方法;2)使用Redisson实现分布式可重入锁与公平锁;3)缓存模式解决方案,包括布隆过滤器防穿透和随机过期时间防雪崩;4)Redis数据结构的高级应用,如HyperLogLog统计UV和GeoHash处理地理位置。文章提供了详细的代码示例,涵盖Redis在分布式系统中的核心应用场景,特别适合需要处理高并发、分布式锁等问题的开发场景。
622 42
|
12月前
|
缓存 NoSQL Java
Java Redis 面试题集锦 常见高频面试题目及解析
本文总结了Redis在Java中的核心面试题,包括数据类型操作、单线程高性能原理、键过期策略及分布式锁实现等关键内容。通过Jedis代码示例展示了String、List等数据类型的操作方法,讲解了惰性删除和定期删除相结合的过期策略,并提供了Spring Boot配置Redis过期时间的方案。文章还探讨了缓存穿透、雪崩等问题解决方案,以及基于Redis的分布式锁实现,帮助开发者全面掌握Redis在Java应用中的实践要点。
622 6
|
Linux 网络安全 Docker
尼恩一键开发环境: vagrant+java+springcloud+redis+zookeeper镜像下载(&制作详解)
尼恩提供了一系列文章,旨在帮助开发者轻松搭建一键开发环境,涵盖Java分布式、高并发场景下的多种技术组件安装与配置。内容包括但不限于Windows和CentOS虚拟机的安装与排坑指南、MySQL、Kafka、Redis、Zookeeper等关键组件在Linux环境下的部署教程,并附带详细的视频指导。此外,还特别介绍了Vagrant这一虚拟环境部署工具,
尼恩一键开发环境: vagrant+java+springcloud+redis+zookeeper镜像下载(&制作详解)
|
存储 传感器 缓存
java变量与数据类型:整型、浮点型与字符类型
### Java数据类型全景表简介 本文详细介绍了Java的基本数据类型和引用数据类型,涵盖每种类型的存储空间、默认值、取值范围及使用场景。特别强调了`byte`、`int`、`long`、`float`、`double`等基本类型在不同应用场景中的选择与优化,如文件流处理、金融计算等。引用数据类型部分则解析了`String`、数组、类对象、接口和枚举的内存分配机制。
551 15
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
8月前
|
缓存 负载均衡 监控
135_负载均衡:Redis缓存 - 提高缓存命中率的配置与最佳实践
在现代大型语言模型(LLM)部署架构中,缓存系统扮演着至关重要的角色。随着LLM应用规模的不断扩大和用户需求的持续增长,如何构建高效、可靠的缓存架构成为系统性能优化的核心挑战。Redis作为业界领先的内存数据库,因其高性能、丰富的数据结构和灵活的配置选项,已成为LLM部署中首选的缓存解决方案。
807 25
|
缓存 NoSQL Java
Redis+Caffeine构建高性能二级缓存
大家好,我是摘星。今天为大家带来的是Redis+Caffeine构建高性能二级缓存,废话不多说直接开始~
1597 0

相关产品

  • 云数据库 Tair(兼容 Redis)