关于spring redis注解实现缓存机制


下面由redis教程栏目给大家介绍关于spring redis注解实现缓存机制,希望对需要的朋友有所帮助!

1、xml配置

 <bean id="poolConfigTax" class="redis.clients.jedis.JedisPoolConfig">  
        <property name="maxIdle" value="${redis_tax.maxIdle}" />  
        <property name="minIdle" value="${redis_tax.minIdle}" />  
        <property name="maxTotal" value="${redis_tax.maxTotal}" />
        <property name="testOnBorrow" value="${redis_tax.testOnBorrow}" />  
    </bean>  
    <!-- Tax redis 数据库  -->
    <bean id="connectionFactoryTax" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"   
        p:host-name="${redis_tax.host}" p:port="${redis_tax.port}" p:password="${redis_tax.pass}"  p:pool-config-ref="poolConfigTax"
        p:database="0"/>  
    <!--redis操作模版,使用该对象可以操作redis  -->  
    <bean id="redisTemplateTax" class="org.springframework.data.redis.core.RedisTemplate" >    
        <property name="connectionFactory" ref="connectionFactoryTax" />    
        <!--如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String!!  -->    
        <property name="keySerializer" >    
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />    
        </property>    
        <property name="valueSerializer" >    
            <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />    
        </property>    
        <property name="hashKeySerializer">    
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>    
        </property>    
        <property name="hashValueSerializer">    
            <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>    
        </property>    
        <!--开启事务  -->  
        <property name="enableTransactionSupport" value="false"></property>  
    </bean>   
    <!-- 配置RedisCacheManager -->
    <bean id="redisCacheManager" class="org.springframework.data.redis.cache.RedisCacheManager">
        <constructor-arg name="redisOperations" ref="redisTemplateTax" />
    </bean>
    <cache:annotation-driven cache-manager="redisCacheManager"/>

2、缓存注解@Cacheable、@CacheEvict、@CachePut详解
一、@Cacheable用法详解
1、用在哪里?用在方法或者类上。
2、这两种用法有什么区别?
 用在方法上表示:该方法的返回值将被缓存起来 
 用在类上表示:表示该类的所有方法都支持该注解
3、使用后的结果是什么?下次使用相同方法和相同参数调用这个方法的时候将直接从缓存取值,而不需要再次执行该方法。
4、返回值在缓存中怎么存储的?以键值对的方式存储在缓存中,value就是返回值,key由两种策略生成:默认策略和自定义策略
5、默认策略和默认策略怎么用?
  默认策略:在value值后双“::”拼接,形参列表,当形参是对象时,使用json格式:

@CacheConfig(cacheNames="enterprise")//<!-- 声明缓存使用的缓存名称 -->
public interface EnterpriseRepo extends JpaRepository<Enterprise, Integer>,JpaSpecificationExecutor<Enterprise>{
    @Cacheable(value="cash1")
    Enterprise findByid(Integer id);

    @CachePut(value="cash1")
    Enterprise s*e(Enterprise enterprise);

}

  自定义策略:key属性是用来指定Spring缓存方法的返回结果时对应的key的。该属性支持SpringEL表达式。当我们没有指定该属性时,Spring将使用默认策略生成key。

    自定义策略是指我们可以通过Spring的EL表达式来指定我们的key。这里的EL表达式可以使用方法参数及它们对应的属性。使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”。下面是几个使用参数作为key的示例。

@Cacheable(value="users", key="#id")

   public User find(Integer id) {
      return null;
   }

   @Cacheable(value="users", key="#p0")
   public User find(Integer id) {
      return null;
   }

   @Cacheable(value="users", key="#user.id")
   public User find(User user) {
      return null;
   }

   @Cacheable(value="users", key="#p0.id")
   public User find(User user) {
      return null;
   }

  除了上述使用方法参数作为key之外,Spring还为我们提供了一个root对象可以用来生成key。通过该root对象我们可以获取到以下信息。

当我们要使用root对象的属性作为key时我们也可以将“#root”省略,因为Spring默认使用的就是root对象的属性。如:

@Cacheable(value={"users", "xxx"}, key="caches[1].name")

public User find(User user) {
   return null;
}

6、condition属性指定发生的条件

  有的时候我们可能并不希望缓存一个方法所有的返回结果。通过condition属性可以实现这一功能。condition属性默认为空,表示将缓存所有的调用情形。其值是通过SpringEL表达式来指定的,当为true时表示进行缓存处理;当为false时表示不进行缓存处理,即每次调用该方法时该方法都会执行一次。如下示例表示只有当user的id为偶数时才会进行缓存。

SONIFY.io SONIFY.io

设计和开发音频优先的产品和数据驱动的解决方案

SONIFY.io 83 查看详情 SONIFY.io
@Cacheable(value={"users"}, key="#user.id", condition="#user.id%2==0")
public User find(User user) {
   System.out.println("find user by user " + user);
   return user;
}

二、@CachePut

