JAVA 单例模式与hashmap结合实现缓存

本文介绍了一种使用Java和Spring框架实现缓存管理的方法,通过单例模式和HashMap存储不经常变动的数据,减少数据库访问,提高应用性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在平时做项目的时候,有一些数据并不是很频繁的改动,而且这些数据在很多地方用到,这个时候就可以把这个数据做成缓存的形式,一旦有了缓存,就不用每次用到的时候,就去数据库里读取,只需要第一次拿到数据以后,以后就可以从缓存里面提取数据。一个通常的处理方式,就是在应用程序启动的时候,就从数据库读取数据,然后保存在缓存中.

 

缓存的数据放在上面地方呢,在JAVA中比较方便的是放在hashmap里面。注意hashmap 是非线程安全的,所以要注意同步处理.

 

虽然数据是保存在缓存中,也是可以更新的。你可以结合定时器规则,比如每天晚上半夜时候更新一次,或者其他规律。

 

由于项目用到spring 框架,因此我用了spring 来配置singleton 模式的bean

 

程序代码

 

 

 

 

指定了init-method 方法,应用程序启动就加载,同时指定了scope=singleton ,说明这个类是单例模式.

 

实现一个cache类的接口

 

程序代码

 

package com.mycommon.cache;

 

public interface CacheLoader {

    public void loadAll();

    public void reloadAll();

 

}

 

 

实现一个具体的cache,我用的一个客户表,Custom 做的测试,具体相关dao层的配置这些不是重点,重点是 如何与hashmap结合,实现缓存的

 

 

程序代码

 

package com.mycommon.cache;

 

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

 

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

 

import com.card.dao.CustomerDAO;

import com.card.model.Customer;

 

@Component

public class CustomerCache implements CacheLoader {

 

    private static HashMap cacheMap;

    @Autowired

    private CustomerDAO customerDAO;

 

    private static CustomerCache cuscache;

 

    private byte[] lock = new byte[0];

 

 

 

    public static CustomerCache getInstance()

    {

        if(cuscache== null)

        {

            cuscache = new CustomerCache();

        }

      return cuscache;

    }

 

    public CustomerCache(){

 

    }

 

 

 

    public  synchronized void loadAll() {

        System.out.println("==========="+"得到缓存===================");

        cacheMap=new HashMap();

        List cuslist = customerDAO.getAllCache();

        if(cuslist != null){

            setCacheMap(cuslist);

        }

        System.out.println("==========="+"得到缓存完毕===================");

    }

 

    public synchronized void reloadAll() {

        System.out.println("==========="+"重新得到缓存===================");

        List cuslist = customerDAO.getAllCache();

        if(cuslist != null){

            cacheMap.clear();

            setCacheMap(cuslist);

        }

        System.out.println("==========="+"重新得到缓存===================");

    }

 

    private void setCacheMap(List cuslist) {

        for (Customer cus : cuslist) {

            cacheMap.put(String.valueOf(cus.getId()),cus);

        }

    }

 

 

    public synchronized void add(Customer cus){

        cacheMap.put(String.valueOf(cus.getId()),cus);

    }

 

 

    public synchronized void update(Customer cus) {

        cacheMap.put(String.valueOf(cus.getId()), cus);

    }

 

 

    public synchronized Customer findCusByID(String id){

        if(cacheMap.values()!=null && cacheMap.values().size()>0){

            for (Iterator iter = cacheMap.values().iterator(); iter.hasNext();) {

                Customer cus = (Customer) iter.next();

                if(id.equals(String.valueOf(cus.getId()))){

                    return cus;

                }

            }

        }

        return null;

    }

 

    public synchronized List getallCache(){

        List listAll=new ArrayList();

        for (Iterator iter = cacheMap.values().iterator(); iter.hasNext();) {

            Customer cus = (Customer) iter.next();

            listAll.add(cus);

        }

        return listAll;

 

    }

 

    public void removeCusCache(Customer cus) {

        synchronized (lock) {

            cacheMap.remove(String.valueOf(cus.getId()));

        }

    }

    //----------------------------------------------------------------------

 

    public CustomerDAO getCustomerDAO() {

        return customerDAO;

    }

 

    public void setCustomerDAO(CustomerDAO customerDAO) {

        this.customerDAO = customerDAO;

    }

 

 

}

 

 

 

一旦应用程序启动以后,就可以直接用 CustomerCache.getInstance 得到这个单例模式的实例。然后在调用这个实例的各种方法,比如 tmpcache.getallCache() 等等

 

程序代码

 

CustomerCache tmpcache=CustomerCache.getInstance();

System.out.println("tmpcache"+tmpcache);

System.out.println("cache:===");

System.out.println( tmpcache.getallCache());

 

 

除非申明,文章均为一号门原创,转载请注明本文地址,谢谢!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值