一、Redis简介
1、网站链接:
(1)官网下载
官网: Redis - The Real-time Data Platform
中文网: Redis中文网
(2)网盘下载
Redis安装包及可视化工具
通过网盘分享的文件:Redis
链接: https://pan.baidu.com/s/1FoJtg459RFLBjoPOa1BGgg?pwd=xbkc
提取码: xbkc
2、redisi和Mysql本质区别
redis将数据存储在内存中,数据结构为键值对的形式;
Mysql则是以数据文件的形式存储到磁盘中,数据结构则是二维表
3、Redis下载与安装
Redis安装包分为Windows版和 Linux版
Windows版下载地址: Releases · microsoftarchive/redis · GitHub
Linux版下载地址: Index of /releases/
4、解压成功后,设置密码
打开文件,ctrl+F键,搜索框输入“pass ”,找到“# requirepass foobared”,删除符号“#”,取消注释,前面也不能有空格,不然就是报错
改为“requirepass 123456”,123456即为密码,可以不用设置!修改后要重启redis才生效
5、数据类型
6、redis常用命令
7、redis图形化工具使用
点击设置(图中蓝色按钮),选择简体中文
点击“新建连接”,任意填写连接名,如“localhost”,若redis设置密码,填写密码,其他可以默认为空
打开localhost数据库旁边的控制台按钮(第二个),进入以下界面,下面的输入框可以输入redis命令,但该工具可直接操作无需命令
二、在Java中操作Redis(记得开启redis)
1、Redis的客户端
spring data Redis直接对jedis和lelttuce进行了封装,所以我们建议学习spring data Redis即可
2、spring data Redis使用方式
代码文件:
(1)导入Maven坐标
依赖代码:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
示意图:
(2)配置Redis数据源
注意层级关系,Redis要写在spring后面,配置爆红冒号后没打空格
代码:
spring:
redis:
host: localhost
port: 6379
#redis密码,如果没有则不用设置
# password: 123456
示意图:
注意:由于项目在开发,生产,测试的情况下使用的Redis环境可能不一样,所以我们尽量不要将配置项的值写在主配置文件中,我们可以将值写在其他的配置文件中,再主配置文件中通过引用的方式来配置环境
以下是对配置环境进行的改造
2-1、主配置文件:application.yml
spring:
profiles:
active: dev
redis:
host: ${sky.redis.host}
port: ${sky.redis.port}
# password: ${sky.redis.password}
# database: ${sky.redis.database}
- spring.profiles.active: dev:这行配置指定了当前激活的Spring配置文件是dev,即开发环境。Spring Boot允许根据不同的环境(如开发、测试、生产)加载不同的配置文件。
- redis.host: ${sky.redis.host} 和 redis.port: ${sky.redis.port}:这部分配置用于指定Redis服务器的地址和端口。具体来说,${sky.redis.host}和${sky.redis.port}是占位符,它们的值将从其他地方(如系统环境变量、外部配置文件等)注入进来。这使得在不同的环境中可以灵活地更改Redis服务器地址和端口而无需修改代码。
2-2、开发配置环境:application-dev.yml
sky:
redis:
host: localhost
port: 6379
# password: 123456
# database: 0
3、创建RedisConfiguration配置类
位置:sky-server/src/main/java/com/sky/config/RedisConfiguration.java
完整代码文件:
package com.sky.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
@Slf4j
public class RedisConfiguration {
@Bean//@Bean的作用是将方法的返回值注入到spring容器中,这里创建了一个RedisTemplate对象
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
log.info("初始化创建Redis模板对象...");
// 创建RedisTemplate对象
RedisTemplate redisTemplate = new RedisTemplate();
// 设置连接工厂
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 设置key和value的序列化方式,否则会Redis数据库中key和value会出现乱码问题
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}
}
示意图:
4、创建SpringDataRedisTest测试类
注意:text测试类要创建在src包下
创建方式:在sky-server项目的src包下,右键“New”|“Directory”|选择text\java“”回车即可
在java包下,New一个java类,名字为com/sky/SpringDataRedisTest
创建SpringDataRedisTest测试类
位置:sky-server/src/test/java/com/sky/SpringDataRedisTest.java
完整代码:
package com.sky;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
@SpringBootTest
public class SpringDataRedisTest {
//@Autowired的作用是将Spring中配置的RedisTemplate注入到SpringDataRedisTest类中
//如果爆红,可以检查RedisConfiguration配置类的方法是否没有添加@Bean注解
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testRedis() {
//如果控制台输出redisTemplate,说明RedisTemp late已经注入成功
System.out.println(redisTemplate);
}
}
示意图:
5、测试类SpringDataRedisTest完整操作代码(范例)
位置:sky-server/src/test/java/com/sky/SpringDataRedisTest.java
代码:
package com.sky;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.*;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@SpringBootTest
public class SpringDataRedisTest {
//@Autowired的作用是将Spring中配置的RedisTemplate注入到SpringDataRedisTest类中
//如果爆红,可以检查RedisConfiguration配置类的方法是否没有添加@Bean注解
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testRedis() {
//1、验证:
// 如果控制台输出redisTemplate,说明RedisTemplate已经注入成功
System.out.println(redisTemplate);
//获取RedisTemplate的其他操作对象
ValueOperations valueOperations = redisTemplate.opsForValue();
HashOperations hashOperations = redisTemplate.opsForHash();
ListOperations listOperations = redisTemplate.opsForList();
SetOperations setOperations = redisTemplate.opsForSet();
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
/*
//2、使用RedisTemplate操作Redis数据库
//(1)opsForValue:操作字符串类型
redisTemplate.opsForValue().set("name", "sky");
String name = (String) redisTemplate.opsForValue().get("name");
System.out.println(name);
//(2)opsForHash:操作哈希类型
redisTemplate.opsForHash().put("hash", "key1", "value1");
redisTemplate.opsForHash().put("hash", "key3", "value3");
redisTemplate.opsForHash().put("hash", "key4", "value4");
String value = (String) redisTemplate.opsForHash().get("hash", "key1");
System.out.println(value);
//(3)opsForSet:操作集合类型
redisTemplate.opsForSet().add("set", "value1");
redisTemplate.opsForSet().add("set", "value2");
redisTemplate.opsForSet().add("set", "value3");
long size = redisTemplate.opsForSet().size("set");
System.out.println(size);
//(4)opsForZSet:操作有序集合类型
redisTemplate.opsForZSet().add("zset", "value1", 1);
redisTemplate.opsForZSet().add("zset", "value2", 2);
redisTemplate.opsForZSet().add("zset", "value3", 3);
long zsetSize = redisTemplate.opsForZSet().size("zset");
System.out.println(zsetSize);
//(5)opsForList:操作列表类型
redisTemplate.opsForList().leftPush("list", "value1");
redisTemplate.opsForList().leftPush("list", "value2");
redisTemplate.opsForList().leftPush("list", "value3");
long listSize = redisTemplate.opsForList().size("list");
System.out.println(listSize);
*/
// //3、清空Redis数据库
// redisTemplate.execute((RedisCallback<Object>) connection -> {
// connection.flushDb();
// return null;
// });
}
/**
* 测试String(字符型)类型
*/
@Test
public void textString() {
redisTemplate.opsForValue().set("name","张三");
String name = (String)redisTemplate.opsForValue().get("name");
System.out.println(name);
//设置数据过期时间时间
redisTemplate.opsForValue().set("code","123456",10,TimeUnit.SECONDS);
String code = (String)redisTemplate.opsForValue().get("code");
System.out.println(code);
redisTemplate.opsForValue().setIfAbsent("name1","李四");//如果name1不存在,则设置值
redisTemplate.opsForValue().setIfAbsent("name1","李五");
String name1 = (String)redisTemplate.opsForValue().get("name1");
System.out.println(name1);
}
/**
* 测试Hash(哈希)类型
*/
@Test
public void testHash() {
redisTemplate.opsForHash().put("hash","key1","value1");
String value = (String)redisTemplate.opsForHash().get("hash","key1");
System.out.println(value);
//设置倒计时
redisTemplate.opsForHash().put("hash","key2",10000000000L);
Long time = (Long)redisTemplate.opsForHash().get("hash","key2");
System.out.println(time);
}
/**
* 测试List(列表)类型
*/
@Test
public void testList() {
ListOperations listoperations = redisTemplate.opsForList();
//向列表中添加元素
redisTemplate.opsForList().leftPush("list","1");
redisTemplate.opsForList().leftPush("list","2","3");
//获取列表长度
long size = redisTemplate.opsForList().size("list");
System.out.println(size);
//获取列表元素
String value1 = (String)redisTemplate.opsForList().index("list",0);
System.out.println(value1);
//获取列表全部元素
listoperations.range("list",0,-1);
//获取列表前2个元素
listoperations.range("list",0,2 );
//删除列表元素
// 第一个参数 "list":表示要操作的 Redis 列表的键名
// 第二个参数 0:表示删除的方向和数量。0 表示删除列表中所有与第三个参数相等的元素
// 第三个参数 1:表示要删除的元素值
// 当值为正数时,表示从列表的头部(左侧) 向尾部(右侧)
// 查找并删除,且只删除前 N 个匹配的元素(这里 N 就是该参数值 2)
redisTemplate.opsForList().remove("list",2,1);
redisTemplate.opsForList().remove("list",0,1);
}
/**
* 测试Set(集合)类型
*/
@Test
public void testSet() {
SetOperations setOperations = redisTemplate.opsForSet();//获取Set操作对象
//向集合中添加元素
redisTemplate.opsForSet().add("set","1");
redisTemplate.opsForSet().add("set","2","3","4");
//按范围查询集合元素
String set = setOperations.members("set").toString();
System.out.println("集合元素:" + set);
//获取集合长度
long size = redisTemplate.opsForSet().size("set");
System.out.println(size);
//删除集合元素
redisTemplate.opsForSet().remove("set","1");
redisTemplate.opsForSet().remove("set","2","4");
//获取集合元素
String set1 = setOperations.members("set").toString();
System.out.println("删除后的集合元素:" + set1);
}
/**
* 测试ZSet(有序集合)类型
*/
@Test
public void testZSet() {
redisTemplate.opsForZSet().add("zset","value1",1);
redisTemplate.opsForZSet().add("zset","value2",2);
redisTemplate.opsForZSet().add("zset","value3",3);
long size = redisTemplate.opsForZSet().size("zset");
System.out.println(size);
}
/**
* 测试通用方法
*/
@Test
public void testCommon() {
ListOperations listOperations = redisTemplate.opsForList();
listOperations.leftPush("list","1");
listOperations.leftPush("list","2","3");
listOperations.leftPush("list","4","5");
Set keys = redisTemplate.keys("*");//获取Redis中所有键
System.out.println("Redis中所有键:" + keys);
//获取Redis中键的类型
for (Object key : keys) {
System.out.println(key);
DataType type = redisTemplate.type(key);
System.out.println(key + "的类型:" + type.name());//打印键的类型
}
Boolean bool = redisTemplate.hasKey("name");//判断Redis中是否存在指定键
System.out.println("Redis中是否存在name键:" + bool);
Boolean bool2 = redisTemplate.delete("name");//删除Redis中指定键
System.out.println("删除name键是否成功:" + bool2);
}
/**
* 清空Redis数据库
*/
@Test
public void testFlushDB() {
redisTemplate.execute((RedisCallback<Object>) connection -> {
connection.flushDb();
System.out.println("Redis数据库已清空");
return null;
});
}
}