Springboot整合Redis,高并发下访问缓存与写入缓存

1、配置Redis连接:添加pox.xml依赖:

<!-- redis -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
		<!-- 通用池 -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-pool2</artifactId>
		</dependency>

2,application.yml

server:
  port: 8989
spring:
  datasource:
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    #连接本地数据库
    url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC

  redis:
    host: 127.0.0.1
    timeout: 1000
    jedis:
      pool:
        min-idle: 5
        max-idle: 10
        max-wait: -1

mybatis-plus:
  # mapper.xml 文件扫描
  mapper-locations: classpath*:/mapper/*.xml
  configuration:
    map-underscore-to-camel-case: true

# 日志配置
logging:
  level:
    com.xxx.xxx: debug
    org.springframework: warn

对Redis生成的key,value进行数据格式转换一下:工具类 RedisConfig

/**
 * 设定redis返回的展示格式
 */
@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
        RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);

        //指定key,value的序列化方式
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

3,生成MVC基础结构:《简单利用mybatis-plus代码生成》

mybatis-plus代码生成器实现规则《超详细》_@小杨爱偷懒的博客-CSDN博客一.在pox添加所需的依赖: <!--mybatis-plus依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.3.1</version></dependency><!--https://blog.csdn.net/f234344435/article/details/124494196?spm=1001.2014.3001.5502

4,为什么需要MySQL数据库表?

 这就需要说说Redis的作用:

在实际开发中,企业为了减小关系型数据库(MySQL为例)的访问压力,防止因为访问量过大(高并发情况下)导致数据库罢机情况,我们就引入Redis(非关系型数据库)通过键key--对value的方式来进行数据缓存一份在Redis数据,这样当用户第一访问MySQL数据库时,通过把访问的数据缓存在Redis中,当下一次访问同样的数据时就会直接访问Redis数据库缓存的数据,从而减小了MySQL数据库的压力,也大大提高了查询数据,同样也提高了安全性

所以现在的查询的步骤是什么呢:

1.先查询Redis数据库看看访问的数据是否在Redis数据库有缓存,有缓存直接返回缓存的数据,没有缓存的情况,查询MySQL数据库,把查询的数据写入到Redis中缓存备份数据;

2.这里面就涉及到查询数据的判断:先判断Redis缓存是否有数据,没有就通过MySQL查询出来的数据写入

5,数据库表:

