首页 > 数据库 >Spring缓存抽象怎么和redis进行集成

Spring缓存抽象怎么和redis进行集成

时间:2023-09-04 18:23:37浏览次数:37  
标签:username 缓存 return Spring redis person 序列化 public

一.在Maven pom.xml文件中加入Redis包

<!--redis-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-redis</artifactId>
    <version>${boot.version}</version>
</dependency>

<!-- redis lettuce pool -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

二.配置文件增加配置(解释:本配置采用Redis一主三从的的配置方式来提高缓存的吞吐量)

spring:
    application:
        name: spring-boot-redis
cache:
     type: redis redis: database: 0 #Redis 索引(0~15,默认为0) host: 192.168.145.132 port: 6379 timeout: 20000 cluster: nodes: #RedisCluster集群节点及端口信息 192.168.211.134:7000,192.168.211.134:7001,192.168.211.134:7002 maxRedirects: 6 #最大重定向数目 是重定向的最大数量,比如第一台挂了,连第二台,第二台挂了连第三台,这个重新连接的最大数量 lettuce: #SpringBoot 2.x + 版本后是用 lettuce 作为连接池 pool: max-active: 8 #连接池最大连接数 min-idle: 0 #最小空闲连接 max-idle: 8 #最大空闲连接 max-wait: -1 #最大等待时间使用负值无限制

3.编写Redis配置类

@Configuration
public class RedisConfig {
   @Bean
   public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
      RedisTemplate<Object, Object> template = new RedisTemplate<>();
      template.setConnectionFactory(connectionFactory);
      //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
      Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
      ObjectMapper mapper = new ObjectMapper();
//任何可见性的属性都将被序列化和反序列化 mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//包括上文提到的所有特征,而且包含即将被序列化的类里的全部、非final的属性,也就是相当于整个类、除final外的的属性信息都需要被序列化和反序列化。 mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); serializer.setObjectMapper(mapper);
    //所有的value都使用此序列化器,也可调用setStringSerializer(serializer) 设置单独的序列化器
    template.setValueSerializer(serializer); //使用StringRedisSerializer来序列化和反序列化redis的key值 template.setKeySerializer(new StringRedisSerializer()); return template; } }

解释:SpringBoot提供了对Redis的自动配置功能,在RedisAutoConfiguration中默认为我们配置了JedisConnectionFactory(客户端连接)、RedisTemplate以及StringRedisTemplate(数据操作模板),其中StringRedisTemplate模板只针对键值对都是字符型的数据进行操作,本示例采用RedisTemplate作为数据操作模板,该模板默认采用JdkSerializationRedisSerializer的二进制数据序列化方式,为了方便演示本示例采用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值,使用StringRedisSerializer来序列化和反序列化redis的key值。

4.启动类上加 @EnableCaching注解  开启缓存

5.Service层应用缓存(注解方式)

@Service
// 全局配置缓存名称
@CacheConfig(cacheNames = "config") public class PersonService { @Autowired private PersonRepo personRepo; /** * @Cacheable 应用到读取数据的方法上,先从缓存中读取,如果没有再从DB获取数据,然后把数据添加到缓存中 * unless 表示条件表达式成立的话不放入缓存 * @param username * @return */
// value 是单独配置缓存名称 @Cacheable(value = "user", key = "#root.targetClass + #username", unless = "#result eq null") public Person getPersonByName(String username) { Person person = personRepo.getPersonByName(username); return person; } /** * @CachePut 应用到写数据的方法上,如新增/修改方法,调用方法时会自动把相应的数据放入缓存 * @param person * @return */ @CachePut(value = "user", key = "#root.targetClass + #result.username", unless = "#person eq null") public Person savePerson(Person person) { return personRepo.savePerson(person); } /** * @CacheEvict 应用到删除数据的方法上,调用方法时会从缓存中删除对应key的数据 * @param username * @return */ @CacheEvict(value = "user", key = "#root.targetClass + #username", condition = "#result eq true") public boolean removePersonByName(String username) { return personRepo.removePersonByName(username) > 0; } public boolean isExistPersonName(Person person) { return personRepo.existPersonName(person) > 0; } }

解释:

1、这里的缓存key为简单的字符串组合,也可根据具体需要实现自定义的Key生成器,然后在注解中使用keyGenerator来引用。

2、Spring Cache提供了一些供我们使用的SpEL上下文数据,通过#来引用,具体可查看Spring官网:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#cache-spel-context。

6、数据访问资源类

 
@Component
@Path("personMgr")
public class PersonMgrResource {
    @Autowired
    private PersonService personService;
    @GET
    @Path("getPersonByName")
    @Produces(MediaType.APPLICATION_JSON)
    public JsonResp getPersonByName(@QueryParam("username") String username) {
        Person person = personService.getPersonByName(username);
        return JsonResp.success(person);
    }
    @POST
    @Path("removePersonByName")
    @Produces(MediaType.APPLICATION_JSON)
    public JsonResp removePersonByName(@QueryParam("username") String username) {
        if (personService.removePersonByName(username)) {
            return JsonResp.success();
        }
        return JsonResp.fail("系统错误!");
    }
    @POST
    @Path("savePerson")
    @Produces(MediaType.APPLICATION_JSON)
    public JsonResp savePerson(Person person) {
        if (personService.isExistPersonName(person)) {
            return JsonResp.fail("用户名已存在!");
        }
        if (personService.savePerson(person).getId() > 0) {
            return JsonResp.success();
        }
        return JsonResp.fail("系统错误!");
    }
}

 

 

 

标签:username,缓存,return,Spring,redis,person,序列化,public
From: https://www.cnblogs.com/nyhhd/p/17677615.html

相关文章

