一、Jedis
我们要使用 Java 来操作 Redis,什么是Jedis 是 Redis 官方推荐的 java连接开发工具! 使用Java 操作 Redis 中间件!
1、导入对应的依赖
<!--导入jedis的包-->
<dependencies>
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>
</dependencies>
2、编码测试
import redis.clients.jedis.Jedis;
public class TestPing {
public static void main(String[] args) {
// 1、 new Jedis 对象即可
Jedis jedis = new Jedis("127.0.0.1",6379);
// jedis 所有的命令就是我们之前学习的所有指令!所以之前的指令学习很重要!
System.out.println(jedis.ping());
}
}
二、使用坐标完成Java和redis的连接
1.首先导入坐标依赖:
<!--redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.再创建config包,包下创建配置RedisTemplate的类,使其能够以JSON格式序列化和反序列化数据。
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<Object,Object> jsonRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException{
//1.创建自定义模板类
RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
//配置json类型的序列化工具
template.setKeySerializer(new StringRedisSerializer());//这样key会用字符串方式保存
template.setDefaultSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
RedisTemplate<Object, Object>:这是一个Spring提供的模板类,用于与Redis进行交互。泛型<Object,Object>表示key和value的类型都是Object。
RedisConnectionFactory:这是Redis连接工厂,用于创建与Redis服务器的连接。
template.setKeySerializer(new StringRedisSerializer()):这行代码设置了key的序列化工具,将key以字符串形式保存到Redis中。
template.setDefaultSerializer(new Jackson2JsonRedisSerializer<>(Object.class)):这行代码设置了默认的序列化工具,使用Jackson2JsonRedisSerializer将对象序列化为JSON格式。
template.setConnectionFactory(redisConnectionFactory):将Redis连接工厂设置给模板,模板会使用这个工厂与Redis交互。
然后就是去测试类里创建方法:
4.方案一(字符串处理):
@Autowired
StringRedisTemplate stringRedisTemplate;
@Test
public void show1(){
// 1.key相关
Set<String> keys = stringRedisTemplate.keys("*");
for (String key : keys) {
System.out.println(key);
}
// 2.各种类型支持
stringRedisTemplate.opsForValue();
stringRedisTemplate.opsForList();//List
stringRedisTemplate.opsForHash();//hash
stringRedisTemplate.opsForSet();//set
stringRedisTemplate.opsForZSet();//zset
//3.举例字符串
stringRedisTemplate.opsForValue().set("name","许老师");
String name = stringRedisTemplate.opsForValue().get("name");
System.out.println(name);
//4.操作list列表
stringRedisTemplate.opsForList().leftPush("myList1","曹丕");
stringRedisTemplate.opsForList().leftPush("myList1","曹植");
stringRedisTemplate.opsForList().leftPushAll("mylistAll","曹操","曹丕","曹植");
List<String> list = stringRedisTemplate.opsForList().range("mylistAll",0,2);
System.out.println(list);
}
首先在一开始就定义了StringRedisTemplate,他是用来专门用于处理字符串类型的键和值。
stringRedisTemplate.keys("*"):获取Redis中所有的键(使用*作为通配符),并存储在Set<String>中。然后通过for循环打印每个键。
后面的opsForValue()、opsForList()、opsForHash()、opsForSet()、opsForZSet()都是操作对应的数据然后返回一个可以操作Redis字符串数据类型的接口。
stringRedisTemplate.opsForValue().set("name","许老师");:将字符串键"name"的值设置为"许老师",通过接口操作。
后面的stringRedisTemplate.opsForList().leftPush("myList1", "曹丕");:将字符串"曹丕"从左侧推入到列表"myList1"中,后面两端代码都是。
List<String> list = stringRedisTemplate.opsForList().range("mylistAll",0,2);:获取列表"mylistAll"中从索引0到2的所有元素,并打印出来。
5.方案二(通用模板):
@Autowired
RedisTemplate redisTemplate;
@Test
public void show2(){
ValueOperations valueOperations = redisTemplate.opsForValue();
valueOperations.set("name","薛老师");
String name = (String) valueOperations.get("name");
System.out.println(name);
redisTemplate.opsForValue();//String
redisTemplate.opsForList();//List
redisTemplate.opsForHash();//hash
redisTemplate.opsForSet();//set
redisTemplate.opsForZSet();//zset
Student stu1 = new Student(1,"薛老师","洗脚");
redisTemplate.opsForValue().set("stu1",stu1);
Student ss1 = (Student)redisTemplate.opsForValue().get("stu1");
System.out.println(ss1);
redisTemplate.opsForList().leftPushAll("mylist","睡觉","游戏");
List<String> list = redisTemplate.opsForList().range("mylist",0,-1);
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
System.out.println(s);
}
System.out.println("打印默认序列策略"+redisTemplate.getDefaultSerializer());
}
首先定义了一个通用的模板对象,RedisTemplate是一个通用模板类,用于与Redis进行交互,可以处理多种数据类型。
ValueOperations valueOperations = redisTemplate.opsForValue();:获取操作字符串数据类型的接口ValueOperations。
valueOperations.set("name", "薛老师");:将字符串键"name"的值设置为"薛老师",get("name")是将键name对应的值打印出来。
后面的opsForValue()、opsForList()等等都是用来操作字符串类型的数据、操作列表(List)类型的数据等等。
后面Student操作是将对象通过opsForValue()方法存储到Redis中。在获取打印。
list操作也是一样的原理,存入再通过rang()方法获取元素并打印。
6.方案三(自定义处理):
注意:定义配置类JavaConfig,自定义序列化策略
@Autowired
RedisTemplate jsonRedisTemplate;
@Test
public void show3(){
//保存对象
Student stu = new Student(1,"彭老师","拉面");
jsonRedisTemplate.opsForValue().set("stu",stu);
//获取对象
Object s1 = jsonRedisTemplate.opsForValue().get("stu");
String jsonS1 = JSONObject.toJSONString(s1);
Student s11 = JSONObject.parseObject(jsonS1,Student.class);
System.out.println(s11);
Student stu2 = new Student(2,"彭老师","拉面");
Student stu1 = new Student(2,"彭老师","拉面");
Student stu3 = new Student(2,"彭老师","拉面");
List<Student> students = Arrays.asList(stu1, stu2, stu3);
jsonRedisTemplate.opsForValue().set("stus",students);
//必须Object接受,利用ObjectMapper对象转换,如果强制转换会报错
Object data = jsonRedisTemplate.opsForValue().get("stus");
String dataJson = JSONObject.toJSONString(data);
//将JSON类型转为List
List<Student> stus = JSONObject.parseArray(dataJson, Student.class);
System.out.println(stus);
}
这里首先实例化了一个jsonRedisTemplate,这个RedisTemplate已经通过配置类(如RedisConfig)自定义了序列化策略,用于将对象以JSON格式存储和检索。
前面的语法基本一致,但是jsonRedisTemplate可以直接调用比如opsForValue()等方法进行保存数据,获取数据的方式有些不同,Object s1 = jsonRedisTemplate.opsForValue().get("stu");从Redis中获取键"stu"对应的对象,并存储在Object类型的变量s1中。再通过获取到的对象转换为JSON字符串,再通过parseObject()方法,将刚才的对象转换的json字符串和对象类名传入方法中,就可以得到对象本身了。
保存获取多个对象跟保存单个对象也是一样的原理,必须Object接受,利用ObjectMapper对象转换,如果强制转换会报错。
注意jsonRedisTemplate都是使用opsForValue()方法来保存获取对象的。