自定义缓存实现Session

缓存接口 :

package com.example.demo.learn.servlet.session.cache;

/**
 * 缓存接口
 */
public interface CacheManageService {

    void put(String key, Object value, Long timeout);

    void put(String key, Object value);

    void remove(String key);

    Object get(String key);

    int size();

    boolean containsKey(String key);

    boolean isEmpty();

    /**
     * 定时检查,删除过期的值
     */
    void checkValidityData();

}

缓存实现类:

package com.example.demo.learn.servlet.session.cache;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Service
public class CacheManageServiceImpl implements CacheManageService {

    private Logger logger = LoggerFactory.getLogger(CacheManageServiceImpl.class);

    private Map<String, CacheEntity> cacheMap = new ConcurrentHashMap<>();

    /**
     * 缓存存放值
     *
     * @param key     键
     * @param value   值
     * @param timeout 超时时间
     */
    public void put(String key, Object value, Long timeout) {
        CacheEntity cacheEntity = new CacheEntity();
        cacheEntity.setKey(key);
        cacheEntity.setValue(value);
        if (timeout != null) {
            // 保存的是有效期的整个毫秒数
            cacheEntity.setTimeout(System.currentTimeMillis() + timeout);
            if (logger.isInfoEnabled()) {
                logger.info("设置缓存key:{}, timeout:{}", key, timeout);
            }
        }
        cacheMap.put(key, cacheEntity);
    }

    /**
     * 缓存存放值, 没有过期时间
     *
     * @param key   键
     * @param value 值
     */
    public void put(String key, Object value) {
        put(key, value, null);
    }

    /**
     * 删除缓存键
     *
     * @param key 键
     */
    @Override
    public void remove(String key) {
        cacheMap.remove(key);
    }

    /**
     * 获得缓存中的值
     *
     * @param key 键
     * @return 值
     */
    @Override
    public synchronized Object get(String key) {
        CacheEntity cacheEntity = cacheMap.get(key);
        if (cacheEntity != null) {
            return cacheEntity.getValue();
        }
        return null;
    }

    /**
     * 缓存的大小
     *
     * @return size
     */
    @Override
    public int size() {
        return cacheMap.size();
    }

    /**
     * 是否包含某个键
     *
     * @param key 键
     * @return 是否包含
     */
    @Override
    public boolean containsKey(String key) {
        return cacheMap.containsKey(key);
    }

    /**
     * 是否为空
     *
     * @return 缓存map是否为空
     */
    @Override
    public boolean isEmpty() {
        return cacheMap.isEmpty();
    }

    /**
     * 定时检查,删除过期的值
     */
    @Override
    public void checkValidityData() {
        for (Map.Entry<String, CacheEntity> entry : cacheMap.entrySet()) {
            String key = entry.getKey();
            CacheEntity cacheEntity = entry.getValue();
            // 之前存放的毫秒数
            long timeout = cacheEntity.getTimeout();
            // 当前毫秒数
            long currentTime = System.currentTimeMillis();
            if (currentTime - timeout > 0) {
                // 已过期,删除
                cacheMap.remove(key);
                if (logger.isInfoEnabled()) {
                    logger.info("缓存过期key:{}, 删除该键", key);
                }
            }
        }
    }
}

缓存实体类: 

package com.example.demo.learn.servlet.session.cache;

/**
 *
 * 自定义缓存实体类
 *
 * 自定义session:
 *  首先是用Map集合装数据, 唯一不重复的字符串作为key,简称sessionId
 *
 *  session有效期,如何去清除操作?
 *     线程池, 定时的线程池
 */
public class CacheEntity {

    // 键
    private String key;
    // 值
    private Object value;
    // 有效期
    private long timeout;

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public Object getValue() {
        return value;
    }

    public void setValue(Object value) {
        this.value = value;
    }

    public long getTimeout() {
        return timeout;
    }

    public void setTimeout(long timeout) {
        this.timeout = timeout;
    }

    @Override
    public String toString() {
        return "CacheEntity{" +
                "key='" + key + '\'' +
                ", value=" + value +
                ", timeout=" + timeout +
                '}';
    }
}

测试类:

package com.example.demo.learn.servlet.session.cache;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;


/**
 * 测试缓存框架
 */
public class Test {

    private static CacheManageService cacheManageService = new CacheManageServiceImpl();

    public static void main(String[] args) throws InterruptedException {
        // 主线程 放入过期键
        cacheManageService.put("name", "song", 5000L);
        System.out.println("过期键保存成功......");

        // 开启一个线程检查有效期
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
        scheduledThreadPool.schedule(new Runnable() {
            @Override
            public void run() {
                cacheManageService.checkValidityData();
            }
        }, 5000, TimeUnit.MILLISECONDS);

        // 等待5秒
        Thread.sleep(5000);
        System.out.println(cacheManageService.get("name"));
    }
}

自定义实现session:

package com.example.demo.learn.servlet.session.utils;

import com.example.demo.learn.servlet.session.cache.CacheManageService;
import com.example.demo.learn.servlet.session.cache.CacheManageServiceImpl;

public class SessionUtils {

    private static CacheManageService cacheManageService = new CacheManageServiceImpl();

    /**
     * 获取值
     *
     * @param name 键
     * @return 值
     */
    public static Object getAttribute(String name) {
        return cacheManageService.get(name);
    }

    /**
     * 保存数据键后,生成一个sessionId
     *
     * @param name  键
     * @param value 值
     */
    public static String setAttribute(String name, Object value) {
        // 生成一个sessionId
        String sessionId = TokenUtils.getToken();
        cacheManageService.put(sessionId, value);
        return sessionId;
    }

    public static void main(String[] args) {
        String sessionId = setAttribute("age", 20);
        System.out.println("生成sessionId: " + sessionId);
        System.out.println(getAttribute(sessionId));
    }
}

 随机生成字符串:

package com.example.demo.learn.servlet.session.utils;

import java.util.UUID;

public class TokenUtils {

    public static String getToken() {
        return UUID.randomUUID().toString().replaceAll("-","");
    }

    public static void main(String[] args) {
        System.out.println(getToken());
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值