javascript
学习Spring Boot:(十九)Shiro 中使用缓存
前言
在 shiro 中每次去攔截請(qǐng)求進(jìn)行權(quán)限認(rèn)證的時(shí)候,都會(huì)去數(shù)據(jù)庫查詢?cè)撚脩舻乃袡?quán)限信息, 這個(gè)時(shí)候就是有一個(gè)問題了,因?yàn)橛脩舻臋?quán)限信息在短時(shí)間內(nèi)是不可變的,每次查詢出來的數(shù)據(jù)其實(shí)都是重復(fù)數(shù)據(jù),沒必要每次都去重新獲取這個(gè)數(shù)據(jù),統(tǒng)一放在緩存中進(jìn)行管理,這個(gè)時(shí)候,我們只需要獲取一次權(quán)限信息,存入到緩存中,待緩存過期后,再次重新獲取即可。
例如,我執(zhí)行一個(gè)查詢多次,它執(zhí)行多次權(quán)限查詢。
使用 Reids 緩存
加入 shiro-redis 依賴
<!-- shiro-redis --> <dependency><groupId>org.crazycake</groupId><artifactId>shiro-redis</artifactId><version>2.4.2.1-RELEASE</version> </dependency>配置 Redis
和前面系統(tǒng)配置 Reids 一樣。
\1. 在系統(tǒng)配置文件中加入 Redis 配置參數(shù):
配置 Shiro 緩存
/*** redis 管理*/@Beanpublic CustomRedisManager customRedisManager() {return new CustomRedisManager();}/*** redis 緩存*/@Beanpublic RedisCacheManager cacheManager(CustomRedisManager redisManager) {RedisCacheManager redisCacheManager = new RedisCacheManager();redisCacheManager.setRedisManager(redisManager);return redisCacheManager;}@Beanpublic SecurityManager securityManager(OAuth2Realm oAuth2Realm, SessionManager sessionManager, RedisCacheManager cacheManager) {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();// 可以添加多個(gè)認(rèn)證,執(zhí)行順序是有影響的securityManager.setRealm(oAuth2Realm);securityManager.setSessionManager(sessionManager);// 注冊(cè) 緩存securityManager.setCacheManager(cacheManager);return securityManager;}使用測試
我們加入緩存后,看是個(gè)什么情況:
執(zhí)行多次請(qǐng)求,只執(zhí)行了一次查詢權(quán)限的 SQL。
可以去 redis-cli 查看 keys,檢查是否存在權(quán)限對(duì)象的 key。
使用 Ehcache 緩存
加入依賴
<!-- shiro ehcache --> <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-ehcache</artifactId><version>1.3.2</version> </dependency> <!-- ehchache --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId> </dependency>Ehcache 配置
新增一個(gè) Ehcache 配置文件 shiro-ehcache.xml:
<?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"updateCheck="false"><diskStore path="java.io.tmpdir/Tmp_EhCache" /><defaultCachemaxElementsInMemory="10000"eternal="false"timeToIdleSeconds="120"timeToLiveSeconds="120"overflowToDisk="false"diskPersistent="false"diskExpiryThreadIntervalSeconds="120" /><!-- 登錄記錄緩存鎖定1小時(shí) --><cache name="passwordRetryCache"maxEntriesLocalHeap="2000"eternal="false"timeToIdleSeconds="3600"timeToLiveSeconds="0"overflowToDisk="false"statistics="true" /> </ehcache>配置 EhCache 緩存
/*** EhCache 緩存*/@Beanpublic EhCacheManager ehCacheManager() {EhCacheManager em = new EhCacheManager();em.setCacheManagerConfigFile("classpath:config/shiro-ehcache.xml");return em;}@Beanpublic SecurityManager securityManager(OAuth2Realm oAuth2Realm, SessionManager sessionManager,RedisCacheManager cacheManager, EhCacheManager ehCacheManager) {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();// 可以添加多個(gè)認(rèn)證,執(zhí)行順序是有影響的securityManager.setRealm(oAuth2Realm);securityManager.setSessionManager(sessionManager);// 設(shè)置緩存securityManager.setCacheManager(ehCacheManager);return securityManager;}參考文章
- Spring Boot Shiro中使用緩存
總結(jié)
以上是生活随笔為你收集整理的学习Spring Boot:(十九)Shiro 中使用缓存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux内核杂记(8)-进程调度(3)
- 下一篇: SpringBoot 自动配置实现流程