Redis集成到SpingBoot 的数据结构常见操作
一.环境配置
1.依赖注入
2.yaml文件配置
3.启动本地Redis服务
(或在虚拟机上启动,这里为了方便演示在本地启动)
4.启动成功案例
5.创建一个Controller我们开始演示
@RestController
public class MyController {
@Autowired
private StringRedisTemplate redisTemplate;
}
二 String操作
@GetMapping("/testString")
public String test1String() throws JsonProcessingException {
// 存储字符串
//key为键,value为值,这里就像Map<String,String>
redisTemplate.opsForValue().set("greeting", "Hello, World!");
//获取key对应的值
String valueString = redisTemplate.opsForValue().get("greeting");
log.info("valueString:"+valueString);
//删除key
redisTemplate.delete("greeting");
String valueString2 = redisTemplate.opsForValue().get("greeting");
log.info("valueString2:"+valueString2);
// 存储整数
int counter = 42;
redisTemplate.opsForValue().set("counter", String.valueOf(counter));
String valueInteger = redisTemplate.opsForValue().get("counter");
log.info("valueInteger:"+valueInteger);
// 存储字节数组
byte[] binaryData = "some binary data".getBytes();
redisTemplate.opsForValue().set("binary:key", Arrays.toString(binaryData));
String valueArray = redisTemplate.opsForValue().get("binary:key");
log.info("valueArray:"+valueArray);
// 存储 JSON 对象
User user = new User("John", "123");
//Json序列化
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = objectMapper.writeValueAsString(user);
redisTemplate.opsForValue().set("user:123", jsonString);
String valueJson = redisTemplate.opsForValue().get("user:123");
log.info("valueJson:"+valueJson);
/* //存储空值null
redisTemplate.opsForValue().set("key", null);//报错:Value must not be null
String valueNull = redisTemplate.opsForValue().get("key");
log.info("valueNull:"+valueNull);*/
return "OK";
}
运行结果
三.List操作
@GetMapping("/testList")
@ResponseBody
public String testList() {
//清空redis中所有数据,防止影响其他测试,慎用
redisTemplate.getConnectionFactory().getConnection().flushAll();
String ListNull = redisTemplate.opsForList().leftPop("key");
System.out.println("ListNull: "+ListNull);
//存储一个值,键是key,值是a
redisTemplate.opsForList().leftPush("key", "a");
//存储多个值,但是键值键一样都是key,值是b,c,d
redisTemplate.opsForList().leftPushAll("key", "b", "c", "d");
//获取第一个元素
String firstElement = redisTemplate.opsForList().leftPop("key");
System.out.println("frist:"+firstElement);
//获取列表key的第2到第3个元素(索引从0开始),但是这里获取之后并未取出来
List<String> values = redisTemplate.opsForList().range("key", 1, 2);
System.out.println(values);
//获取列表key的最后一个元素
String finalElement = redisTemplate.opsForList().leftPop("key");
System.out.println("finalElement: "+finalElement);
return "OK";
}
运行结果
ListNull: null
frist:d
[b, a]
finalElement: c
注意:leftPush()是往左存储,最终存储后顺序是的,d,c,b,a
四.Hash操作
@GetMapping("/testHashmap")
@ResponseBody
public String testHashmap() {
//清空redis中所有数据,防止影响其他测试,慎用
redisTemplate.getConnectionFactory().getConnection().flushAll();
//向Redis中插入一个Hash键值对,键为 "key",字段为 "name",值为 "zhangsan"
redisTemplate.opsForHash().put("key", "name", "zhangsan");
//从Redis中获取刚刚插入的Hash值
String value = (String) redisTemplate.opsForHash().get("key", "name");
System.out.println(value);
//删除Hash中的字段 "name"
redisTemplate.opsForHash().delete("key", "name");
//检查字段 "name" 是否还存在于Hash中
boolean ok = redisTemplate.opsForHash().hasKey("key", "name");
System.out.println(ok);
//删除整个Hash键 "key"
redisTemplate.delete("key");
return "OK";
}
运行结果
zhangsan
false
五.Set
@GetMapping("/testSet")
@ResponseBody
public String testSet() {
//清空redis中所有数据,防止影响其他测试,慎用
redisTemplate.getConnectionFactory().getConnection().flushAll();
//向Redis的key中添加三个元素:aaa、bbb、ccc
redisTemplate.opsForSet().add("key", "aaa", "bbb", "ccc");
//检查key中是否包含aaa
boolean ok = redisTemplate.opsForSet().isMember("key", "aaa");
System.out.println(ok);
//从key中移除aaa
redisTemplate.opsForSet().remove("key", "aaa");
//获取key中剩余元素的数量
long n = redisTemplate.opsForSet().size("key");
System.out.println(n);
//删除key
redisTemplate.delete("key");
return "OK";
}
运行结果
true
2
六.ZSet
@GetMapping("/testZSet")
@ResponseBody
public String testZSet() {
//向Redis中名为key的有序集合添加三个成员:吕布、赵云和典韦,分别赋予不同的分数
redisTemplate.opsForZSet().add("key", "吕布", 100);
redisTemplate.opsForZSet().add("key", "赵云", 98);
redisTemplate.opsForZSet().add("key", "典⻙", 95);
//获取并打印分数最高的前3个成员,切记ZSet是有序集合
Set<String> values = redisTemplate.opsForZSet().range("key", 0, 2);
System.out.println(values);
//统计并打印分数在95到100之间的成员数量
long n = redisTemplate.opsForZSet().count("key", 95, 100);
System.out.println(n);
redisTemplate.delete("key");
return "OK";
}
运行结果
[典⻙, 赵云, 吕布]
3