Shiro - 缓存管理与CacheManagerAware接口

简介: Shiro - 缓存管理与CacheManagerAware接口

【1】Realm缓存

Shiro内部相应的组件(DefaultSecurityManager)会自动检测相应的对象(如Realm)是否实现了CacheManagerAware并自动注入相应的CacheManager。

如项目启动日志:

[INFO][2018-11-06 15:18:18,443][org.apache.shiro.cache.ehcache.EhCacheManager]Cache with name 
'com.web.maven.shiro.CustomRealm.authorizationCache' does not yet exist.  Creating now.
[INFO][2018-11-06 15:18:18,444][org.apache.shiro.cache.ehcache.EhCacheManager]Added EhCache named 
[com.web.maven.shiro.CustomRealm.authorizationCache]

再比如项目运行时:

[INFO][2018-11-06 15:30:20,870][org.apache.shiro.session.mgt.AbstractValidatingSessionManager]Enabling session validation scheduler...
[INFO][2018-11-06 15:30:21,017][org.apache.shiro.cache.ehcache.EhCacheManager]
Using existing EHCache named [shiro-activeSessionCache]

通常在项目中我们会使用自定义的Shiro-ehcache配置文件:

 <!-- 缓存管理器 -->
 <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
     <property name="cacheManagerConfigFile" value="classpath:shiro-ehcache.xml"/>
 </bean>

否则,Shiro将会去加载classpath:org/apache/shiro/cache/ehcache/ehcache.xml


Shiro提供了CachingRealm,其实现了CacheManagerAware接口,提供了缓存的一些基础实现。

AuthenticatingRealm及AuthorizingRealm也分别提供了对AuthenticationInfo和AuthorizationInfo信息的缓存。

即,你所看到的Realm是有缓存实现的–CacheManager。如认证过后,在注销前你无需再次认证,授权一次之后在注销前无需再次注销。都是Shiro 缓存在起作用。

如授权和认证缓存配置如下:

<cache name="authorizationCache"
           eternal="false"
           timeToIdleSeconds="3600"
           timeToLiveSeconds="0"
           overflowToDisk="false"
           statistics="true">
    </cache>
    <cache name="authenticationCache"
           eternal="false"
           timeToIdleSeconds="3600"
           timeToLiveSeconds="0"
           overflowToDisk="false"
           statistics="true">
    </cache>

【2】Session缓存

如SecurityManager实现了SessionSecurityManager,其会判断SessionManager是否实现了CacheManagerAware接口,如果实现了会把CacheManager设置给它。

essionManager也会判断相应的SessionDAO(如继承自CachingSessionDAO)是否实现了CacheManagerAware,如果实现了会把CacheManager设置给它。

设置了缓存的SessionManager,查询时会先查缓存,如果找不到才查数据库。

如sessionDao配置:

<!-- Session DAO. 继承 EnterpriseCacheSessionDAO -->
<bean id="sessionDAO"
  class="com.web.maven.shiro.MySessionDao">
  <property name="activeSessionsCacheName" value="shiro-activeSessionCache"/>
  <property name="sessionIdGenerator" ref="sessionIdGenerator"/>
</bean>

DefaultSessionManager.applyCacheManagerToSessionDAO()方法源码如下:

private void applyCacheManagerToSessionDAO() {
    if (this.cacheManager != null && this.sessionDAO != null && this.sessionDAO instanceof CacheManagerAware) {
          ((CacheManagerAware) this.sessionDAO).setCacheManager(this.cacheManager);
      }
}

通常实际开发中,我们会使用Redis实现Shiro的缓存,不再使用数据库。


目录
相关文章
|
4月前
|
缓存 Java
Java本地高性能缓存实践问题之使用Caffeine的Cache接口来查找一个缓存元素的问题如何解决
Java本地高性能缓存实践问题之使用Caffeine的Cache接口来查找一个缓存元素的问题如何解决
|
4月前
|
存储 缓存 NoSQL
在 Go 中使用接口进行灵活缓存
在 Go 中使用接口进行灵活缓存
|
4月前
|
存储 缓存 关系型数据库
Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存
Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存
89 0
|
7月前
|
缓存 NoSQL Java
用好缓存,让你的接口速度飞起来
本文是关于接口性能优化,特别是通过缓存来提升接口响应速度的探讨。作者是一名有六年经验的Java后端开发者,分享了自己避免线上系统因代码崩溃造成资损的经验,主要归功于业务的简单性、遵循代码规约和积累的实用技巧。文章重点讲解了缓存的两个方面:缓存预热(包括定时任务和启动预热)和缓存层次化(多级缓存和热点数据缓存),并提供了如何用代码实现这些思路的示例。作者还介绍了自定义缓存处理器的设计和实现,包括接口和抽象类的定义,以及使用函数式编程实现的缓存查询模板。最后提醒,缓存虽有益但需谨慎使用,应根据业务需求和数据特征定制策略。
169 1
|
7月前
|
存储 缓存 Java
探秘MyBatis缓存原理:Cache接口与实现类源码分析
探秘MyBatis缓存原理:Cache接口与实现类源码分析
116 2
探秘MyBatis缓存原理:Cache接口与实现类源码分析
|
7月前
|
消息中间件 缓存 NoSQL
利用Redis实现高效缓存管理与加速
本文将探讨如何利用Redis作为缓存管理工具,通过深入分析Redis的特性、使用场景和优势,帮助开发人员更好地理解和应用Redis来提升系统性能和响应速度。
|
消息中间件 设计模式 存储
高效协作处理缓存清理需求:生产者-消费者模式助力多模块缓存管理
在现代应用系统中,缓存是提高性能和减少数据库负载的重要手段之一。然而,缓存的数据在某些情况下可能会过期或者变得无效,因此需要及时进行清理。在复杂的应用系统中,可能有多个系统、多个模块产生缓存清理需求,而这些系统、模块之间的清理任务需要高效的协作,以避免数据竞争和资源浪费的问题。
130 0
高效协作处理缓存清理需求:生产者-消费者模式助力多模块缓存管理
|
存储 缓存 NoSQL
2021年你还不会Shiro?----9.Shiro利用缓存存储权限信息
前面的学习以及清楚,我们每调用一次权限的判断,就会默认调用一次自定义Realm中的doGetAuthorizationInfo方法进行过权限验证,但是当用户量与并发量比较高时,再按照这种方式去查询数据库,就会给系统带来很大的压力,让系统的响应变得很慢很,容易降低用户体验。这时候我们就需要使用缓存来存储已经登录的用户信息和用户的权限信息,缓存都是基于内存实现的比数据库快了很多,这样用户进来,直接从缓存中获取信息就行,不用去争抢有限的数据库资源了。
233 0
2021年你还不会Shiro?----9.Shiro利用缓存存储权限信息
|
缓存 NoSQL 测试技术
实战SSM_O2O商铺_47【Redis缓存】清除缓存接口的开发
实战SSM_O2O商铺_47【Redis缓存】清除缓存接口的开发
98 0