博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
redisCacheManager
阅读量:7053 次
发布时间:2019-06-28

本文共 4963 字,大约阅读时间需要 16 分钟。

hot3.png

redisCacheManager(redis缓存管理器使用):配置+注解

 

@Cacheable、@CachePut、@CacheEvict 注解介绍:

(1)@Cacheable

作用:主要针对方法配置,能够根据方法的请求参数对其结果进行缓存

@Cacheable 主要的参数:

1)value:缓存的名称,在 spring 配置文件中定义,必须指定至少一个

例如:@Cacheable(value="mycache") 或者 @Cacheable(value={"cache1","cache2"})

2)key:缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合

例如:@Cacheable(value="testcache",key="#userName")

3)condition:缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存

例如:@Cacheable(value="testcache",condition="#userName.length()>2")

 

(2)@CachePut

作用:主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,

 和@Cacheable不同的是,它每次都会触发真实方法的调用

@CachePut 主要的参数:同@Cacheable

 

(3)@CacheEvict

作用:主要针对方法配置,能够根据一定的条件对缓存进行清空

@CacheEvict 主要的参数:

1)value:缓存的名称,在 spring 配置文件中定义,必须指定至少一个

例如:@CachEvict(value="mycache") 或者 @CachEvict(value={"cache1","cache2"})

2)key:缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合

例如:@CachEvict(value="testcache",key="#userName")

3)condition:缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才清空缓存

例如:@CachEvict(value="testcache",condition="#userName.length()>2")

4)allEntries:是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存

例如:@CachEvict(value="testcache",allEntries=true)

5)beforeInvocation:是否在方法执行前就清空,缺省为 false,

 如果指定为 true,则在方法还没有执行的时候就清空缓存,

 缺省情况下,如果方法执行抛出异常,则不会清空缓存

例如:@CachEvict(value="testcache”,beforeInvocation=true)

 

配置+注解的具体使用:

1、pom.xml依赖注入:

    
org.springframework.data
    
spring-data-redis
    
1.7.6.RELEASE
    
redis.clients
    
jedis
    
2.9.0

2、redis.properties(redis缓存配置文件)

master.name=mymastermaster.password=123456sentinel.host=127.0.0.1sentinel1.port=26379sentinel2.port=26380#缓存数据库选择redis.default.db=3pool.timeout=100000pool.maxTotal=100pool.maxActive=100pool.maxIdle=10pool.maxWaitMillis=1000#是否在borrow一个jedis之前就validatepool.testOnBorrow=true#缓存数据的最大生命周期,单位:s,-1永久redis.expiration=-1#是否禁用缓存,true禁用cacheManagers.fallbackToNoOpCache=false

3、在spring.xml(servlet-context.xml)中配置jedis以及cacheManager

   
   
    
   
   
   
   
   
       
           
       
       
           
               
               
           
       
   
   
   
   
   
   
       
       
           
       
       
           
       
       
           
       
       
           
       
   
   
   
   
   
   
   
   
   
   
       

 

4、使用注解(建议在Service层使用)

public class UserService {/** * @Cacheable:主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 * #:SpEL表达式 * 至少指定一个缓存的名称(value),多个:(value={"cache1","cache2"}) * 若缓存的key为空则缺省按照方法的所有参数进行组合,多个key组合:key="#userName.concat(#password)" * condition:缓存条件,可为空  condition="#userName.length()>4" */    @Cacheable(value = "user",key = "#id")    public User findUserById(Integer id) {    log.info("findUserFromDB================================================================");    return userDao.findUserById(id);    }    //@CachePut:每次都执行方法体并对返回结果进行缓存操作    @CachePut(value = "userLoginIdentity",key =     "#user.getId()",condition="#user.getUserName().length()>4")    public UserLoginIdentity buildUserLoginIdentity(User user){    UserLoginIdentity userLoginIdentity = new UserLoginIdentity();    userLoginIdentity.setUserIdString(UserIDBase64.encoderUserID(user.getId()));    userLoginIdentity.setUserName(user.getUserName());    userLoginIdentity.setRealName(user.getTrueName());    return userLoginIdentity;    }/** * @CacheEvict:清除缓存 * allEntries:是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存 * beforeInvocation:是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存, *                  缺省情况下,如果方法执行抛出异常,则不会清空缓存 */    @CacheEvict(value = {"user","userLoginIdentity"},allEntries = true,beforeInvocation = true)    public UserLoginIdentity login(String userName, String password) {    //非空验证    AssertUtil.isNotEmpty(userName, "用户名不能为空!");    AssertUtil.isNotEmpty(password, "密码不能为空!");    User user=userDao.findUserByUserName(userName.trim());    AssertUtil.notNull(user);    if (!MD5Util.md5Method(password).equals(user.getPassword())) {    throw new ParamException(103,"用户密码错误!请重新输入!");    }    return buildUserLoginIdentity(user);    }}

 

 

 

关于序列化:keySerializer:这个是对key的默认序列化器。

默认值是StringSerializer。

valueSerializer:这个是对value的默认序列化器,

默认值是取自DefaultSerializer的JdkSerializationRedisSerializer。

hashKeySerializer:对hash结构数据的hashkey序列化器,

默认值是取自DefaultSerializer的JdkSerializationRedisSerializer。

hashValueSerializer:对hash结构数据的hashvalue序列化器,

默认值是取自DefaultSerializer的JdkSerializationRedisSerializer。

 

从执行时间上来看,JdkSerializationRedisSerializer是最高效的(毕竟是JDK原生的),但是序列化的结果字符串是最长的。

JSON由于其数据格式的紧凑性,序列化的长度是最小的,时间比前者要多一些。

而OxmSerialiabler在时间上看是最长的(当时和使用具体的Marshaller有关)。

所以个人的选择是倾向使用JacksonJsonRedisSerializer作为POJO的序列器。 

转载于:https://my.oschina.net/u/3553440/blog/1543898

你可能感兴趣的文章
【转载】robocopy的用法
查看>>
基于语义约束与 Graph Cuts 的稠密三维场景 重建
查看>>
iOS 蓝牙4.0相关资料
查看>>
摆正开发人员的位置,坚持自己
查看>>
February 23, 2005
查看>>
剑指offer——面试题30:包含min函数的栈
查看>>
锋利jquery第三章案例 总结
查看>>
C++检测一个文件是否存在
查看>>
浅谈C/C++中的static和extern关键字 转
查看>>
HDU1237 简单计算器【堆栈】
查看>>
I00031 Look-and-say sequence
查看>>
HDU1157 POJ2388 Who's in the Middle
查看>>
HDU4394 Digital Square
查看>>
[Luogu3378] 【模板】堆
查看>>
动态语言和静态语言、编译型语言和解释型语言、强类型语言和弱类型语言的分析...
查看>>
04- 软件测试的方法与软件测试分类
查看>>
《HBase权威指南》读书笔记----简介
查看>>
Docker 基本指令整理(一)
查看>>
maven打包到本地库
查看>>
转:js取float型小数点后两位数的方法
查看>>