Redis【web应用实践_网页缓存、其他功能(发布与订阅、慢查询 、流水线pipeline)】(四)-全面详解(学习总结---从入门到深化)

 

目录

​编辑

Redis构建web应用实践_网页缓存

创建springboot项目 

选择组件 

编写配置文件 

创建表

 编写持久层

编写业务层

编写控制层

下载压测工具

启动Jmeter工具 

修改语言 

创建压测任务 

 添加HTTP请求

 配置HTT请求

 添加压测结果报告

 没有加缓存的吞吐量

​ 添加Redis缓存

继续压力测试

 Redis配置文件详解

units单位 

 INCLUDES

NETWORK 

GENERAL 

 SNAPSHOTTING

REPLICATION 

SECURITY 

CLIENTS 

 MEMORY MANAGEMENT

APPEND ONLY MODE 

​编辑 LUA SCRIPTING

REDIS CLUSTER 

 Redis其他功能_发布与订阅

什么是发布与订阅 

 什么时候用发布订阅

Redis的发布与订阅 

发布订阅命令行实现 

订阅

 发布命令

Redis其他功能_慢查询 

什么是慢查询 

Redis命令执行的整个过程

什么是慢查询日志 

如何获取慢查询日志 

 如何获取慢查询日志的长度

怎么配置慢查询的参数 

如何进行配置 

查看慢日志配置

 修改Redis配置文件

使用 config set 命令动态修改。 

 Redis其他功能_流水线pipeline

1次网络命令通信模型 

批量网络命令通信模型 

什么是流水线? 

案例展示 

pipeline-Jedis实现 

首先,引入jedis依赖包:

没有pipeline的命令执行

使用pipeline 


Redis构建web应用实践_网页缓存

创建springboot项目 

选择组件 

Lombok

spring mvc

spring data redis

spring data jpa

编写配置文件 

########################################################
### 配置连接池数据库访问配置
########################################################
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://47.104.210.57:3306/zhonglian?
characterEncoding=utf-8&&useSSL=false
spring.datasource.username=root
spring.datasource.password=mytest
# 初始化大小,最小,最大
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
# 配置获取连接等待超时的时间
spring.datasource.maxWait=60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.timeBetweenEvictionRunsMillis=60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
# 打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.filters=stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowS
qlMillis=5000
# 合并多个DruidDataSource的监控数据
#spring.datasource.useGlobalDataSourceStat=true
########################################################
### Java Persistence Api --y
########################################################
# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log for each sql query
spring.jpa.show-sql = true
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
# Naming strategy
#[org.hibernate.cfg.ImprovedNamingStrategy
#org.hibernate.cfg.DefaultNamingStrategy]
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager)
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
########################################################
### 配置连接池数据库访问配置
########################################################
#Redis服务器连接地址
spring.redis.host=192.168.56.31
#Redis服务器连接端口
spring.redis.port=6379
#连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
#连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
#连接池中的最大空闲连接
spring.redis.pool.max-idle=8
#连接池中的最小空闲连接
spring.redis.pool.min-idle=0
#连接超时时间(毫秒)
spring.redis.timeout=30000
logging.pattern.console=%d{MM/dd HH:mm:ss.SSS} %clr(%-5level) --- [%-15thread]
%cyan(%-50logger{50}):%msg%n

创建表

@Data
@Entity
@Table(name = "goods")
public class GoodsEntity {
     //自增ID
     @Id
     @GeneratedValue(strategy=GenerationType.IDENTITY)//自增
     private Long id;
     // 商品名字
     private String goodsName;
     // 订单id
     private String orderId;
     // 商品数量
     private Integer goodsNum;
     // 商品价格
     private Double price;
}

 编写持久层

public interface GoodsRepository extends JpaRepository<GoodsEntity,Long> {
}

编写业务层