在支持Spring Cache的环境下,对于使用@Cacheable标注的方法,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。@CachePut也可以声明一个方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
  一般使用在保存,更新方法中。

    @CachePut也可以标注在类上和方法上。使用@CachePut时我们可以指定的属性跟@Cacheable是一样的。

    @CachePut(“users”)//每次都会执行方法,并将结果存入指定的缓存中

public User find(Integer id) {
      return null;
}

三、@CacheEvict

@CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与@Cacheable对应的属性类似。即value表示清除操作是发生在哪些Cache上的(对应Cache的名称);key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;condition表示清除操作发生的条件。下面我们来介绍一下新出现的两个属性allEntries和beforeInvocation。
1、 allEntries属性
allEntries是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素,这比一个一个清除元素更有效率。

@CacheEvict(value="users", allEntries=true)
public void delete(Integer id) {
   System.out.println("delete user by id: " + id);
}

2、beforeInvocation属性
 清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素。

@CacheEvict(value="users", beforeInvocation=true)
public void delete(Integer id) {
   System.out.println("delete user by id: " + id);
}

以上就是关于spring redis注解实现缓存机制的详细内容,更多请关注其它相关文章!


# 是否存在  # 小红书推广入口官方网站  # 成都抖音营销推广机构  # 北关区网站推广外包服务  # 澳门seo网站优化  # 无忧摄影网站建设  # 砂锅店营销推广策略怎么写  # 网站推广哪家公司效果好  # 品牌自动营销推广怎么做  # 可以免费注册的推广网站  # 余杭网站推广平台  # spring  # 键值  # 报错  # 返回值  # 当我们  # 的是  # 自定义  # 并将  # 我们可以  # 用在  # redis 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: J*aScript装饰器_元编程实战  《火影忍者:木叶高手》快速升级攻略  在Dash应用中自定义HTML标题和网站图标  QQ网站入口直接登录 QQ官方正版登录页面  个人所得税办理入口 个人所得税综合所得年度汇算入口  苹果手机聊天记录删除了如何恢复  德邦快递会员怎么开通  AngularJS动态内容中DOM元素查找的时序问题及$timeout解决方案  狙击外星人小游戏在线链接_狙击外星人小游戏网页链接  解决J*aScript动态图片上传中ID重复问题:在同一页面显示多张独立图片  惠普电脑BIOS界面看不懂怎么办_HP电脑BIOS功能选项解读与设置  抖音如何进行蓝V认证 抖音企业号申请所需资料与流程  手机远程连接电脑方法  抄漫画官网防走失地址_抄漫画最新漫画完整版阅读入口  鲁班大师乓乓皮肤获取方法  XPath动态元素定位:如何精准选择文本内容变化的元素  win11怎么设置默认终端为Windows Terminal Win11替代CMD和PowerShell【技巧】  行者app怎样导出日志  Python类装饰器动态修改方法时的类型提示:Mypy插件实现精确静态分析  Golang如何使用crypto/md5生成哈希_Golang MD5哈希生成方法  飞飞漫画漫画阅读官网_飞飞漫画漫画阅读官网进入阅读  《友玩*》创建群聊方法  PHP中实现JSON数据数组分页的教程  b站怎么用微信登录_b站微信登录方法  cad怎么隐藏指定的图层_cad隐藏或冻结图层方法  智学网app怎么登录忘记密码_智学网app忘记密码找回与重新登录操作方法  Linux如何开发轻量级数据服务模块_Linux服务化设计  创建快捷方式启动系统保护  在J*a中如何实现类的继承与方法重用_OOP继承方法重用技巧分享  Excel怎么用XLOOKUP函数实现双向查找_ExcelXLOOKUP替代VLOOKUP+HLOOKUP的高级用法  《飞猪旅行》购买汽车票方法  快手网页版官方访问 快手网页版页面在线打开  京东物流快递破损了怎么办_京东快递破损理赔流程  Highcharts雷达图径向轴数值标签实现教程  b站如何剪辑视频_b站必剪app使用教程  抖音号显示企业机构号是什么意思?企业机构号申请条件是什么?  在VS Code中利用AI辅助进行代码迁移  广州地铁app准妈咪徽章领取方法  J*a中逻辑运算符如何使用_逻辑与或非的基础用法讲解  《荔枝fm》导出文件教程  《搜书吧》阅读书籍方法  Win10运行窗口在哪里打开 Win10调出运行命令框快捷键【技巧】  金牛福袋获取攻略  除了Copilot,还有哪些值得一试的VS Code AI插件?  苹果自助维修计划支持哪些设备机型  精通VS Code多光标编辑以实现闪电般快速的修改  在React中正确处理HTML input type="number"的数值类型  vivo浏览器怎么离线保存网页 vivo浏览器下载完整页面以便无网络时阅读  Lar*el 关联查询:同时筛选父表与子表数据的高效策略  电子白板帮助菜单使用指南 

 2020-11-02

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.