【工具篇】使用concurrentHashMap实现缓存工具类

简介: 【工具篇】使用concurrentHashMap实现缓存工具类

示例代码:

import lombok.extern.slf4j.Slf4j;
import java.util.;
import java.util.concurrent.
;

/**

  • @author xxkfz
  • 自定义缓存
    */
    @Slf4j
    public class ConcurrentHashMapCache {

    private final Map CACHE_MAP = new ConcurrentHashMap();

    /**

    • 每个缓存生效时间12小时
      /
      public final long CACHE_HOLD_TIME_12H = 12
      60 60 1000L;

      /**

    • 每个缓存生效时间24小时
      /
      public final long CACHE_HOLD_TIME_24H = 24
      60 60 1000L;

      /**

    • 存放一个缓存对象,默认保存时间12小时
      *
    • @param cacheName
    • @param obj
      */
      public void put(String cacheName, Object obj) {
      put(cacheName, obj, CACHE_HOLD_TIME_12H);
      }

      /**

    • 存放一个缓存对象,保存时间为holdTime
      *
    • @param cacheName
    • @param obj
    • @param holdTime
      */
      public void put(String cacheName, Object obj, long holdTime) {
      CACHE_MAP.put(cacheName, obj);
      // 设置缓存失效时间
      CACHE_MAP.put(cacheName + "_HoldTime", System.currentTimeMillis() + holdTime);
      log.info("{}:成功存入缓存! 过期时间:{}", cacheName, holdTime);
      }

      /**

    • 取出一个缓存对象
      *
    • @param cacheName
    • @return
      */
      public Object get(String cacheName) {
      if (checkCacheName(cacheName)) {

       return CACHE_MAP.get(cacheName);
      

      }
      return null;
      }

      /**

    • 删除所有缓存
      */
      public void removeAll() {
      CACHE_MAP.clear();
      }

      /**

    • 删除某个缓存
      *
    • @param cacheName
      */
      public void remove(String cacheName) {
      CACHE_MAP.remove(cacheName);
      CACHE_MAP.remove(cacheName + "_HoldTime");
      }

      /**

    • 检查缓存对象是否存在,
    • 若不存在,则返回false
    • 若存在,检查其是否已过有效期,如果已经过了则删除该缓存并返回false
      *
    • @param cacheName
    • @return
      */
      public boolean checkCacheName(String cacheName) {
      Long cacheHoldTime = (Long) CACHE_MAP.get(cacheName + "_HoldTime");
      if (cacheHoldTime == null || cacheHoldTime == 0L) {

       return false;
      

      }
      if (cacheHoldTime < System.currentTimeMillis()) {

       log.info("缓存:{}已失效!", cacheName);
       remove(cacheName);
       return false;
      

      }
      return true;
      }

      /**

    • 获取缓存大小
      *
    • @return
      */
      public Integer size() {
      if (null != CACHE_MAP && CACHE_MAP.size() > 0) {

       return CACHE_MAP.size();
      

      }
      return 0;
      }

      /**

    • 判断缓存的key是否存在
      *
    • @param cacheName
    • @return
      */
      public boolean isExist(String cacheName) {
      if (!checkCacheName(cacheName)) {
       return Boolean.FALSE;
      
      }
      return CACHE_MAP.containsKey(cacheName);
      }
      }

相关文章
|
缓存 NoSQL Java
Java工具篇之Guava-cache内存缓存
常在业务系统中做开发,不会点高级知识点,有点不好意思了。在业务系统中,提高系统响应速度,提供系统高并发能力,其实方向很简单,三个方向,六个字而已: **缓存降级限流。** 当然这是在排除代码质量非常差的情况,如果代码质量很差,都是while循环和高内存占用,那么其实再怎么做都于事无补。除非你有一个马云爸爸,性能不够,机器来凑嘛。阿里云前来支持(1000台机器够了吗?)
1238 0
|
4月前
|
缓存 安全 算法
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
41 0
|
3月前
|
缓存 NoSQL 网络安全
【Azure Redis 缓存】使用开源工具redis-copy时遇见6379端口无法连接到Redis服务器的问题
【Azure Redis 缓存】使用开源工具redis-copy时遇见6379端口无法连接到Redis服务器的问题
|
4月前
|
缓存 Java Spring
Guava缓存工具类封装和使用
Guava缓存工具类封装和使用
104 0
|
4月前
|
设计模式 存储 缓存
Java面试题:结合单例模式与Java内存模型,设计一个线程安全的单例类?使用内存屏障与Java并发工具类,实现一个高效的并发缓存系统?结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:结合单例模式与Java内存模型,设计一个线程安全的单例类?使用内存屏障与Java并发工具类,实现一个高效的并发缓存系统?结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
37 0
|
5月前
|
缓存 NoSQL Java
Redis系列学习文章分享---第四篇(Redis快速入门之Java客户端--商户查询缓存+更新+双写一致+穿透+雪崩+击穿+工具封装)
Redis系列学习文章分享---第四篇(Redis快速入门之Java客户端--商户查询缓存+更新+双写一致+穿透+雪崩+击穿+工具封装)
68 0
|
6月前
|
存储 缓存 NoSQL
【Redis】3、Redis 作为缓存(Redis中的穿透、雪崩、击穿、工具类)
【Redis】3、Redis 作为缓存(Redis中的穿透、雪崩、击穿、工具类)
123 0
|
6月前
|
存储 缓存 JavaScript
genius-storage使用文档,一个浏览器缓存工具
genius-storage使用文档,一个浏览器缓存工具
|
缓存 Java 数据库
字典缓存工具类
在系统设计中,需要考虑到系统性能方面的需求,需要对一些数据字典进行缓存操作。。
222 1
|
缓存 Linux
推荐两款Linux 查看缓存命中率的工具
推荐两款Linux 查看缓存命中率的工具
186 0