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

news2025/1/13 2:43:36

 

目录

​编辑

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 减少了网络时间的开销

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/679564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【java爬虫】selenium+browsermob入门实战

在爬虫领域&#xff0c;selenium几乎是最无所不能的一个框架了&#xff0c;在传统的爬虫无能为力的时候&#xff0c;我们可以使用selenium来请求动态页面获取信息。 当然&#xff0c;只有selenium还是不够的&#xff0c;因为使用selenium我们只能获取页面上展示的数据&#xf…

Linux驱动入门(四)——内核进程管理

文章目录 前言进程进程描述符及任务结构分配进程描述符进程描述符的存放进程状态设置当前进程状态进程上下文进程家族树 进程创建写时拷贝fork()vfork() 线程在Linux中的实现创建线程内核线程 进程终结删除进程描述符孤儿进程造成的进退维谷 总结 前言 进程是Unix操作系统抽象…

Vue--》Vue3打造可扩展的项目管理系统后台的完整指南(七)

今天开始使用 vue3 ts 搭建一个项目管理的后台&#xff0c;因为文章会将项目的每一个地方代码的书写都会讲解到&#xff0c;所以本项目会分成好几篇文章进行讲解&#xff0c;我会在最后一篇文章中会将项目代码开源到我的GithHub上&#xff0c;大家可以自行去进行下载运行&…

驱动开发:摘除InlineHook内核钩子

在笔者上一篇文章《驱动开发&#xff1a;内核层InlineHook挂钩函数》中介绍了通过替换函数头部代码的方式实现Hook挂钩&#xff0c;对于ARK工具来说实现扫描与摘除InlineHook钩子也是最基本的功能&#xff0c;此类功能的实现一般可在应用层进行&#xff0c;而驱动层只需要保留一…

idea如何使用git指令

&#xff08;1&#xff09;、打开setting,直接搜git (2)、点一下text 如果显示成功就不用管了&#xff0c;但如果失败就要重新设置一下目录&#xff1a; &#xff08;3&#xff09;、找到自己设置gitee ssh目录&#xff1a; 这里我们是不需要用.git对.idea进行管理的&#xff…

vue3原理和源码分析 - VirtualDOM和DOMDIFF

目录 VUE3的h/createVNode函数【vue的概念模型】 Virtual DOM&#xff08;组件化的概念模型&#xff09; VirtualDOM更新 WHY DOM-DIFF&#xff1f; DOM-DIFF原理 DOM-DIFF伪代码 DOM-DIFF分类讨论&#xff1a;属性变更 DOM-DIFF分类讨论&#xff1a;节点类型不同 DOM-…

正负整数小数在内存的存储

目录 补码引入 整数在内存的存储 小数十进制与二进制相互转化 小数的内存存储 本节会主要学习正负的整数小数在内存的存储方式 补码引入 补码在计算机有着重要的地位&#xff0c;计算机本身只能完成的加法&#xff0c;移位运算&#xff0c;减法&#xff0c;乘法&#xff0…

深入解析多人共享云盘:便捷文件协作与分享的全新模式

在当今数字化时代&#xff0c;云盘已成为许多人存储和共享文件的首选方式。但是&#xff0c;传统的个人云盘服务在多人协作方面存在一些限制。为了解决这个问题&#xff0c;多人共享云盘应运而生。什么是多人共享云盘&#xff1f; 多人共享云盘是一种允许多个用户同时访问、编辑…

【数据库六】存储过程

存储过程 1.存储过程概述1.1 存储过程定义1.2 存储过程优点1.3 创建存储过程 2. 存储过程参数2.1 输入参数2.2 输出参数2.3 输入输出参数2.4 存储过程参数总结 3. 删除存储过程4.存储过程的控制语句4.1 条件语句if --else4.2 循环语句4.3 存储过程控制语句总结 1.存储过程概述 …

Qt 实现SQLite全部语法(增删改查、内置函数、高级语法)

Qt 实现SQLite全部语法 【1】SQLite Qt界面设计【2】SQLite Qt数据库创建、打开、关闭、删除【3】SQLite Qt表格的创建【4】SQLite Qt表格的插入【5】SQLite Qt表格的查询【6】SQLite Qt表格的删除【7】SQLite Qt表格的更新【8】SQLite Qt表格的结构【9】SQLite Qt表格的修改【…

Python 教程:从零到大师

首先, 什么是Python? 用python作者Guido van Rossum自己的话来说&#xff0c;Python是这样的一门语言&#xff1a; "它是一门高级编程语言, 它的核心设计理念是让所有代码变得更易阅读&#xff0c;并给开发者们提供一种“仅仅几行代码就能编写编程逻辑”的语法。 那么&am…

SD/StableDiffusion部署图文教程,ai绘画教程,实现谷歌云端零成本部署,中文UI

目录 一、前言 二、准备前提 三、教程说明 四、开始搭建 1、第一步&#xff0c;下载ipynb脚本文件 2、第二步&#xff0c;上传一键脚本文件到谷歌云盘 3、选择该.ipynb文件--右键--打开方式--关联更多应用 4、输入框搜索Colaboratory找到该应用&#xff0c;安装 5、安…

【瑞萨RA6系列】RASC+Keil开发环境搭建和GPIO点灯指南

瑞萨RASCKeil开发环境搭建 一、简单开箱二、资料下载三、芯片简介四、开发环境搭建4.1 安装RASC4.2 安装Keil MDK4.3 安装RA6E1的MDK支持包 五、GPIO点灯指南5.1 创建RASC项目5.2 查阅开发板原理图5.3 设置LED1引脚为输出3.4 编写LED1闪烁的代码5.5 编译Keil项目5.6 修改Keil调…

产品设计.B端设计师不可忽视的产品和用户

B端产品与C端产品不同&#xff0c;前者强调客户价值&#xff0c;企业决策链路长&#xff0c;用户难获得的同时也相对难流失。而作为B端产品设计师&#xff0c;就需要根据B端产品业务特点&#xff0c;从用户、产品等角度进行考量&#xff0c;以求做出符合市场和用户的设计方案。…

【HTTP 协议】

一、HTTP 协议简介 在真实的网络环境中采用 TCP/IP 五层网络传输模型这样的结构传输. 物理层 -> 数据链路层 -> 网络层 -> 传输层 -> 应用层 1. 应用层: 应用层是模型的最顶层&#xff0c;它为用户提供了一种与网络进行通信的方法。应用层包含了各种应用程序&…

【Linux基础及shell脚本】在VMware16中安装CentOS7.6

文章目录 1. Linux和CentOS2. 虚拟机3. 为什么选择在VMware上安装CentOS&#xff1f;4. 准备工作5. 创建新的虚拟机6. 安装CentOS 7.67. 初次启动和设置 在我们了解如何在VMware16中安装CentOS 7.6之前&#xff0c;让我们首先对Linux、CentOS以及虚拟机有一些基本的认识。 1. …

【性能测试一】性能测试概述

目录 &#x1f31f;一、性能测试的基础概念 &#x1f308;1、生活中软件相关的性能问题&#xff1f; &#x1f308;2、性能测试的概念 &#x1f308;3、性能测试与功能测试的区别&#xff1f; &#x1f308;4、什么样的软件属于性能好&#xff1f;什么样的软件属于性能不好…

搭建Vue项目以及项目的常见知识

前言&#xff1a;使用脚手架搭建vue项目&#xff0c;使用脚手架可以开发者能够开箱即用快速地进行应用开发而开发。 搭建 #创建一个基于 webpack 模板的新项目 vue init webpack my-project #选择所需要的选项如图&#xff1a; cd my-project npm run dev访问localhost:808…

分布式数据库架构

分布式数据库架构 1、MySQL常见架构设计 对于mysql架构&#xff0c;一定会使用到读写分离&#xff0c;在此基础上有五种常见架构设计&#xff1a;一主一从或多从、主主复制、级联复制、主主与级联复制结合。 1.1、主从复制 这种架构设计是使用的最多的。在读写分离的基础上…

SpringBoot源码分析(三):SpringBoot的事件分发机制

文章目录 通过源码明晰的几个问题Spring 中的事件Springboot 是怎么做到事件监听的另外两种注册的Listener 源码解析加载listenerSpringApplicationRunListenerEventPublishingRunListenerSimpleApplicationEventMulticaster判断 listener 是否可以接收事件Java 泛型获取 整体流…