要想通过 Java 操作 redis,首先要连接上 redis 服务器,推荐看通过 Java 操作 redis -- 连接 redis
创建项⽬
勾选 NoSQL 中的 Spring Data Redis
当然, 把 Web 中的 Spring Web 也勾选⼀下.⽅便写接进⾏后续测试.
配置 redis 服务地址
在 application.properties 配置文件中配置参数:
#redis 服务器的地址
spring.redis.host=127.0.0.1
#redis 服务器的端口号
spring.redis.port=8888
至于为什么是这里配置的 redis 端口是本地的 8888 端口,相信看了本文章头部推荐的博客以后就很清楚了,我们用 shh 的端口转发,将服务器上 redis 的 6379 端口映射到了本地的 8888 端口
测试代码
package com.example.redisspringdemo.Controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Set;
/**
* Created with IntelliJ IDEA.
* Description:
* User: wuyulin
* Date: 2024-05-21
* Time: 18:03
*/
@RestController
@RequestMapping("/RedisDemoController")
public class RedisDemoController {
//从 spring 的 IOC 容器中获取 stringRedisTemplate 对象
@Autowired
//在 Spring 中通过 StringRedisTemplate 类的对象来操作 Redis
// 在 Spring 中操作 Redis 最原始的类是 RedisTemplate,StringRedisTemplate 是它的子类
//专门用于处理文本数据,还有一个类专门用于处理二进制数据
private StringRedisTemplate stringRedisTemplate;
/**
* 操作 Redis 中 String 类型的键值对
* */
@RequestMapping("/stringDemo")
public String stringDemo(){
// 清空 Redis 中已有的键值对避免对最终结果造成影响
// 但 Spring 中并没有封装 flushAll 等操作,那怎么办呢?
//RedisTemplate 留了一个后手,能够让我们执行 Jedis 原生命令
// 这里的 RedisConnection 就代表了 Redis 连接,对标 Jedis 对象
//通过 RedisConnection 对象就可以执行 Jedis 对象中的方法
stringRedisTemplate.execute((RedisConnection redisConnection)->{
//清空 redis 中的数据
redisConnection.flushAll();
return null;
});
//stringRedisTemplate.opsForValue() 得到一个专门操作 String 类型的对象
//调用 set 方法设置键值对
stringRedisTemplate.opsForValue().set("key1","111");
stringRedisTemplate.opsForValue().set("key2","222");
stringRedisTemplate.opsForValue().set("key3","333");
//通过 get 方法通过 key 获取 value
String key1=stringRedisTemplate.opsForValue().get("key1");
String key2=stringRedisTemplate.opsForValue().get("key2");
System.out.println("key1:"+key1);
System.out.println("key2:"+key2);
return "ok";
}
/**
* 操作 Redis 中 List 类型的键值对
* */
@RequestMapping("/listDemo")
public String listDemo(){
stringRedisTemplate.execute((RedisConnection redisConnection)->{
//清空 redis 中的数据
redisConnection.flushAll();
return null;
});
// stringRedisTemplate.opsForList() 得到一个专门操作 List 类型的对象
// leftPush() 向列表的左边插入数据
stringRedisTemplate.opsForList().leftPush("key","1");
//leftPushAll()向列表的左边插入多条数据
stringRedisTemplate.opsForList().leftPushAll("key","2","3","4");
//range() 获取指定范围内的数据
List<String> key=stringRedisTemplate.opsForList().range("key",0,-1);
System.out.println(key);
return "ok";
}
/**
* 操作 Redis 中 set 类型的键值对
* */
@RequestMapping("/setDemo")
public String setDemo(){
stringRedisTemplate.execute((RedisConnection redisConnection)->{
redisConnection.flushAll();
return null;
});
// stringRedisTemplate.opsForSet() 得到一个专门操作 Set 类型的对象
//向集合中添加数据
stringRedisTemplate.opsForSet().add("key","zhangsan","lisi","wangwu");
//获取集合中的所有数据
Set<String> key=stringRedisTemplate.opsForSet().members("key");
System.out.println(key);
//判断集合中 zhangsan 是否存在
Boolean result1=stringRedisTemplate.opsForSet().isMember("key","zhangsan");
System.out.println(result1);
//获取集合中的元素个数
Long count=stringRedisTemplate.opsForSet().size("key");
System.out.println(count);
stringRedisTemplate.opsForSet().remove("key","zhangsan","lisi");
key=stringRedisTemplate.opsForSet().members("key");
System.out.println(key);
return "ok";
}
@RequestMapping("/hashDemo")
public String hashDemo(){
stringRedisTemplate.execute((RedisConnection redisConnection)->{
redisConnection.flushAll();
return null;
});
// stringRedisTemplate.opsForHash() 得到一个专门操作 Hash 类型的对象
//向哈希表中添加数据
stringRedisTemplate.opsForHash().put("key","f1","111");
stringRedisTemplate.opsForHash().put("key","f2","222");
stringRedisTemplate.opsForHash().put("key","f3","333");
//获取 hash 表中的数据
String f1=(String) stringRedisTemplate.opsForHash().get("key","f1");
System.out.println(f1);
//判断哈希表中的某个键值对是否存在
Boolean exists=stringRedisTemplate.opsForHash().hasKey("key","f1");
System.out.println(exists);
//删除哈希表中的键值对
stringRedisTemplate.opsForHash().delete("key","f1","f2");
//获取哈希表中的元素个数
Long count=stringRedisTemplate.opsForHash().size("key");
System.out.println(count);
return "ok";
}
@RequestMapping("/zsetDemo")
public String zsetDemo(){
//清空 redis 中的数据
stringRedisTemplate.execute((RedisConnection redisConnection)->{
redisConnection.flushAll();
return null;
});
// stringRedisTemplate.opsForZSet() 得到一个专门操作 ZSet 类型的对象
//添加数据到有序集合中
stringRedisTemplate.opsForZSet().add("key","zhangsan",10);
stringRedisTemplate.opsForZSet().add("key","lisi",20);
stringRedisTemplate.opsForZSet().add("key","wangwu",30);
//获取有序集合中指定范围的元素
Set<String> members=stringRedisTemplate.opsForZSet().range("key",0,-1);
System.out.println(members);
//获取有序集合指定范围内的元素和分数
Set<ZSetOperations.TypedTuple<String>> membersAndScore=stringRedisTemplate.opsForZSet().rangeWithScores("key",0,-1);
System.out.println(membersAndScore);
//获取有序集合中指定元素的分数
Double score=stringRedisTemplate.opsForZSet().score("key","zhangsan");
System.out.println(score);
//删除有序集合中指定的元素
stringRedisTemplate.opsForZSet().remove("key","zhangsan","lisi");
//获取有序集合中的元素个数
Long count=stringRedisTemplate.opsForZSet().size("key");
System.out.println(count);
//获取有序集合中指定元素的排名
Long rank=stringRedisTemplate.opsForZSet().rank("key","wangwu");
System.out.println(rank);
return "ok";
}
}