面试官:你是如何使用JDK来实现自己的缓存(支持高并发)?

本文介绍了在不引入外部框架的情况下,如何利用HashMap和定时器线程池手动创建一个支持高并发的缓存工具类。通过提供put、get、remove等同步方法,结合生命周期定时器实现数据过期自动失效功能。并发测试结果显示,该实现能够满足每秒40万读写并发的需求。
摘要由CSDN通过智能技术生成

需求分析

项目中经常会遇到这种场景:一份数据需要在多处共享,有些数据还有时效性,过期自动失效。比如手机验证码,发送之后需要缓存起来,然后处于安全性考虑,一般还要设置有效期,到期自动失效。我们怎么实现这样的功能呢?

解决方案

使用现有的缓存技术框架,比如redis,ehcache。优点:成熟,稳定,功能强大;缺点,项目需要引入对应的框架,不够轻量。

如果不考虑分布式,只是在单线程或者多线程间作数据缓存,其实完全可以自己手写一个缓存工具。下面就来简单实现一个这样的工具。

先上代码:

import java.util.HashMap; import java.util.Map; import java.util.concurrent.*; /** * @Author: lixk
 * @Date: 2018/5/9 15:03
 * @Description: 简单的内存缓存工具类 */
public class Cache { //键值对集合
    private final static Map<String, Entity> map = new HashMap<>(); //定时器线程池,用于清除过期缓存
    private final static ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); /** * 添加缓存
     *
     * @param key  键
     * @param data 值 */
    public synchronized static void put(String key, Object data) {
        Cache.put(key, data, 0);
    } /** * 添加缓存
     *
     * @param key    键
     * @param data   值
     * @param expire 过期时间,单位:毫秒, 0表示无限长 */
    public synchronized static void put(String key, Object data, long expire) { //清除原键值对
 Cache.remove(key); //设置过期时间
        if (expire > 0) {
            Future future = executor.schedule(new Runnable() {
                @Override public void run() { //过期后清除该键值对
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值