  • 面试题:spring中有两个id相同的bean对象会报错吗?
    一个xml文件声明两个beanid相同的对象,在项目启动时就会报错(对xml解析)。要求beanId唯一,该beanId元素标签已经被使用。两个xml文件声明相同beanId的对象,项目启动是没有问题的。使用时,属性值是后加载的对象值(先加载的会被后加载的覆盖)@Configuration注解+@Bean注解声明的相同......
  • 基于springboot+vue的宠物商城系统(前后端分离)
    博主主页:猫头鹰源码博主简介:Java领域优质创作者、博客专家、公司架构师、全网粉丝5万+、专注Java技术领域和毕业设计项目实战主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询文末联系获取项目介绍: 本系统以宠物商城为主题,采用前后端分离,项目代码......
  • 基于springboot+vue的商城系统(电商平台)(前后端分离)
    博主主页:猫头鹰源码博主简介:Java领域优质创作者、博客专家、公司架构师、全网粉丝5万+、专注Java技术领域和毕业设计项目实战主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询项目介绍: 本系统以商城为主题,采用前后端分离,项目代码工整,结构清晰,适合......
  • 基于springboot的自助旅游服务平台
    博主主页:猫头鹰源码博主简介:Java领域优质创作者、博客专家、公司架构师、全网粉丝5万+、专注Java技术领域和毕业设计项目实战主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询项目介绍: 该系统创作于2022年4月,包含详细数据库设计。基于springboot......
  • 基于springboot+vue的江西旅游网(前后端分离)
    博主主页:猫头鹰源码博主简介:Java领域优质创作者、博客专家、公司架构师、全网粉丝5万+、专注Java技术领域和毕业设计项目实战主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询文末联系获取项目介绍: 本系统为原创项目,以江西旅游为主题,采用前后端分......
  • 基于springboot+vue的商城/体育用品商城/衣服商城系统(前后端分离)
    项目技术:系统使用技术:SpringBoot+SpringDataJpa前端技术:AntDesign、js、css开发工具:idea/vscode数据库:mysql5.7项目介绍:本系统是一个前后端分离的商城系统,适用于课题:前后端分离、商城、体育用品商城、手机商城、服饰商城等各类商城系统,含有详细的数据库设计文档,以及系统介绍,只需......
  • 基于springboot+vue的医院预约系统(前后端分离)
    技术详情: 系统使用技术:springboot+mybatis前端技术:ElementUI、ajax、node.js、js、css开发工具:idea数据库:mysql5.7项目介绍:本系统采用springboot+vue整合开发,前端主要使用了Vue框架、ElementUI和AJAX技术。项目后端主要使用了springboot等一系列框架和MyBatis以及Maven。这一套技......
  • 基于springboot+vue的高校迎新系统(前后端分离)
    博主主页:猫头鹰源码博主简介:Java领域优质创作者、博客专家、公司架构师、全网粉丝5万+、专注Java技术领域和毕业设计项目实战主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询项目介绍: 本系统为2022年11月开发完成,最新原创项目,采用前后端分离,项目......
  • 基于springboot+vue的社区健康码管理系统(前后端分离)
    博主主页:猫头鹰源码博主简介:Java领域优质创作者、博客专家、公司架构师、全网粉丝5万+、专注Java技术领域和毕业设计项目实战主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询文末联系获取项目介绍: 本系统为2022年11月开发完成,采用前后端分离,项目......
  • 基于springboot+vue的电子村务系统(前后端分离)
    博主主页:猫头鹰源码博主简介:Java领域优质创作者、博客专家、公司架构师、全网粉丝5万+、专注Java技术领域和毕业设计项目实战主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询文末联系获取项目介绍: 本系统为原创项目,以电子村务为主题,采用前后端分......