java 分布式缓存框架有哪些

Python08

java 分布式缓存框架有哪些,第1张

Ehcache

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。