一、Redis入门

一、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("数据库连接失败!!");
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值