`

SpringBoot集成Redis来实现缓存技术方案

 
阅读更多

摘要: 在我们的日常项目开发过程中缓存是无处不在的,因为它可以极大的提高系统的访问速度,关于缓存的框架也种类繁多,今天主要介绍的是使用现在非常流行的NoSQL数据库(Redis)来实现我们的缓存需求。

概述
在我们的日常项目开发过程中缓存是无处不在的,因为它可以极大的提高系统的访问速度,关于缓存的框架也种类繁多,今天主要介绍的是使用现在非常流行的NoSQL数据库(Redis)来实现我们的缓存需求。

Redis简介
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件,Redis 的优势包括它的速度、支持丰富的数据类型、操作原子性,以及它的通用性。

案例整合
本案例是在之前一篇SpringBoot + Mybatis + RESTful的基础上来集成Redis的,所以大家如有什么不明白的地方可以前往https://my.oschina.net/feinik/blog/879266,由于篇幅原因这里不一一贴出所有的代码,具体完整案例代码可以看这里:https://github.com/AIFEINIK/SpringBoot-Learn/tree/master/spring-boot-redis2,关于Redis如何安装可自行google。

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

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

2、SpringBoot配置文件中配置Redis连接(YAML方式配置)

spring:
    application:
        name: spring-boot-redis
    redis:
        host: 192.168.145.132
        port: 6379
        timeout: 20000
        cluster:
            nodes: 192.168.211.134:7000,192.168.211.134:7001,192.168.211.134:7002
            maxRedirects: 6
        pool:
            max-active: 8
            min-idle: 0
            max-idle: 8
            max-wait: -1

解释:本配置采用Redis一主三从的的配置方式来提高缓存的吞吐量

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);
      mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
      serializer.setObjectMapper(mapper);

      template.setValueSerializer(serializer);
      //使用StringRedisSerializer来序列化和反序列化redis的key值
      template.setKeySerializer(new StringRedisSerializer());
      template.afterPropertiesSet();
      return template;
   }
}

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

4、Service层应用缓存(注解方式)

@Service
public class PersonService {

    @Autowired
    private PersonRepo personRepo;

   /**
     * @Cacheable 应用到读取数据的方法上,先从缓存中读取,如果没有再从DB获取数据,然后把数据添加到缓存中
    * unless 表示条件表达式成立的话不放入缓存
     * @param username
     * @return
     */
    @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。

5、数据访问资源类

@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("系统错误!");
    }
}

6、通过postman工具来测试缓存是否生效

第一次访问查找用户:

第一次通过用户名称来查找用户可以看到是从库中查询的数据,我们可以通过RedisClient工具来查看数据已放入了缓存

第二次查找用户:发现服务端并未打印任何数据库查询日志,可以知道第二次查询是从缓存中查询得到的数据。

分享到:
评论

相关推荐

    springboot整合redis集群零配置

    首先,让我们来看看"Springboot整合Redis集群,零配置方式"。在Spring Boot中,我们可以通过引入`spring-boot-starter-data-redis`依赖来启用Redis支持。但是,要配置Redis集群,通常需要设置多个节点地址、密码、...

    Springboot加Redis缓存实现

    总的来说,"Springboot加Redis缓存实现"项目展示了如何在Spring Boot应用中集成并使用Redis作为缓存系统,提高了数据读取效率,同时也提供了数据库操作和API测试的全套方案。理解并掌握这个项目中的知识点,对于开发...

    Springboot+redis集成

    SpringBoot与Redis的集成是现代Java开发中常见的一种技术组合,尤其在高并发、分布式场景下,它们的应用广泛且高效。SpringBoot简化了Spring应用程序的配置和管理,而Redis则作为一个高性能的键值数据存储系统,常...

    SpringBoot 整合 Redis、mybatis 完整项目源码下载

    4. **Redis缓存配置**: 可以使用`@Cacheable`、`@CacheEvict`、`@CachePut`等注解实现方法级缓存,提升应用性能。 5. **RedisUtil工具类**: 封装通用的Redis操作,如设置、获取、删除键值对等,便于代码复用和管理...

    springboot-redis缓存+分布锁

    3. **SpringBoot集成Redis** 集成SpringBoot与Redis的过程主要包括以下步骤: - 添加依赖:在`pom.xml`中引入Spring Data Redis依赖。 - 配置Redis:在`application.properties`或`application.yml`中配置Redis...

    SpringBoot项目 MybatisPlus使用 Redis缓存.zip

    本项目中,我们看到“SpringBoot项目 MybatisPlus使用 Redis缓存.zip”主要涉及了SpringBoot、MybatisPlus和Redis三个核心组件,它们在实际开发中扮演着重要角色。 首先,SpringBoot是Spring框架的一种简化版,它...

    SpringBoot + Redis实现事件的发布订阅功能

    1. **集成Redis** - 在`pom.xml`中添加Spring Data Redis和Jedis客户端的依赖。 - 配置`application.yml`或`application.properties`,包括Redis服务器的地址、端口、密码等信息。 2. **创建RedisTemplate Bean**...

    springboot+redis+token保持登录

    在现代Web应用开发中,保持用户登录状态是一个常见的需求,"springboot+redis+token保持登录"的主题就涉及到了如何利用Spring Boot、Redis以及Token技术来实现这一功能。本文将详细探讨这一技术栈的实现原理和步骤。...

    vue+springboot+redis+kaptcha实现登录验证码

    本教程将介绍如何结合Vue.js前端框架、Spring Boot后端框架、Redis缓存服务以及Kaptcha验证码技术,实现一个前后端分离的登录页面验证码功能。这个组合可以提供高效、安全且用户友好的验证机制。 首先,Vue.js是一...

    SpringBoot+redis+RabbitMq整合实例

    在IT行业中,Spring Boot、Redis和RabbitMQ是三个非常重要的技术组件,它们分别用于简化Java应用程序开发、数据缓存和消息队列处理。本文将详细介绍如何将这三者整合在一起,以构建一个高效、可扩展的应用系统。 ...

    myredis_redis_springboot_springboot+Redis_DEMO_

    在本项目"Myredis_redis_springboot_springboot+Redis_DEMO_"中,主要涉及的是SpringBoot框架与Redis数据库的...通过学习这个DEMO,开发者可以迅速掌握SpringBoot集成Redis的关键技术,提升其在实际开发中的应用能力。

    springboot + redis 整合 maven项目源码

    Spring Boot通过其自动配置特性使得集成Redis变得简单。在`pom.xml`文件中,我们需要添加Spring Data Redis和Spring Boot对Redis支持的相关依赖。这些依赖包括`spring-boot-starter-data-redis`,它包含了Spring ...

    springboot+redis实现查询附近商铺功能.zip

    在本项目"springboot+redis实现查询附近商铺功能.zip"中,主要展示了如何利用Spring Boot框架结合Redis缓存系统来实现在web应用中查询附近的商业店铺。以下将详细阐述涉及的关键知识点: 1. **Spring Boot**: ...

    基于SpringBoot+Redis实现的仿QQ伪桌面聊天系统.zip

    这个毕业设计项目旨在模仿QQ的桌面聊天功能,通过使用SpringBoot作为后端开发框架,Redis作为缓存和消息队列,实现了一个基本的即时通讯系统。 首先,SpringBoot是Spring框架的一个轻量级版本,它简化了创建独立的...

    springboot与redis整合

    - **使用Redis缓存**:可以利用`@Cacheable`、`@CacheEvict`、`@CachePut`等注解实现方法级别的缓存管理,提高应用性能。 - **ReactiveRedisTemplate**:如果使用的是SpringBoot 2.x及以上版本,还可以利用响应式...

    springboot-redis事务

    在SpringBoot中集成Redis,我们通常会使用`spring-boot-starter-data-redis`依赖,它包含了连接Redis的 lettuce 或 jedis 客户端。在application.properties或yaml配置文件中,我们需要设置Redis的主机地址、端口、...

    springboot集成redis ,mybatis

    首先,让我们详细探讨SpringBoot集成MyBatis。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。在SpringBoot中集成MyBatis,我们通常会创建一个配置类,配置数据源、SqlSessionFactory和...

    springboot+redis单机与集群

    Spring Boot简化了Spring框架的使用,提供了开箱即用的功能,而Redis则是一个高性能的内存数据存储系统,常用于缓存、消息队列和数据结构服务器。 首先,让我们深入理解Spring Boot。Spring Boot是由Pivotal团队...

    SpringBoot集成Redis缓存在电信运营系统中的应用研究.docx

    ### SpringBoot集成Redis缓存在电信运营系统中的应用研究 #### 摘要 随着移动互联网的发展,电信运营商与各大互联网企业联手推出了多种针对不同消费群体的定制化服务套餐,这不仅吸引了大量的用户群体,同时也使得...

Global site tag (gtag.js) - Google Analytics