Ehcache 是一个Java实现的开源分布式缓存框架,EhCache 可以有效地减轻数据库的负载,可以让数据保存在不同服务器的内存中,在需要数据的时候可以快速存取。同时EhCache 扩展非常简单,官方提供的Cache配置方式有好几种。你可以通过声明配置、在xml中配置、在程序里配置或者调用构造方法时传入不同的参数。
特点:
存取速度非常快,性能很不错。
可以应用多种缓存策略。
分级缓存,用户可以指定哪些数据在硬盘中缓存,哪些数据在内存中缓存。
可以通过RMI、可插入API等方式进行分布式缓存。
具有缓存和缓存管理器的侦听接口。
支持多缓存管理器实例,以及一个实例的多个缓存区域。
默认提供Hibernate的缓存实现
java ehcache是什么,让我们一起了解一下?
EhCache是一个纯Java的进程内缓存框架,具有快速、精干等特点。主要面向通用缓存,Java EE和轻量级容器,具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序的功能。
ehcache主要的特性有:
1、简单,快速。
2、提供Hibernate的缓存实现。
3、多种缓存策略。
4、缓存数据有两级:内存和磁盘,因此无需担心容量问题。
5、缓存数据会在虚拟机重启的过程中写入磁盘。
6、可以通过RMI、可插入API等方式进行分布式缓存。
7、具有缓存和缓存管理器的侦听接口。
8、支持多缓存管理器实例,以及一个实例的多个缓存区域。
Ehcache在java中是如何使用的?
具体代码如下:代码实现的功能非常简单,即创建CacheManager,往里面存放一个Cache,然后往cache里面存数据和取数据,目的是展示Ehcache的基本使用。 /** * XXX.com Inc. * Copyright (c) 2004-2014 All Rights Reserved. */ package com.test.encache import net.sf.ehcache.Cache import net.sf.ehcache.CacheManager import net.sf.ehcache.Element /** * * @author XXX * @version $Id: EncacheTest.java, v 0.1 2014年8月8日 下午5:30:03 XXX Exp $ */ public class EncacheTest { //一些配置参数 //private final static String configFileName = "ehcache.xml" //private final static int maxEntriesLocalHeap = 1000 private static CacheManager cacheManager static String cacheName = "cache1" public static void main(String[] args) { ehcacheSetUp() ehcacheUse() } private static void ehcacheSetUp() { cacheManager = CacheManager.create() //CacheConfiguration configuration = new CacheConfiguration(configFileName, // maxEntriesLocalHeap) //Cache cache = new Cache(configuration) cacheManager.addCache(cacheName) } private static void ehcacheUse() { Cache cache1 = cacheManager.getCache(cacheName) String key = "key1" String value = "value1" writeSomeData(cache1, key, value) Element element = readSomeData(cache1, key, value) System.out.println(element) } private static void writeSomeData(Cache cache, String key, String value) { cache.put(new Element(key, value)) } private static Element readSomeData(Cache cache, String key, String value) { return cache.get(key) } }
关于java清缓存前可以进后台方法,清完缓存不进了相关资料如下java我们在使用缓存时,往往先尝试去缓存中取值,如果没有,再去数据库取值,如果数据库也没有值,则根据业务需求,返回空或者抛异常。
如果用户一直访问一个数据库不存在的数据,比如id为-1的数据,就会导致每次请求都会先去缓存查一次,然后再去数据库查一次,造成严重的性能问题。这种情况就叫缓存穿透。
解决方案
以下几种解决方案:对请求参数做校验,比如用户鉴权校验,id做基础校验,id <= 0的直接拦截。
如果查询到数据库没有值,也将对应的key存进缓存中,value为null。这样下次查询就直接从缓存返回了。但这里的key的缓存时间应该比较短,比如30s。防止后面在数据库插入了这条数据,而用户获取不到。
使用布隆过滤器,判断一个key是否已经查过了,如果已经查过了,就不去数据库查询。
缓存击穿
缓存击穿指的是,一个key的访问量非常大,比如某秒杀活动,有1w/s的并发量。这个key在某一时刻过期,那这些大量的请求就会一瞬间到数据库,数据库可能会直接崩溃。
解决方案
缓存击穿的解决方案也有几种,可以配合使用:对于热点数据,慎重考虑过期时间,确保热点期间key不会过期,甚至有些可以设置永不过期。
使用互斥锁(比如Java的多线程锁机制),第一个线程访问key的时候就锁住,等查询数据库返回后,把值插入到缓存后再释放锁,这样后面的请求就可以直接取缓存里面的数据了。
缓存雪崩
缓存雪崩指的是,在某一时刻,多个key失效。这样就会有大量的请求从缓存中获取不到值,全部到数据库。还有另一种情况,就是缓存服务器宕机,也算做缓存雪崩。
解决方案
针对上述两种情况,缓存雪崩有两种解决方案:对每个key的过期时间设置一个随机值,而不是所有key都相同。
使用高可用的分布式缓存集群,确保缓存的高可用性,比如redis-cluster。