目录
前言
SpringBoot提供了对Redis的集成,引入包spring-boot-starter-data-redis即可连接到redis。并提供了RedisTemplate、StringRedisTemplate两个模板bean供我们操作Redis。在需要用的地方注入RedisTemplate或StringRedisTemplate就可以轻松完成操作。
RedisTemplate中的两个泛型都是Object,key默认的序列化方案是JdkSerializationRedisSerializer。
StringRedisTemplate中的两个泛型都是ObjectString,key默认的序列化方案是StringRedisSerializer。
RedisTemplate 可以存储任意数据类型包括对象类型
StringRedisTemplate 只能操作string数据类型.
--template操作5种数据类型
redisTemplate.opsForValue(); //操作String数据结构
redisTemplate.opsForHash(); //操作hash数据结构
redisTemplate.opsForSet(); //操作Set数据结构
redisTemplate.opsForZSet(); //操作Set有序结构
redisTemplate.opsForList(); //操作List集合结构
一、连接到redis服务器
假设你已经建立好SpringBoot工程,并安装好redis数据库。
1. 在pom.xml中引入依赖
<!--引入redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
引入redis起步依赖后,其它什么都不用做就已经能够默认连接到本地redis了。先不打开本地redis服务直接运行测试类,测试类代码:
package com.redisdemo;
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.StringRedisTemplate;
@SpringBootTest
class RedisdemoApplicationTests {
@Autowired
StringRedisTemplate stringredistemplate;
@Test
void contextLoads() {
System.out.println("启动测试类...............");
stringredistemplate.opsForValue().set("key1","测试内容abc");
System.out.println("获得健key1的值:"+stringredistemplate.opsForValue().get("key1"));
}
}
运行结果如图:报错,错误原因是Unable to connect to localhost:6379,不能连接到本地redis服务。引入redis起步依赖后默认就能连接本地( 127.0.0.1)端口(6379)的redis服务。
现在启动本地redis服务,再运行测试类,运行结果如图:已经正确获取到键值的内容。
2. 配置Redis的连接信息
从springboot2.0开始,spring-boot-starter-data-redis默认使用 lettuce代替Jedis,因此需要把配置文件中redis配置中的jedis改为lettuce,并引入pool2包。
在pom.xml引入包:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
在application.yml文件中配置redis连接信息 ,此时redis的显示配置连接信息生效。
# 应用名称
spring:
application:
name: redisdemo
# redis 配置
redis:
# redis数据库索引(默认0)
database: 0
# redis 服务器地址(IP地址)
host: 127.0.0.1
# redis 服务器端口
port: 6379
# redis数据库密码(默认为空)
password:
# redis连接池最大连接数(使用负数表示没有显示,默认8)
lettuce:
pool:
max-active: 8
# 连接池最大阻塞等待时间(使用负值表示没有限制,默认-1)
max-wait: -1
# 连接池中的最大空闲连接 默认 8
max-idle: 8
# 连接池中的最小空闲连接 默认 0
min-idle: 0
# 应用服务 WEB 访问端口
server:
port: 8080
再次运行之前的测试类,运行结果如图:
到此已经正常连接到redis服务器。
二、不同数据类型的操作
1. 对象操作
测试类代码:
@Autowired
private RedisTemplate redisTemplate;//此处变量名写其它的名称会报错
@Test
public void objectShow() {
System.out.println("启动测试类方法..objectShow.............");
ValueOperations objOps = redisTemplate.opsForValue();
User user=new User();
user.setId(1L);
user.setName("周瑜");
objOps.set("userkey", user);
System.out.println("-----获得对象为:"+objOps.get("userkey").toString());
redisTemplate.delete("userkey");
}
用户对象类代码:
package com.redisdemo.data;
import lombok.Data;
import java.io.Serializable;
@Data
public class User implements Serializable {
private Long id;
private String name;
}
运行结果:
2. hash哈希操作
测试类代码:
@Test
public void HashShow() {
HashOperations hashOps = redisTemplate.opsForHash();
hashOps.put("hash","idKey","2");
hashOps.put("hash","nameKey","诸葛亮");
System.out.println("id="+hashOps.get("hash", "idKey"));
System.out.println("name="+hashOps.get("hash", "nameKey"));
}
运行结果:
3. List列表操作
测试类代码:
@Test
public void listShow() {
ArrayList<String> list1=new ArrayList<String>();
list1.add("1曹操");
list1.add("2吕布");
list1.add("3刘备");
ListOperations<String, String> listOps = redisTemplate.opsForList();
listOps.leftPush("lkey1",list1.toString());
System.out.println("获得值1:---"+listOps.leftPop("lkey1"));
System.out.println("获得值2:==="+listOps.leftPop("lkey1"));
}
运行结果:
4. Set集合操作
测试类代码:
@Test
public void setShow() {
SetOperations<String, String> setOps = redisTemplate.opsForSet();
setOps.add("setkey","关羽");
setOps.add("setkey","张飞");
setOps.add("setkey","刘备");
System.out.println(setOps.members("setkey"));
}
运行结果: