一、Redis入门
1、问题分析
MySql数据库的优点:模拟了现实世界实体的关系,易懂。
MySql数据库的缺点:关系维护耗时、硬盘速度有瓶颈。
解决方案1:自定义缓存List。
案例:编写一个web系统,实现查看新闻详情。要求实现缓存,提高响应速度。
Eclipse - 动态web工程 - 新建Filter/Listener(并且在web.xml中注册)- 启动web工程,会执行Filter.init()、Listener.contextInitialized()。 我们只要在这些方法中编写sql语句查询出新闻数据,并且保存到application作用域对象中即可。
解决方案2:用现成的缓存,自己就不需定义了。
答:Redis、Ehcache等成熟的缓存技术。
Ehcache上手快,集成到springboot很方便,而且不用安装,
因为它直接就把数据存到内存中,没有存到硬盘。
Redis是一个类似mysql的软件,需要安装。
SpringBoot需要添加相关依赖才能使用Redis存储数据。
Redis相比Ehcache的最大优点就是可以把数据持久化,
把数据存到硬盘。
缓存的工作原理
2、Ehcache回顾
1、创建一个SpringBoot项目,添加依赖。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.1</version>
</parent>
<dependencies> <!-- Mybaits,必须加版本号,否则报错说找不到jar包。 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency> <!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency> <!--ehCache缓存依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency> <!-- 单元测试。 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2、在resources文件夹中创建ehcache.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false">
<diskStore path="java.io.tmpdir/Tmp_EhCache" />
<!-- 默认配置 -->
<defaultCache maxElementsInMemory="5000" eternal="false"
timeToIdleSeconds="120" timeToLiveSeconds="120"
memoryStoreEvictionPolicy="LRU" overflowToDisk="false" />
<cache name="baseCache" maxElementsInMemory="10000"
maxElementsOnDisk="100000" />
</ehcache>
3、在dao层(mapper层)使用缓存技术。
/*为了方便管理,缓存也可以分成多个区域。
某些表的数据经常变,需要一天更新一次。他们的缓存可以设置一个区域,这个区域一天清空一次。 其它的则不然。
这里,我们使用name为baseCache的缓存。
*/
@CacheConfig(cacheNames = "baseCache")
public interface UserMapper {
//只有查询才设置缓存。
@Select("select * from users where name=#{name}")
@Cacheable
UserEntity findName(@Param("name") String name);
}
4、测试缓存效果。
5、清除缓存。
@Autowired
private CacheManager cacheManager;
@RequestMapping("/remoKey")
public void remoKey() {
cacheManager.getCache("baseCache").clear();
}
缺点:无持久化,重启后缓存数据就没了。
3、(Windows版)Redis5.0数据库的安装和使用
注意:强烈不建议使用windows版Redis。
1、下载、解压 windows版的Redis 5.0版本(最新版,里面包含了客户端和服务端。)
下载地址
https://github.com/tporadowski/redis/releases
注意: 配置文件不是 redis.windows-service.conf 。
mysqld.exe
mysql.exe navicat.exe
dump.exe
2、根据conf配置文件启动服务。
命令:redis-server redis.windows.conf
注意:
1、这个在闪烁,就说明服务端已经启动了。
2、可以不加配置文件,因为默认就是读这个。 之所以加windows,是因为和linux的配置文件区分开来。
3、可以不需要输入cmd命令。直接把redis-server.exe的快捷键发送到桌面,或者设置一个环境变量打开cmd窗口快速运行。
3、重新启动一个cmd窗口,运行客户端redis-cli(会自动链接本地的6379端口)。
可以指定不同的服务器和端口。
命令:redis-cli -h 127.0.0.1 -p 6379
h=host主机
p=port端口
4、基本命令。
set 键 值 设置键值对数据
get 键 查找指定的键值对数据
keys * 查看所有键值对数据的键
flushdb 删除所有键值对数据
4、Linux版Redis
a、下载、查看、运行镜像
#下拉最新版redis的镜像文件
docker pull redis
#查看镜像
docker images
#关闭防火墙
systemctl stop firewalld
#重启docker
systemctl restart docker.service
#关闭、删除容器
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)
docker container prune;
#运行redis容器(包含了server、client、哨兵)
docker run -itd --name redis -p 6379:6379 redis
docker run -itd --name redis2 -p 6380:6379 redis --requirepass "123456"
#查看容器
docker ps -a
#进入容器、自动执行客户端,连接本地的6379端口
#或者,使用windows版的redis-cli.exe也可以连接
命令:docker exec -it redis /bin/bash
命令:redis-cli
最终运行效果
在redis容器里面,可以找到redis-server、redis-cli、redis-sentinel
5、Jedis
J=java
Jedis = java连接redis的技术
JDBC = java database connection
示例代码
1.启动Redis服务。
2.新建JavaSE工程,新建libs文件夹并拷贝jar包,并添加引用。
3.编写代码使用Jedis连接Redis服务器。
读取数据、设置数据。
package com.demo;
import redis.clients.jedis.Jedis;
public class Demo1 {
public static void main(String[] args) {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("Linux",6379);
//如果 Redis 服务设置了密码,需要下面这行,没有就不需要.
//authenticate=验证
//jedis.auth("123456");
System.out.println("连接成功");
String value = jedis.get("class");
System.out.println(value);
//关闭连接
jedis.close();
}
}
6、相比MySql,Redis确实轻、快。
1、Redis是真地小,不到20兆,解压直接用,不用安装。
MySql(windows版)将近300兆。
Oracle 2G。 两者都需要安装。
!
2、相比MySql,Redis是真地快。
a、连接mysql,耗时283毫秒。
b、连接mysql,然后执行一个查询,共花费293毫秒。
多了10毫秒,说明查询也确实是耗时了的。
c、只连接Redis,耗时78毫秒。比连接MySql快3-4倍。
d、进行插入和查找操作,耗时1-2毫秒。比MySql快10倍左右。
Redis测试代码:
public static void main(String[] args) {
//获取系统当前时间,单位是毫秒
long startTime = System.currentTimeMillis();
//默认连接6379端口
Jedis jedis = new Jedis("Linux");
System.out.println("连接成功");
//测试是否连接成功。 成功连接返回PONG,未连接成功(比如服务器关闭)直接报错。
String result = jedis.ping();
System.out.println("ping的结果:"+result);
jedis.set("b", "你好");
String value = jedis.get("b");
System.out.println(value);
long endTime = System.currentTimeMillis();
System.out.println("耗时:"+(endTime-startTime));
}
mysql测试代码:
public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver");
long startTime = System.currentTimeMillis();
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/java2107",
"root",
"123456");
System.out.println("MySql数据库连接成功!!");
PreparedStatement pst = conn.prepareStatement("select * from users_table");
long endTime = System.currentTimeMillis();
System.out.println("耗时:" + (endTime - startTime));
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("数据库连接失败!!");
}
}