数据库信息缓存

  提前将经常用到的数据库信息加载到缓存中,能极大的提升数据访问的效率。但这也带来数据同步的问题,所以很自然的就想设定一个时间间隔,数据过期后清空缓存,将数据库的信息重新加载到缓存中,但这个时间间隔很难把握。

  下面可以看看可设定一个固定时间来更新缓存的例子,勉强可以使用,但是高并发时很容易出问题。

 

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class LocalCache
{
    // 声明带时间标志的对象
    static class TimedValue
    {
        public long cacheTime;

        public Object value;

        public TimedValue(long cacheTime, Object value)
        {
            this.cacheTime = cacheTime;
            this.value = value;
        }

        public long getCacheTime()
        {
            return cacheTime;
        }

        public Object getValue()
        {
            return value;
        }
    }

    // 用Map进行缓存
    private static Map<String, TimedValue> cache = new HashMap<String, TimedValue>();
    private static final long VALID_TIME = 24 * 60 * 60 * 1000;
    // 类第一次使用时自动加载到缓存中
    static
    {
        loadData();
    }

    public Object get(String id)
    {
        TimedValue timedValue = cache.get(id);
        if (timedValue == null)
        {
            return null;
        }
        if (System.currentTimeMillis() - timedValue.getCacheTime() < VALID_TIME)
        {
            return timedValue.getValue();
        }
        else
        {
            loadData();
            return get(id);
        }
    }

    public static void loadData()
    {
        List<Product> products = getHotProductFromDB();
     cache.clear();
for (Product product : products) { cache.put(product.getId(), new TimedValue(System.currentTimeMillis(), product)); } } // 此处示意,表示从数据库中取出常用信息 private static List<Product> getHotProductFromDB() { return new ArrayList<Product>(); } } public class Product { public String id; public String name; public double price; public String getId() { return id; } public String getName() { return name; } public double getPrice() { return price; } }

 

  比较好的实现是Google Guava 工具包中的缓存类com.google.common.cache.LocalCache,不仅可以设定失效时间,同时在数据失效后还可以实现异步进行缓存的刷新。

 

 

 

 

 

 

 

 

 

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class LocalCache
{
    // 声明带时间标志的对象
    class TimedValue
    {
        public long cacheTime;

        public Object value;

        public TimedValue(long cacheTime, Object value)
        {
            this.cacheTime = cacheTime;
            this.value = value;
        }

        public long getCacheTime()
        {
            return cacheTime;
        }

        public Object getValue()
        {
            return value;
        }
    }

    private Map<String, TimedValue> cache = new HashMap<String, LocalCache.TimedValue>();
    private static final long VALID_TIME = 24 * 60 * 60 * 1000;

    public Object get(String id)
    {
        TimedValue timedValue = cache.get(id);
        if (timedValue != null && System.currentTimeMillis() - timedValue.getCacheTime() < VALID_TIME)
        {
            return timedValue.getValue();
        }
        else
        {
            loadData();
            return get(id);
        }
    }

    public void loadData()
    {
        List<Product> products = getHotProductFromDB();
        for (Product product : products)
        {
            cache.put(product.getId(), new TimedValue(System.currentTimeMillis(), product));
        }
    }

    // 此处示意,表示从数据库中取出常用信息
    private List<Product> getHotProductFromDB()
    {
        return new ArrayList<Product>();
    }
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。