@Repository
@Service
public class GoodsService {
      //商品
      @Autowired
      private GoodsRepository goodsRepository;
      /**
       * 根据id获取商品信息
       * @param id
       * @return
       */
      public GoodsEntity getId(Long id){
           //根据id查询商品信息
           Optional<GoodsEntity> goodsEntity = goodsRepository.findById(id);
           if (goodsEntity.isPresent()){
                return goodsEntity.get();
             }else {
                  return null;
            }
      }
}

编写控制层

/**
* 商品控制层
*/
@RequestMapping("/goods")
@RestController
public class GoodsController {
      @Autowired
      private GoodsService goodsService;
      /**
       * 根据id查询商品信息
       * @param id
       * @return
       */
@GetMapping("/getById/{id}")
public GoodsEntity getById(@PathVariable String id){
       return goodsService.getId(Long.valueOf(id));
   }
}

下载压测工具

登录官网Jmeter下载,得到压缩包 jmeter-5.0.zip

启动Jmeter工具 

D:\apache-jmeter-5.4.3\bin\jmeter.bat文件双击运行。

修改语言 

创建压测任务 

 添加HTTP请求

 配置HTT请求

 添加压测结果报告

 没有加缓存的吞吐量

 添加Redis缓存

@Repository
@Service
public class GoodsService {
     //商品
     @Autowired
    private GoodsRepository goodsRepository;
    @Autowired
    private StringRedisTemplate redisTemplate;
    
    /**
     * 根据id获取商品信息
     * @param id
     * @return
     */
    public GoodsEntity getId(Long id){
        // 从Redis中获取缓存
        String goodsStr = redisTemplate.opsForValue().get("goods:id:"+ id);
       // 判断是否有缓存
       if (StringUtils.isEmpty(goodsStr)){
            //根据id查询商品信息
            GoodsEntity goodsEntity = goodsRepository.getById(id);
            //添加缓存
            redisTemplate.opsForValue().set("goods:id:"+ id,JSON.toJSONString(goodsEntity));
            return goodsEntity;
          }else {
             // 把json数据转为goods对象
             return JSON.parseObject(goodsStr,GoodsEntity.class);
         }
     }
}

继续压力测试

 Redis配置文件详解

 在Redis的解压目录下有个很重要的配置文件 redis.conf ,关于Redis的很多功能的配置都在此文件中完 成的,一般为了不破坏安装的文件,出厂默认配置最好不要去改。

units单位 

配置大小单位,开头定义基本度量单位,只支持bytes,大小写不敏感。

 INCLUDES

Redis只有一个配置文件,如果多个人进行开发维护,那么就需要多个这样的配置文件,这时候多个配置 文件就可以在此通过 include /path/to/local.conf 配置进来,而原本的 redis.conf 配置文件就作为一个总闸。 

NETWORK 

GENERAL 

 ​​​​​

 SNAPSHOTTING

这里的配置主要用来做持久化操作。

REPLICATION 

SECURITY 

requirepass:设置redis连接密码。

比如: requirepass 123 表示redis的连接密码为123。 

CLIENTS 

 MEMORY MANAGEMENT

APPEND ONLY MODE 

 LUA SCRIPTING

参数:

lua-time-limit:一个lua脚本执行的最大时间,单位为ms。默认值为5000. 

REDIS CLUSTER 

 

实时学习反馈

1. Redis核心配置文件中修改那个参数可以开启远程连接。

A bind

B network

C clients

D units

2. Redis核心配置文件中如何修改Redis的端口号。

A bind

B network

C port

D units

 Redis其他功能_发布与订阅

什么是发布与订阅 

Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。

 什么时候用发布订阅

看到发布订阅的特性,用来做一个简单的实时聊天系统再适合不过了。再比如,在一个博客网站中,有 100个粉丝订阅了你,当你发布新文章,就可以推送消息给粉丝们拉。

Redis的发布与订阅 

发布订阅命令行实现 

订阅

语法格式:

subcribe 主题名字

示例:

127.0.0.1:6379> SUBSCRIBE channel-1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel-1"
3) (integer) 1

 发布命令

语法格式:

publish channel-1 hello

示例:打开另一个客户端,给channel1发布消息hello

127.0.0.1:6379> PUBLISH channel-1 hello
(integer) 1

打开第一个客户端可以看到发送的消息

127.0.0.1:6379> SUBSCRIBE channel-1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel-1"
3) (integer) 1
1) "message"
2) "channel-1"
3) "hello"

 

实时学习反馈

1. Redis技术中如何订阅一个主题。

A add

B publish

C subscribe

D participation

Redis其他功能_慢查询 

什么是慢查询 

慢查询,顾名思义就是比较慢的查询,但是究竟是哪里慢呢?

Redis命令执行的整个过程

 

什么是慢查询日志 

慢查询日志是Redis服务端在命令执行前后计算每条命令的执行时长,当超过某个阈值是记录下来的日志。日志中记录了慢查询发生的时间,还有执行时长、具体什么命令等信息,它可以用来帮助开发和运维人员定位系统中存在的慢查询。

如何获取慢查询日志 

可以使用 slowlog get 命令获取慢查询日志,在 slowlog get 后面还可以加一个数字,用于指定获取 慢查询日志的条数,比如,获取3条慢查询日志:

127.0.0.1:6379> SLOWLOG get 3
1) 1) (integer) 0
2) (integer) 1640056567
3) (integer) 11780
4) 1) "FLUSHALL"
5) "127.0.0.1:43406"
6) ""

 如何获取慢查询日志的长度

可以使用 slowlog len 命令获取慢查询日志的长度。

> slowlog len
(integer) 121

 

怎么配置慢查询的参数 

如何进行配置 

查看慢日志配置

查看redis慢日志配置,登陆redis服务器,使用redis-cli客户端连接redis server

127.0.0.1:6379> config get slow*
1) "slowlog-max-len"
2) "128"
3) "slowlog-log-slower-than"
4) "10000"

 修改Redis配置文件

比如,把slowlog-log-slower-than设置为1000,slowlog-max-len设置为1200:

slowlog-log-slower-than 1000
slowlog-max-len 1200

使用 config set 命令动态修改。 

 比如,还是把slowlog-log-slower-than设置为1000,slowlog-max-len设置为1200:

> config set slowlog-log-slower-than 1000
OK
> config set slowlog-max-len 1200
OK
> config rewrite
OK

实时学习反馈

1. Redis技术中慢查询主要作用_____。

A 提高响应速度

B 提高查询速度

C 定位系统存在的慢操作

D 增强系统稳定性

2. Redis慢查询技术中通过修改_____预设阈值。

A slowlog get

B slowlog-log-slower-than

C slowlog len

D slowlog reset

 Redis其他功能_流水线pipeline

1次网络命令通信模型 

 

 经历了1次时间 = 1次网络时间 + 1次命令时间。

批量网络命令通信模型 

什么是流水线? 

案例展示 

从北京到上海的一条命令的生命周期有多长?

执行一条命令在redis端可能需要几百微秒,而在网络光纤中传输只花费了13毫秒。

pipeline-Jedis实现 

首先,引入jedis依赖包:

<dependency>
     <groupId>redis.clients</groupId>
     <artifactId>jedis</artifactId>
     <version>2.9.0</version>
</dependency>

没有pipeline的命令执行

Jedis jedis - new Jedis("127.0.0.1",6379);
      for ( int i = 0 ; i < 10000 ; i ++ ){
         jedis.hset("hashkey:" + i , "field" + i , "value" + i);
}

使用pipeline 

Jedis jedis = new Jedis("127.0.0.1",6379);
     for ( int i = 0; i < 100 ; i++) {
         Pipeline pipeline = jedis.ppipelined();
         for (int j = i * 100 ; j < (i + 1) * 100 ; j++) {
              pipeline.hset("hashkey:" + j,"field" + j, "value" + j);
      }
    pipeline.syncAndReturnAll();
}

实时学习反馈

1. Redis技术中Pipeline主要作用是。

A 提高消息传递速度

B 加快命令的执行速度

C 网络中传递的命令的安全性

D 减少了网络时间的开销

猜你喜欢

转载自blog.csdn.net/m0_58719994/article/details/131360841