CREATE TABLE `redis_cs` (
  `id` int NOT NULL AUTO_INCREMENT,
  `user_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `password` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb3;

6,RedisCsController层的编写

通过前端传递id查询数据:

@RestController
@RequestMapping("/redis-cs")
public class RedisCsController {
    //redis基类
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private RedisCsService redisCsService;

   
    @GetMapping("getById/{id}")
    public Object getById(@PathVariable("id")Integer id){
        //创建一个线程来模拟高并发情况
        ExecutorService es = Executors.newFixedThreadPool(200);
        for (int i = 0; i <300; i++) {
            es.submit(new Runnable() {
                @Override
                public void run() {
                    redisCsService.findById(id);
                }
            });
        }
        Object obj =  redisCsService.findById(id);
        return R.ok().data("obj",obj);
    }

}

7,RedisCsService方法:

public interface RedisCsService extends IService<RedisCs> {

    Object findById(Integer id);
}

8.RedisCsServiceImpl实现类:

@Service
@Slf4j
public class RedisCsServiceImpl extends ServiceImpl<RedisCsMapper, RedisCs> implements RedisCsService {

    @Autowired
    private RedisCsMapper redisCsMapper;
    @Autowired
    private RedisUtils redisUtils;
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public Object findById(Integer id) {
        //创建key的展示形式
        String key = "user:" + id;
        //先查询Redis缓存
        Object userObj = redisTemplate.opsForValue().get(key);
        if (userObj == null) {
            //多线程同步数据
            synchronized (this.getClass()) {
                //再查一次缓存,防止查询数据有延迟
                userObj = redisTemplate.opsForValue().get(key);
                if (userObj==null){
                    log.debug("====查询数据库====");
                    //缓存没有数据,查询MySQL数据库里面的数据
                    RedisCs redisCs = baseMapper.selectById(id);
                    //帮MySQL查询出来的数据返回的同时,把数据写入到Redis进行缓存
                    redisTemplate.opsForValue().set(key,redisCs);
                    return redisCs;
                }else {
                    log.debug("====查询缓存(同步代码块)====");
                    return userObj;
                }
            }
        }else {
            log.debug("====查询缓存====");
        }
       return userObj;
    }

}

 现在Redis数据是没有缓存数据的情况:

 通过Postman测试一下看看后端打印的日志:

postman成功返回了数据,看看后端的情况:

首先分析一下:因为现在我们Redis没有数据缓存的情况下访,那么会先查询数据,因为我们并发了300次,展示的结果应该是只能查询一次MySQL数据库,接下来的299次都应该查询缓存;

看看返回结果吧:

 

 这就是最常见高并发情况下访问数据的实现:接下来看看有缓存数据的情况下吧:

 现在Redis已经有了缓存:我们在访问ID=1 看看后端是否查询了缓存:要是查询了数据库那我们这个程序就是个错误的程序:

 

 会看见现在我们的程序300并发的情况并没有访问数据库:这就是Redis缓存高并发情况下的数据查询,减小MySQL访问数据压力的实现,大大的提高了效率

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot集成Redis可以使用Spring Data RedisSpring Data RedisSpring Data的一部分,它提供了对Redis的支持,包括对Redis的连接、操作、数据序列化等。 以下是使用Spring Boot集成Redis缓存的步骤: 1. 添加Spring Data RedisRedis客户端依赖 在Maven中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> ``` 2. 配置Redis连接信息 在application.properties中添加以下配置: ```properties spring.redis.host=localhost spring.redis.port=6379 ``` 3. 配置Redis缓存管理器 在Java配置类中添加以下代码: ```java @Configuration @EnableCaching public class CacheConfig { @Bean public RedisConnectionFactory redisConnectionFactory() { return new JedisConnectionFactory(); } @Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory()); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return redisTemplate; } @Bean public CacheManager cacheManager() { RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate()); cacheManager.setDefaultExpiration(600); return cacheManager; } } ``` 4. 在需要缓存的方法上添加@Cacheable注解 例如: ```java @Service public class UserService { @Autowired private UserRepository userRepository; @Cacheable(value = "userCache", key = "#id") public User getUserById(Long id) { Optional<User> optionalUser = userRepository.findById(id); return optionalUser.orElse(null); } } ``` @Cacheable注解会将方法的返回值缓存Redis中,value属性指定缓存的名称,key属性指定缓存的键。 以上就是使用Spring Boot集成Redis缓存的步骤。注意,这里使用了默认的Redis连接工厂和Redis模板,如果需要更多的定制化配置,可以参考Spring Data Redis文档进行设置。 ### 回答2: Spring Boot 是一个用于快速构建 Java 应用程序的开源框架。它简化了基于 Spring 框架的应用程序的创建和配置过程。而 Redis 是一种快速且高效的内存数据库,用于存储和检索数据。 在 Spring Boot 中使用 Redis 缓存可以提高应用程序的性能和响应速度。要使用 Redis 缓存,首先需要在项目的依赖中添加 Redis 相关的依赖项。然后,在应用程序的配置文件中配置 Redis 的连接信息,包括主机名、端口号、密码等。 一旦配置完成,就可以在应用程序中使用 @Cacheable 注解将方法标记为可缓存的。当调用被标记为缓存的方法时,Spring Boot 会首先检查缓存中是否已经存在该数据,如果存在则直接返回缓存中的数据,否则执行方法并将结果存入缓存。可以使用 @CacheEvict 注解来清除缓存中的数据,以便在数据发生变化时及时更新缓存。 使用 Redis 缓存还可以有其他一些高级特性,例如设置缓存的过期时间、使用不同的缓存键生成策略等。还可以通过配置 Redis 集群实现高可用和负载均衡。 总而言之,Spring Boot 提供了简单而强大的工具来集成 Redis 缓存,通过使用 Redis 缓存可以提高应用程序的性能和可伸缩性,减轻后端数据库的负载,从而提供更好的用户体验。 ### 回答3: Spring Boot使用Redis作为缓存的步骤如下: 1. 导入Redis依赖:在pom.xml文件中添加Spring BootRedis的依赖。 2. 配置Redis连接信息:在application.properties或application.yml文件中配置Redis的连接信息,包括主机名、端口号、密码等。 3. 创建RedisTemplate Bean:在Spring Boot的配置类中创建RedisTemplate Bean,用于操作Redis数据库。 4. 使用RedisTemplate进行缓存操作:在需要使用缓存的方法上添加注解@EnableCaching,然后在方法执行时,使用RedisTemplate进行缓存的读取和写入操作。 5. 添加缓存注解:在需要进行缓存的方法上添加注解@Cacheable,用于标记此方法的结果需要被缓存。可以通过设置缓存的key,来定制不同参数下的缓存策略。 6. 清除缓存:在需要清除缓存的方法上添加注解@CacheEvict,用于标记此方法执行后需要清除缓存。 通过以上步骤,Spring Boot就可以和Redis进行连接,并使用Redis作为缓存来提高应用程序的性能。在缓存读取时,先从Redis中获取数据,如果Redis中不存在,则从数据库中读取,然后将读取到的数据写入Redis中;在缓存写入时,先将数据写入Redis中,再同步写入数据库。这样可以大大提高读取数据的速度,并减轻数据库的压力。同时,Spring Boot提供了灵活的缓存策略配置,可以根据业务需求来定制缓存的命中规则和过期时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值