EhCache
缓存是实际工作中非常常用的一种提高性能的方法, 我们会在许多场景下来使用缓存。
pom添加
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-ehcache</artifactId>
<version>1.2.2</version>
</dependency>
<!-- 缓存管理器 使用Ehcache实现 -->
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
<property name="cacheManagerConfigFile" value="classpath:ehcache.xml"/>
</bean>
ehcache.xml例
<!-- name:缓存名称。
maxElementsInMemory:缓存最大数目
maxElementsOnDisk:硬盘最大缓存个数。
eternal:对象是否永久有效,一但设置了,
timeout将不起作用。
overflowToDisk:是否保存到磁盘,当系统当机时
timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
clearOnFlush:内存数量最大时是否清除。
memoryStoreEvictionPolicy:可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)。
FIFO,first in first out,这个是大家最熟的,先进先出。 LFU,
Less Frequently Used,就是上面例子中使用的策略,直白一点就是讲一直以来最少被使用的。如上面所讲,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。
LRU,Least Recently Used,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存
defaultCache:默认的缓存配置信息,如果不加特殊说明,则所有对象按照此配置项处理
maxElementsInMemory:设置了缓存的上限,最多存储多少个记录对象
eternal:代表对象是否永不过期
timeToIdleSeconds:最大的发呆时间
timeToLiveSeconds:最大的存活时间
overflowToDisk:是否允许对象被写入到磁盘 -->
<?xml version="1.0" encoding="UTF-8"?>
<ehcache name="shirocache">
<diskStore path="java.io.tmpdir"/>
<!-- 登录记录缓存 锁定10分钟 -->
<cache name="passwordRetryCache"
maxEntriesLocalHeap="2000"
eternal="false"
timeToIdleSeconds="3600"
timeToLiveSeconds="0"
overflowToDisk="false"
statistics="true">
</cache>
<cache name="authorizationCache"
maxEntriesLocalHeap="2000"
eternal="false"
timeToIdleSeconds="3600"
timeToLiveSeconds="0"
overflowToDisk="false"
statistics="true">
</cache>
<cache name="authenticationCache"
maxEntriesLocalHeap="2000"
eternal="false"
timeToIdleSeconds="3600"
timeToLiveSeconds="0"
overflowToDisk="false"
statistics="true">
</cache>
<cache name="shiro-activeSessionCache"
maxEntriesLocalHeap="2000"
eternal="false"
timeToIdleSeconds="3600"
timeToLiveSeconds="0"
overflowToDisk="false"
statistics="true">
</cache>
</ehcache>
使用
import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.CacheManager;
private Cache<String, AtomicInteger> passwordRetryCache;
//通过上文中cacheManager获得name=passwordRetryCache的实例
passwordRetryCache = cacheManager.getCache("passwordRetryCache");
Cache 原文
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.shiro.cache;
import java.util.Collection;
import java.util.Set;
/**
* A Cache efficiently stores temporary objects primarily to improve an application's performance.
*
* <p>Shiro doesn't implement a full Cache mechanism itself, since that is outside the core competency of a
* Security framework. Instead, this interface provides an abstraction (wrapper) API on top of an underlying
* cache framework's cache instance (e.g. JCache, Ehcache, JCS, OSCache, JBossCache, TerraCotta, Coherence,
* GigaSpaces, etc, etc), allowing a Shiro user to configure any cache mechanism they choose.
*
* @since 0.2
*/
public interface Cache<K, V> {
/**
* Returns the Cached value stored under the specified {@code key} or
* {@code null} if there is no Cache entry for that {@code key}.
*
* @param key the key that the value was previous added with
* @return the cached object or {@code null} if there is no entry for the specified {@code key}
* @throws CacheException if there is a problem accessing the underlying cache system
*/
public V get(K key) throws CacheException;
/**
* Adds a Cache entry.
*
* @param key the key used to identify the object being stored.
* @param value the value to be stored in the cache.
* @return the previous value associated with the given {@code key} or {@code null} if there was previous value
* @throws CacheException if there is a problem accessing the underlying cache system
*/
public V put(K key, V value) throws CacheException;
/**
* Remove the cache entry corresponding to the specified key.
*
* @param key the key of the entry to be removed.
* @return the previous value associated with the given {@code key} or {@code null} if there was previous value
* @throws CacheException if there is a problem accessing the underlying cache system
*/
public V remove(K key) throws CacheException;
/**
* Clear all entries from the cache.
*
* @throws CacheException if there is a problem accessing the underlying cache system
*/
public void clear() throws CacheException;
/**
* Returns the number of entries in the cache.
*
* @return the number of entries in the cache.
*/
public int size();
/**
* Returns a view of all the keys for entries contained in this cache.
*
* @return a view of all the keys for entries contained in this cache.
*/
public Set<K> keys();
/**
* Returns a view of all of the values contained in this cache.
*
* @return a view of all of the values contained in this cache.
*/
public Collection<V> values();
}