【Redis】(一)SpringBoot 整合Redis缓存并使用Postman+JMeter进行性能测试

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 【Redis】(一)SpringBoot 整合Redis缓存并使用Postman+JMeter进行性能测试

文章目录


1、SpringBoot 整合 Redis

2、Docker中启动MySQL、Redis

3、Postman测试分页的接口


4、JMeter压力测试

1. 设置线程组

2. 设置测试 HTTP请求

3. 设置测试随机数

4. 测试结果


1、SpringBoot 整合 Redis


Redis是一种高性能的非关系型数据库。Redis作用在内存,性能极高。Spring Boot同样可以把Redis整合到项目里。


打开IDEA ,创建一个新的项目,勾选本次demo中用到的Redis、MySQL相关依赖。


image.png


第一步就是为项目添加Redis依赖。在SpringBoot下有spring-boot-starter-data-redis,使用Redis就相当的简单,可以看到pom.xml文件中已经成功出现。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

     

第二步添加上Redis配置信息。包括Redis服务器的IP、端口、密码等信息,前提是已经安装好Redis服务,密码等信息必须和服务器一致。


我们这里配置的Redis都是在Docker容器中的,application.yml内容如下所示。

server:
  port: 9000
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://192.168.56.100:3306/shoppings
    username: root
    password: ok
  redis:
    database: 0
    host: 192.168.56.100
    port: 6379
    password:


第三步,接下来就要写例子来使用使用Redis,在这个例子中使用的是框架封装Redis的类StringRedisTemplate。为啥用这个呢?,因为例子设计的k-v都是String类型,官方建议符合这种格式的推荐使用 StringRedisTemplate。当k-v是非String类型的object时,推荐使用RedisTemplate。services 层 Goodservices.java 如下所示,实体类 Goods,dao 层 GoodsDAO 很简单就不附上了。


通过saveRedis方法进行数据转化,将MySQL数据库中内容转到Redis数据库中,注意这里执行过一次之后通过findRedisData方法实现分页。

package com.kgc.msrd.services;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.kgc.msrd.dao.GoodsDAO;
import com.kgc.msrd.entity.Goods;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class Goodsservice {
    @Autowired
    private GoodsDAO goodsDAO;
    @Autowired
    private StringRedisTemplate redisTemplate;
    public List<Goods> findAll(int pg){
        return goodsDAO.findAll((pg-1)*20);
    }
    /*数据转化 mysql数据库中内容转到redis数据库中,当数据成功转出后这段代码便可以注去*/
    public void saveRedis(){
//        List<String> res=new ArrayList<String>();
//        List<Goods> goods=findAll();
//        ObjectMapper om=new ObjectMapper();
//        for(Goods gd:goods){
//            try {
//                res.add(om.writeValueAsString(gd));
//            } catch (JsonProcessingException e) {
//                e.printStackTrace();
//            }
//        }
//        redisTemplate.opsForList().leftPushAll("good",res);
    }
    public List<String> findRedisData(int pg){
        return redisTemplate.opsForList().range("good",(pg-1)*20,pg*20-1);
    }
}


controller层 InitCtrl

package com.kgc.msrd.controller;
import com.kgc.msrd.entity.Goods;
import com.kgc.msrd.services.Goodsservice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class InitCtrl {
    @Autowired
    private Goodsservice goodsservice;
    @RequestMapping("/mysql")
    public List<Goods> init(int pg){
        return goodsservice.findAll(pg);
    }
/*    @RequestMapping("/save")
    public String save(){
        goodsservice.saveRedis();
        return "ok";
    }*/
    @RequestMapping("/redis")
    public List<String> rd(int pg){
        return goodsservice.findRedisData(pg);
    }
}


package com.kgc.msrd;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.kgc.msrd.dao")
public class MsrdApplication {
    public static void main(String[] args) {
        SpringApplication.run(MsrdApplication.class, args);
    }
}


2、Docker中启动MySQL、Redis


每一次登录,我们先要重启网络、重启容器

systemctl restart network
systemctl restart docker


在Xshell 6 Docker上使用命令,进入Redis

[root@zj ~]# docker start redis
redis
[root@zj ~]# docker exec -it redis /bin/bash
root@4e6d4e0082e8:/data# redis-cli -h localhost


3、Postman测试分页的接口


接下来使用postman进行接口测试。


Postman的使用可以参考这篇教程:接口测试工具Postman接口测试图文教程


image.png

image.png


可以看到,我们对数据进行了分页,之前代码中,我们对数据分了20页,这时使用http://localhost:9000/redis?pg=4我们可以成功查询到第五页的数据。


4、JMeter压力测试


1. 设置线程组


image.png


2. 设置测试 HTTP请求


image.png


3. 设置测试随机数


image.png


4. 测试结果


通过压力测试,比较MySQL与Redis的性能,并进行分析。当数据量很庞大时,很明显看出Redis缓存服务器极高的性能。


image.png

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
3天前
|
消息中间件 缓存 NoSQL
Redis经典问题:缓存雪崩
本文介绍了Redis缓存雪崩问题及其解决方案。缓存雪崩是指大量缓存同一时间失效,导致请求涌入数据库,可能造成系统崩溃。解决方法包括:1) 使用Redis主从复制和哨兵机制提高高可用性;2) 结合本地ehcache缓存和Hystrix限流降级策略;3) 设置随机过期时间避免同一时刻大量缓存失效;4) 使用缓存标记策略,在标记失效时更新数据缓存;5) 实施多级缓存策略,如一级缓存失效时由二级缓存更新;6) 通过第三方插件如RocketMQ自动更新缓存。这些策略有助于保障系统的稳定运行。
106 1
|
1天前
|
缓存 NoSQL 安全
Redis经典问题:缓存击穿
本文探讨了高并发系统中Redis缓存击穿的问题及其解决方案。缓存击穿指大量请求同一未缓存数据,导致数据库压力过大。为解决此问题,可以采取以下策略:1) 热点数据永不过期,启动时加载并定期异步刷新;2) 写操作加互斥锁,保证并发安全并设置查询失败返回默认值;3) 预期热点数据直接加缓存,系统启动时加载并设定合理过期时间;4) 手动操作热点数据上下线,通过界面控制缓存刷新。这些方法能有效增强系统稳定性和响应速度。
24 0
|
2天前
|
缓存 NoSQL 应用服务中间件
Redis多级缓存
Redis多级缓存
8 0
|
2天前
|
缓存 NoSQL 关系型数据库
Redis 缓存 一致性
Redis 缓存 一致性
6 0
|
2天前
|
缓存 监控 NoSQL
Redis经典问题:缓存穿透
本文介绍了缓存穿透问题在分布式系统和缓存应用中的严重性,当请求的数据在缓存和数据库都不存在时,可能导致数据库崩溃。为解决此问题,提出了五种策略:接口层增加校验、缓存空值、使用布隆过滤器、数据库查询优化和加强监控报警机制。通过这些方法,可以有效缓解缓存穿透对系统稳定性的影响。
56 3
|
3天前
|
JSON NoSQL Java
深入浅出Redis(十三):SpringBoot整合Redis客户端
深入浅出Redis(十三):SpringBoot整合Redis客户端
|
3天前
|
缓存 NoSQL 搜索推荐
Redis缓存雪崩穿透等解决方案
本文讨论了缓存使用中可能出现的问题及其解决方案。首先,缓存穿透是指查询数据库中不存在的数据,导致请求频繁到达数据库。解决方法包括数据校验、缓存空值和使用BloomFilter。其次,缓存击穿是大量请求同一失效缓存项,可采取监控、限流或加锁策略。再者,缓存雪崩是大量缓存同时失效,引发数据库压力。应对措施是避免同一失效时间,分散缓存过期。接着,文章介绍了Spring Boot中Redis缓存的配置,包括缓存null值以防止穿透,并展示了自定义缓存过期时间的实现,以避免雪崩效应。最后,提供了在`application.yml`中配置不同缓存项的个性化过期时间的方法。
|
6月前
|
缓存 NoSQL 安全
Redis缓存雪崩、击穿、穿透解释及解决方法,缓存预热,布隆过滤器 ,互斥锁
Redis缓存雪崩、击穿、穿透解释及解决方法,缓存预热,布隆过滤器 ,互斥锁
190 5
|
7月前
|
缓存 NoSQL 数据库
Redis学习笔记-如何应对缓存雪崩、击穿、穿透
Redis学习笔记-如何应对缓存雪崩、击穿、穿透
38 0
|
存储 缓存 NoSQL
Redis --- 缓存雪崩、击穿、穿透与数据库缓存双一致性
Redis --- 缓存雪崩、击穿、穿透与数据库缓存双一致性
Redis --- 缓存雪崩、击穿、穿透与数据库缓存双一致性

热门文章

最新文章