1.还原系统配置
因为linnux中的内存有限,但其中放了mycat,mysql等资源,容易让资源爆满,所以需要释放系统配置;
1.1 释放Linux资源
1.1.1 停止数据库主从服务
如果以后还想开启主从服务,就输:START SLAVE
1.1.2 关闭数据库服务
说明:关闭数据库服务器.
1.1.3 关闭tomcat/mycat服务器
1.1.4关闭nginx服务器
到此,linux的资源配置就完成了;
1.2 修改代码中的配置
1.2.1 修改YML配置文件
说明:切换端口号和url地址.
这样就能保证我们运行的指定目录下的端口和数据库;(我们这里修改成访问的是windows中的数据库)
1.2.2 修改图片上传地址
1.3 修改环境配置
1.3.1 修改hosts文件
1.3.2 修改windows中的Nginx
修改完成之后,启动nginx服务器.
启动后出现502错误,就表示nginx启动多了,解决措施=》关闭多余的nginx,重启启动
1.3.3 访问测试
检查修改的服务是否有效
2.Redis缓存
2.1 京淘项目架构优化
说明:为了提高数据库"查询"能力.引入缓存服务器.
2.2 缓存机制的介绍
说明:使用缓存机制主要的目的就是为了降低用户访问物理设备的频次.从缓存服务器中直接获取数据,快速的响应用户,提高整体的查询速度.用户体验更好.
如何实现:
1.缓存机制应该采用什么样的数据结构 进行构建? K-V结构 K必须唯一
2.应该使用什么语言进行开发? C语言
3.缓存的运行环境是哪? 内存
4.内存断电即擦除, 如何保证数据的安全性?? 实现持久化(写入磁盘)操作
5.内存中的数据如何进行优化 (不能一直存? ) 内存优化的算法 LRU算法
2.3 Redis介绍
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)(背会)
与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability).
速度快:
tomcat: 150-220/秒
nginx: 3-5万/秒
redis: 写 8.6万/秒 读 11.2万/秒 ~ 平均10万次/秒
以下是redis的内部操作:
规则:但凡引入了消息队列,就得给用户留保留的充足时间处理数据
下图中读秒(5,4,3,2,1)的作用是;等待服务器把业务处理完之后,返回的ACK信息(消息确认信息),拿到ACK信息后就立马告诉办理业务的人办理完成;
引入消息队列的解决的问题:?
解决了由于高并发导致后端服务器不能正常工作;
我们对消息中间件进行了服务划分;
存服务的人叫做,消息的提供者;服务器端叫做消息的消费者;这种叫做消息的队列,目的是为了保护后端服务器正常稳定运行,起到润滑保护机制;
2.3 Redis安装
2.3.1 上传Redis
2.3.1 解压Redis
重命名
2.3.2 编译安装Redis
1.执行编译操作 make
编译完成后的信息提示:
2.安装redis make install
这样就把reids安装好了;
2.3.3 修改redis配置文件
直接在目录中找到redis.conf配置文件右键编辑;或者在命令框vim redis.conf来修改;
①直接打开文件进行编译:
效果如图:
②使用服务器端命令修改,输入vim resid.conf,进入该文件进行修改;
可以在最后输入:set nu
;表示显示行号;
1).在配置文件的69行,修改IP绑定(把该ip注释掉)
2).取消保护模式,
把88行的yes改为no;
3).开启后台启动
把136的no改为yes,表示开启后台运行
2.3.3 Redis常规命令
要求:进入redis根目录中执行.
特点:redis每次启动时都会读取配置文件. 如果需要准备多台redis则需要准备多个配置文件
1.配置文件的启动命令 redis-server redis.conf
(启动redis)
以上这种启动是前端启动的方式(要一直占用控制台,有弊端),这是没有对配置文件修改的启动效果,如下:
所以我们在这之前对配置文件进行了修改,改为了后台运行;
注意:redisd的端口号固定就是6379
如下为后台运行redis.conf配置文件的效果:
这样就表示redis后台启动成功
2.检索redis服务(查看redis服务是否启动)
3. 进入redis客户端中
redis中是key v结构的;
-p:表示端口号; ctrl+c退出客户端;
4.关闭redis
方式1: redis-cli -p 6379 shutdown
方式2:通过redis的pid号关闭redis
2.4 redis的指令操作
redis指令文档在课前资料中,自行查询学习
注意:命令操作必须先进客户端,在客户端进行操作;
2.4 Redis入门案例
2.4.1 添加jar包
<!--spring整合redis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
2.4.2 编辑测试API
(1)入门案例
问题插叙:
如果我们新创建一个测试类,这个文件夹是灰色的,没有反应
解决办法:
(2)redis中API的使用
(3)redis中高级API;
jedis.setnx(“boss”, “潘石屹”); 如果key已经存在,则不允许赋值
2.5 SpringBoot整合Redis
整合这个对象,就相当于把这个对象要交给容器管理;
我们要进行整合,就要去指定位置下去编辑我们的配置类
2.5.1 编辑配置文件
# 配置单台redis
redis.host=192.168.126.129
redis.port=6379
2.5.2 编辑配置类
package com.jt.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import redis.clients.jedis.Jedis;
@Configuration //标识我是配置类
@PropertySource("classpath:/properties/redis.properties")
public class RedisConfig {
@Value("${redis.host}")
private String host;
@Value("${redis.port}")
private Integer port;
@Bean
public Jedis jedis(){
//数据写死?????????
return new Jedis(host,port);
}
}
2.6 数据如何保存到Redis中
商品分类信息中使用缓存最合适;
商品分类,用户在增加信息中得先查询,这里的信息在短期内是不会发生改变的,所以我们在这部分功能中使用redis缓存;
这里我们要考虑,java的代码和redis之间如何进行数据的存储,即考虑数据如何保存到redis中
2.6.1 业务说明
上面返回的是一个list集合,但redis中要是用字符串的形式缓存;
说明:由于redis中一般使用String数据类型保存业务数据.但是代码中java对象Redis没办法直接保存,所以需要中间的转化的过程.使用JSON方式进行数据中转.
List java对象 --------- JSON ------------ Redis中 使用String数据类型保存.
2.6.2 ObjectMapper API介绍
(1)将对象转化为json,然后再将json转化为对象
(2)将集合信息转化为json
(3)
package com.jt.test;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jt.pojo.ItemDesc;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class TestObjectMapper {
private static final ObjectMapper MAPPER = new ObjectMapper();
@Test
public void test01(){
ItemDesc itemDesc = new ItemDesc();
itemDesc.setItemId(100L).setItemDesc("测试JSON转化").setCreated(new Date())
.setUpdated(itemDesc.getCreated());
try {
//1.将java对象转化为JSON
String json = MAPPER.writeValueAsString(itemDesc);
System.out.println(json);
//2.将JSON转化为对象 利用反射机制实例化对象 利用get/set方法为对象赋值
ItemDesc itemDesc2 = MAPPER.readValue(json, ItemDesc.class);
System.out.println(itemDesc2.toString()); //只输出当前对象的数据
//3.将集合信息转化为JSON List
List<ItemDesc> list = new ArrayList<>();
list.add(itemDesc);
String listJSON = MAPPER.writeValueAsString(list);
System.out.println(listJSON);
//将json转化为List集合
List<ItemDesc> list2 = MAPPER.readValue(listJSON,list.getClass());
System.out.println(list2);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
2.6.3 编辑工具API
说明:改工具API主要负责将用户参数转化为JSON,或者将JSON串转化为对象. 简化客户端调用
package com.jt.unit;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ObjectMapperUtil {
//1.创建工具API对象
private static final ObjectMapper MAPPER = new ObjectMapper();
//2.封装API 将对象转化为JSON
public static String toJSON(Object object){
if(object == null){
throw new RuntimeException("传入对象不能为null");
}
try {
String json = MAPPER.writeValueAsString(object);
return json;
} catch (JsonProcessingException e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
}
/**
* 3.将JSON串转化为对象 用户传递什么类型,则返回什么对象
* user.class User对象
*
*/
public static <T> T toObject(String json,Class<T> target){
//1.校验参数是否有效
if(json == null || "".equals(json) || target == null){
//参数有误.
throw new RuntimeException("参数不能为null");
}
//2.执行业务处理
try {
T t = MAPPER.readValue(json, target);
return t;
} catch (JsonProcessingException e) {
//将报错信息通知其他人
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
}
}
2.6.4 编辑工具API测试
//工具API测试
@Test
public void test02(){
ItemDesc itemDesc = new ItemDesc();
itemDesc.setItemId(100L).setItemDesc("测试JSON转化").setCreated(new Date())
.setUpdated(itemDesc.getCreated());
String json = ObjectMapperUtil.toJSON(itemDesc);
ItemDesc itemDesc2 = ObjectMapperUtil.toObject(json, ItemDesc.class);
System.out.println(itemDesc2);
}