redistemplate使用_Shiro使用Redis作为缓存实现

使用Shiro

shiro是什么以及shiro的简单使用10分钟入门Shiro已经是做过简单的介绍了,这篇算是上一篇的扩展吧,先上两张图复习下什么是shiro。

76b882250968081283842cb55b67a0d7.png

61d516c3c9d88ce42f7ca9a9abb75af6.png

使用CacheManager作为缓存实现

1.Cache 作用
  • Cache 缓存: 计算机内存中一段数据  

  • 作用: 用来减轻DB的访问压力,从而提高系统的查询效率

  • 流程:

8d34707715db27ff1b0fde14765318e0.png

2.使用shiro中默认EhCache实现缓存
1.引入依赖
<dependency>  <groupId>org.apache.shirogroupId>  <artifactId>shiro-ehcacheartifactId>  <version>1.5.3version>dependency>
2.开启缓存
  // Ream    @Bean    public Realm getRealm(){        CustomerRealm realm = new CustomerRealm();        // 修改Realm的密码匹配器为Hash密码匹配器        HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();        // 设置加密算法为MD5        matcher.setHashAlgorithmName("md5");        // 设置散列次数        matcher.setHashIterations(1024);        realm.setCredentialsMatcher(matcher);        // 缓存管理器        realm.setAuthenticationCachingEnabled(true);// 开启认证缓存        realm.setAuthorizationCachingEnabled(true);// 开启授权缓存        realm.setCacheManager(new EhCacheManager());// 设置缓存管理器        return realm;    }
3.shiro中使用Redis作为缓存实现
1.引入redis依赖
<dependency>  <groupId>org.springframework.bootgroupId>  <artifactId>spring-boot-starter-data-redisartifactId>dependency>
2.配置redis连接
spring.redis.port=redis的端口号spring.redis.host=你的redis服务器地址spring.redis.database=0
3.实现redisCache的思路

基于Shiro提供的EhCache,你会发现动手实现一个RedisCache是非常的简单,点进realm.setCacheManager()方法发现人家需要一个CacheManager类型的参数。

public void setCacheManager(CacheManager cacheManager) {        this.cacheManager = cacheManager;        this.afterCacheManagerSet();    }

点进CacheManager发现这东西是一个接口。

package org.apache.shiro.cache;public interface CacheManager {    CachegetCache(String var1) throws CacheException;}

那事情就变得简单起来的我们只要编写一个RedisCacheManager实现CacheManager这个接口实现getCache这个方法就好啦。再看一下Cache这个接口是不是和redis的键值对操作毫无违和感呢。

public interface Cache<K, V> {    V get(K var1) throws CacheException;    V put(K var1, V var2) throws CacheException;    V remove(K var1) throws CacheException;    void clear() throws CacheException;    int size();    Setkeys();    Collectionvalues();}
4.开发RedisCacheManager
public class RedisCacheManager implements CacheManager {    @Override    public CachegetCache(String cacheName) throws CacheException {        System.out.println("缓存名称: "+cacheName);        return new RedisCache(cacheName);    }}
5.开发RedisCache实现
public class RedisCache<K,V> implements Cache<K,V> {    private String cacheName;    public RedisCache() {    }    public RedisCache(String cacheName) {        this.cacheName = cacheName;    }    @Override    public V get(K k) throws CacheException {        System.out.println("获取缓存:"+ k);        return (V) getRedisTemplate().opsForHash().get(this.cacheName,k.toString());    }    @Override    public V put(K k, V v) throws CacheException {        System.out.println("设置缓存key: "+k+" value:"+v);        getRedisTemplate().opsForHash().put(this.cacheName,k.toString(),v);        return null;    }    @Override    public V remove(K k) throws CacheException {        return (V) getRedisTemplate().opsForHash().delete(this.cacheName,k.toString());    }    @Override    public v remove(k k) throws CacheException {        return (v) getRedisTemplate().opsForHash().delete(this.cacheName,k.toString());    }    @Override    public void clear() throws CacheException {        getRedisTemplate().delete(this.cacheName);    }    @Override    public int size() {        return getRedisTemplate().opsForHash().size(this.cacheName).intValue();    }    @Override    public Setkeys() {        return getRedisTemplate().opsForHash().keys(this.cacheName);    }    @Override    public Collectionvalues() {        return getRedisTemplate().opsForHash().values(this.cacheName);    }    private RedisTemplate getRedisTemplate(){        RedisTemplate redisTemplate = (RedisTemplate) ApplicationContextUtils.getBean("redisTemplate");        redisTemplate.setKeySerializer(new StringRedisSerializer());        redisTemplate.setHashKeySerializer(new StringRedisSerializer());        return redisTemplate;    }    //封装获取redisTemplate    private RedisTemplate getRedisTemplate(){        RedisTemplate redisTemplate = (RedisTemplate) ApplicationContextUtils.getBean("redisTemplate");        redisTemplate.setKeySerializer(new StringRedisSerializer());        redisTemplate.setHashKeySerializer(new StringRedisSerializer());        return redisTemplate;    }}
6.将shiro的缓存管理器切换为RedisCacheManager
realm.setCacheManager(new RedisCacheManager());

这样分布式的系统使用我们的Shiro作为安全框架也不用担心缓存的问题啦。

另外有时间的话下面这个视频把Shiro讲解的可谓是非常细致啦,记得三连哦。

https://www.bilibili.com/video/BV1uz4y197Zm

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值