本文章重点讲解Spring Data Redis。
Spring Data Redis 是 Spring 的一部分,提供了在 Spring 应用中通过简单的配置就可以访问 Redis 服务,对 Redis 底层开发包进行了高度封装。在 Spring 项目中,可以使用Spring Data Redis来简化 Redis 操作。
想要在Java客户端中操作Redis首先需要在pom文件中导入maven坐标:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
Spring Data Redis中提供了一个高度封装的类:RedisTemplate,对相关api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:
-
ValueOperations:string数据操作
-
SetOperations:set类型数据操作 无序存储
-
ZSetOperations:zset类型数据操作 每个成员由一个浮点类型的分数 有序存储
-
HashOperations:hash类型的数据操作 散列 适合存储对象
-
ListOperations:list类型的数据操作 列表 顺序存储
在application配置文件中指定端口号等信息:
sky:
redis:
host: localhost //IP地址
port: 6379 //端口号
database: 10 //要操作的数据库
database:指定使用Redis的哪个数据库,Redis服务启动后默认有16个数据库,编号分别是从0到15。
编写配置类,创建RedisTemplate对象:
当前配置类不是必须的,Spring Boot 框架会自动装配 RedisTemplate 对象,默认的key序列化器为JdkSerializationRedisSerializer,这里的操作是将key序列化器设置为StringRedisSerializer序列化器。
@Configuration
@Slf4j
public class RedisConfiguration {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
log.info("开始创建redis模板对象...");
RedisTemplate redisTemplate = new RedisTemplate();
//设置redis的连接工厂对象
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置redis key的序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}
新建测试类:
@SpringBootTest
public class SpringDataRedisTest {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testRedisTemplate(){
System.out.println(redisTemplate);
//string数据操作 可以存储任意类型的数据,包括文本、数字、图片等
ValueOperations valueOperations = redisTemplate.opsForValue();
//hash类型的数据操作 一个存储空间保存多个键值对数据非常适合存储对象
HashOperations hashOperations = redisTemplate.opsForHash();
//list类型的数据操作 成员有序排列
ListOperations listOperations = redisTemplate.opsForList();
//set类型数据操作 不能有重复成员无序排列
SetOperations setOperations = redisTemplate.opsForSet();
//zset类型数据操作 不能有重复成员且每个成员都有一个浮点类型的分数
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
}
}
启动测试类,说明RedisTemplate对象注入成功,并且通过该RedisTemplate对象获取操作5种数据类型相关对象。
接下来对5种常见类型进行操作
1、String字符串类型数据
/**
* 操作字符串类型的数据
*/
@Test
public void testString(){
//set设置key值
redisTemplate.opsForValue().set("name","月亮");
//get 获取key值
String city = (String) redisTemplate.opsForValue().get("name");
System.out.println(city);
//设置该键值3分钟后过期
redisTemplate.opsForValue().set("code","1234",3, TimeUnit.MINUTES);
//setIfAbsent当key不存在时设置key的值
redisTemplate.opsForValue().setIfAbsent("lock","1");
redisTemplate.opsForValue().setIfAbsent("lock","2");
String lock = (String) redisTemplate.opsForValue().get("lock");
System.out.println(lock);
}
运行该测试方法:
同时可以打开Redis可视化工具查看数据的存储:
2、Hash哈希类型数据
/**
* 操作哈希类型的数据
*/
@Test
public void testHash(){
//创建hash操作对象
HashOperations hashOperations = redisTemplate.opsForHash();
//put 设置hash表中的键和字段
hashOperations.put("LOL","name","盖伦");
hashOperations.put("LOL","age","20");
//get 获取指定字段的值
String name = (String) hashOperations.get("LOL", "name");
System.out.println(name);
//获取键中字段的key
Set keys=hashOperations.keys("LOL");
System.out.println(keys);
//获取key中字段的value值
List values=hashOperations.values("LOL");
System.out.println(values);
//删除指定字段
hashOperations.delete("100","age","name");
}
运行该测试方法:
Redis中存储:
3、List顺序类型数据
/**
* 操作列表类型的数据
*/
@Test
public void testList(){
ListOperations listOperations = redisTemplate.opsForList();
//leftPushAll 将多个值插入列表头部 先插入的数据在最后
listOperations.leftPushAll("MM","小七","小樱","小枫","小山");
//leftPush 向列表中插入单个值
listOperations.leftPush("MM","神木丽");
//range获取列表中指定范围内的元素
List mm= listOperations.range("MM", 0, -1);
System.out.println(mm);
//rightPop移除列表中的最后一个元素
listOperations.rightPop("MM");
//range获取列表中指定范围内的元素(0,-1)就是所有数据
List mm1= listOperations.range("MM", 0, -1);
System.out.println(mm1);
//获取列表的大小
Long size = listOperations.size("MM");
System.out.println(size);
}
运行该测试方法:
Redis中存储:
4、Set无序集合类型数据
/**
* 操作集合类型的数据
*/
@Test
public void testSet(){
SetOperations setOperations = redisTemplate.opsForSet();
//add向集合添加一个或多个成员
setOperations.add("set1","a","b","c","d");
setOperations.add("set2","a","b","x","y");
//members返回集合中的所有成员
Set members = setOperations.members("set1");
System.out.println(members);
//获取集合的成员数
Long size = setOperations.size("set1");
System.out.println(size);
//获取指定集合的交集
Set intersect = setOperations.intersect("set1", "set2");
System.out.println(intersect);
//获取指定集合并集
Set union = setOperations.union("set1", "set2");
System.out.println(union);
//移除集合中的成员
setOperations.remove("set1","a","b");
}
运行该测试方法:
Redis中存储:
5、ZSet有序集合类型数据
//操作有序集合类型的数据
@Test
public void testZset(){
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
//向集合中添加成员
zSetOperations.add("A","花",99);
zSetOperations.add("A","枫",88);
zSetOperations.add("A","七",66);
//返回指定范围内集合的成员
Set zset = zSetOperations.range("A", 0, -1);
System.out.println(zset);
//给集合中指定成员的分数加增量
zSetOperations.incrementScore("A","枫",10);
//移除指定成员
zSetOperations.remove("A","七");
}
运行该测试方法:
Redis中存储:
通用命令
/**
* 通用命令操作
*/
@Test
public void testCommon(){
//查找所有key
Set keys = redisTemplate.keys("*");
System.out.println(keys);
//检查给定的key是否存在
Boolean name = redisTemplate.hasKey("name");
Boolean av = redisTemplate.hasKey("A");
//遍历所有key存储的数据类型
for (Object key : keys) {
DataType type = redisTemplate.type(key);
System.out.println(type.name());
}
//删除指定key
redisTemplate.delete("MM");
redisTemplate.delete("LOL");
redisTemplate.delete("lock");
redisTemplate.delete("name");
}
运行该测试方法:
Redis中存储: