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