博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(六)Spring中Redis的缓存的使用...
阅读量:5745 次
发布时间:2019-06-18

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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/54174622

前面已经写了四篇关于dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合的文章:

  1. 接着上一篇文章,今天来写一篇关于Spring-data-redis在Spring中的缓存的使用

缓存(Caching)可以存储经常会用到的信息,这样每次需要的时候,这些信息都可以立即可用的。尽管Spring自身并没有实现缓存的解决方案,但是他对缓存功能提供了声明式的支持,能够与各种流行的缓存进行集成。几天主要介绍的是redis的缓存的支持。

1. Spring中启用对缓存管理的支持

Spring中对缓存管理器的支持有两种方式:

  • 注解驱动的缓存
  • XML声明的缓存

1.1 注解驱动的缓存

使用Spring的缓存抽象时,最为通用的方式就是在方法上添加@Cacheable和@CacheEvict注解。

在往bean添加缓存注解之前,必须要启用Spring对注解驱动的支持。如果我们使用java配置的话,那么可以在其中一个配置上添加@EnableCaching,这样的话就能启动注解驱动的缓存。

package com.lidong.util;import java.lang.reflect.Method;import org.springframework.cache.CacheManager;import org.springframework.cache.annotation.CachingConfigurerSupport;import org.springframework.cache.annotation.EnableCaching;import org.springframework.cache.interceptor.KeyGenerator;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.cache.RedisCacheManager;import org.springframework.data.redis.core.RedisTemplate;@Configuration@EnableCachingpublic class CachingConfig extends CachingConfigurerSupport{
@Bean public KeyGenerator wiselyKeyGenerator(){ return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { StringBuilder sb = new StringBuilder(); sb.append(target.getClass().getName()); sb.append(method.getName()); for (Object obj : params) { sb.append(obj.toString()); } return sb.toString(); } }; } /** * 声明缓存管理器 * @param redisTemplate * @return */ @Bean public CacheManager cacheManager(RedisTemplate
redisTemplate) { return new RedisCacheManager(redisTemplate); }}
1.2 XML声明的缓存

如果以XML的方式配置应用的话,那么可以是使用Spring cache命名空间的

元素来启动注解驱动的缓存。

2. Spring中配置缓存管理器

Spring 3.1内置了五个缓存管理器

  • SimpleCacheManager
  • NoOpCacheManager
  • ConcrrentMapCacheManager
  • CompositeCacheManager
  • EhCacheCacheManager

Spring 3.2引入了另外的一个缓存管理器,这个缓存管理器可以在基于JCache(JSR-107)的缓存提供商之中。除了核心的Spring框架,Spring data又提供了两个缓存管理器。

- RedisCacheManager 来自于Spring-data-redis项目
- GemfireCacheManager 来自于Spring-data-GemFire项目

所以我们选择缓存管理器时候,取决于使用底层缓存供应商。

3. Spring中配置Redis缓存管理器

缓存的条目不过就是一个键值对(key-vlaue),其中key描述了产生value的操作和参数。因此你,Redis作为key-value存储,非常适合于做缓存。

Redis可以用来为spring缓存抽象机制存储缓存条目,Spring-data-redis提供了RedisCacheManager,这是CacheManager的一个实现。RedisCacheManager 会与一个Redis服务器协作,并且通过RedisTemplate将缓存条目存储到Redis中。

@Configuration@EnableCachingpublic class RedisCachingConfig extends CachingConfigurerSupport{
@Bean public KeyGenerator wiselyKeyGenerator(){ return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { StringBuilder sb = new StringBuilder(); sb.append(target.getClass().getName()); sb.append(method.getName()); for (Object obj : params) { sb.append(obj.toString()); } return sb.toString(); } }; } /** * 声明缓存管理器RedisCacheManager * @param redisTemplate * @return */ @Bean public CacheManager cacheManager(RedisTemplate
redisTemplate) { return new RedisCacheManager(redisTemplate); }}

4. 为方法添加注解以支持缓存

Spring 的缓存抽象在很大程度上是围绕切面的构建的。在Spring中启用缓存时,会创建一个切面,它触发一个或更多的Spring的缓存注解。

Spring中提供了四个注解来声明缓存规则

  • @Cacheable 声明Spring在调用方法之前,首先应该在缓存中查找方法的返回值。如果这个值能够找到,就会返回存储的值,否则的话,这个方法就会被调用,返回值会放在缓存之中。
  • @CachePut 表明Spring应该将方法的返回值放到缓存中,在方法的调用前并不会检查缓存,方法始终都会被调用
  • @CacheEvict表明Spring应该在缓存中清除一个或多个条目
  • @Caching 这是一个分组的注解,能够同时应用多个其他的缓存注解

在Service层缓存数据的数据

package com.lidong.core.user.service;import java.util.List;import javax.annotation.Resource;import org.springframework.cache.annotation.CacheEvict;import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service;import com.lidong.api.service.user.IUserService;import com.lidong.core.user.dao.IUserDao;import com.lidong.model.user.User;@Service("userService")public class UserServiceImp implements IUserService {
@Resource IUserDao mIUserDao; @Override public String sayHello(String name) { return "Hello " + name; } @Cacheable(value={
"getUserById"}) @Override public User getUserById(int userId) { return mIUserDao.selectByPrimaryKey(userId); } @Override public User getUserByUsername(String username) { return mIUserDao.selectByPrimaryUsername(username); } @CacheEvict(value={
"getAllUser"},allEntries=true) @Override public void addUser(User user) { mIUserDao.insert(user); } @Cacheable(value={
"getAllUser"}) @Override public List
getAllUser() { return mIUserDao.selectAllUsers(); } @CacheEvict(value={
"getAllUser","getUserById"},allEntries=true) @Override public int delUserById(Integer userId) { return mIUserDao.deleteByPrimaryKey(userId); } @CacheEvict(value={
"getAllUser","getUserById"},allEntries=true) @Override public int updateUser(User user) { return mIUserDao.updateByPrimaryKey(user); }}

数据缓存成功

这里写图片描述

再次获取用户列表的时候;直接从缓存中读取用户的列表。

注意:缓存java对象时必须实现Serilaizable接口,因为Spring会将对象先序列化之后再存入到Redis中。

你可能感兴趣的文章
[工具] 将Sublime Text 3配置为Java代码编辑器
查看>>
iOS开发UI篇—APP主流UI框架结构
查看>>
Glide.centerCrop()第一次显示无效
查看>>
深入理解 CSS 的 :before 和 :after 选择器(制作select下拉列表美化插件)
查看>>
一站式学习Wireshark(九):应用Wireshark显示过滤器分析特定数据流(上)
查看>>
hive中order by,sort by, distribute by, cluster by作用以及用法
查看>>
Kafka副本管理—— 为何去掉replica.lag.max.messages参数
查看>>
读书笔记--对象、实例、原型、继承
查看>>
Unity中Collider和刚体Collider性能对比
查看>>
Workerman开源框架的作者
查看>>
012-基于 git hooks 的前端代码质量控制解决方案
查看>>
iOS 限制TextField输入长度(支持删除)
查看>>
Usb设备驱动1:root hub 设备驱动安装
查看>>
360极速浏览器
查看>>
获取java的路径
查看>>
TCL/Expect交互式自动化测试概要 - - ITeye技术网站
查看>>
SQL Server将单表数据导出成insert脚本形式
查看>>
【虚函数】C++虚函数表解析(转) ——写的真不错
查看>>
【jquery模仿net控件】初步GridView模型实现,及其简单应用
查看>>
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined ...
查看>>