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

Posted 赵广陆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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实现redis缓存效果变量过期的主要内容,如果未能解决你的问题,请参考以下文章

redis 读写缓存命令笔记

java操作Redis缓存设置过期时间

java 从零开始手写 redisLRU 缓存淘汰策略详解

redis设置过期时间等

Redis缓存何以一枝独秀? —— 聊聊Redis的数据过期数据淘汰以及数据持久化的实现机制

谈谈Redis的SETNX