开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情
上一篇学了 Java 连接 Redis - 掘金 (juejin.cn)
下面我们进行spring整合redis
介绍
Spring 整合 Redis 需要引入 spring-data-redis 这个依赖,此依赖中提供了 RedisTemplate、StringRedisTemplate 这两个类,它们是对 Jedis Api 的高度封装。Spring data Redis 相对于 Jedis 来说可以方便的更换 Redis 的 Java 客户端,同时也提供了比 Jedis 更多的特性,方便与其他 Spring 框架进行搭配使用。 接下来我们会以 RedisTemplate、StringRedisTemplate 中提供的 API 来操作 Redis 数据库,它们两者之间的区别是:
-
两者的数据是不共通的,即
StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理 RedisTemplate 中的数据。 -
它们使用的序列化不同。
RedisTemplate使用的是JdkSerializationRedisSerializer,存入数据会将数据先序列化成字节数组然后在存入 Redis 数据库;而StringRedisTemplate使用的是StringRedisSerializer。 -
两者使用场景:
- 当你的 Redis 数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时候,那么你就使用
StringRedisTemplate即可。 - 如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从 Redis 里面取出一个对象,那么使用
RedisTemplate是更好的选择。
- 当你的 Redis 数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时候,那么你就使用
通过官网我们可以找到,不同redis版本适用不同spring版本
如果想使用 Spring Data Redis 2.x 要求 JDK 1.8 及以上,Spring 也必须是 5.3.13 及以上。
连接步骤:
- 在
pom.xml导入spring-data-redis和Jedis的依赖,同时将已有 JUnit 测试依赖的版本修改为4.13.2 - 在
src/main目录下新建resources文件夹,在其下面创建sring-redis.xml配置文件并添加连接 Redis 服务器相关的信息 - 在
test目录下新建一个SpringRedisTest类 - 通过
redisTemplate.调用相关api。
关于api,我们可以直接查看,这里介绍一些常用api
| string 类型 API | list 类型 API | set 类型 API | zset 类型 API | hash 类型 API | 总结 | |
|---|---|---|---|---|---|---|
| 数据结构操作 | redisTemplate.opsForValue():操作字符串 | redisTemplate.opsForList():操作 list | redisTemplate.opsForSet():操作 set | redisTemplate.opsForZSet():操作 zset | redisTemplate.opsForHash():操作 hash | redisTemplate.opsForXXX |
| 存入数据 | redisTemplate.opsForValue().set(key, value) | redisTemplate.opsForList().leftPush(key, value);(左插入)redisTemplate.opsForList().rightPush(key, value)(右插入) | redisTemplate.opsForSet().add(key, value) | redisTemplate.opsForZSet().add(key, value) | redisTemplate.opsForHash().put(key, hashKey, value); | |
| 给指定键值的位置开始替换内容 | redisTemplate.opsForValue().set(key, value, offset); | redisTemplate.opsForList().set(key, index, value) | ||||
| 获取数据 | redisTemplate.opsForValue().get(key) | redisTemplate.opsForList().range(key, start, end) | redisTemplate.opsForZSet().score(key, o) | redisTemplate.opsForHash().get(key, hashKey) | ||
| 获取多个数据 | redisTemplate.opsForValue().multiGet(keys) | redisTemplate.opsForSet().members(key) | redisTemplate.opsForHash().multiGet(key, hashKeys);redisTemplate.opsForHash().entries(key) | |||
| 多个键值对的插入 | redisTemplate.opsForValue().multiSet(map) | redisTemplate.opsForList().rightPushAll(key, value);redisTemplate.opsForList().leftPushAll(key, value) | redisTemplate.opsForHash().putAll(key, m); | |||
| 返回键的值的长度 | redisTemplate.opsForValue().size(key) | redisTemplate.opsForList().size(key) | redisTemplate.opsForSet().size(key) | redisTemplate.opsForZSet().count(key, min, max) | redisTemplate.opsForHash().size(key) | xxsize,xxcount |
| 删除 | redisTemplate.opsForList().remove(key, count, value) | redisTemplate.opsForSet().remove(key, values) | redisTemplate.opsForZSet().remove(key, values) | redisTemplate.opsForHash().delete(key, hashKey) | xxremove,xxdelete | |
| 是否包含 | redisTemplate.opsForSet().isMember(key, valkey)redisTemplate.opsForSet().isMember(key, o) | redisTemplate.opsForHash().hasKey(key, hashKey) | ||||
| 获取两个集合的交并补 | redisTemplate.opsForSet().difference(key otherKey) 获取两个集合的差redisTemplate.opsForSet().intersect(key, otherKey)交集redisTemplate.opsForSet().union(key, otherKey)并 |
pom
其实springboot整合其他主流框架直接在后面加上名称即可,比如spring-boot-starter-redis,然后就直接可以用,可以直接注入了.
主要原因大概就是springboot框架已经包含了自动注入的功能,对于每一个引入的主要jar包(包含starter),都有一个factory的配置文件,里面配置了jar包的全路径,有了这个路径就可以将这些类处理然后注入到spring工厂中,我们就可以直接使用.
关于xml介绍
xml里面需要配置连接池,里面有 maxTotal最大连接数,maxIdle最大空闲连接数,umTestsPerEvictionRun每次释放连接的最大数目等参数
xml需要连接redis,通过constructor-arg标签
<!-- 连接 Redis -->
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<constructor-arg name="poolConfig" ref="jedisPoolConfig"/>
<constructor-arg name="host" value="127.0.0.1"/>
<constructor-arg name="port" value="6379"/>
</bean>
xml需要注入redisTemplate
<!-- 注入 RedisTemplate -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory" />
</bean>
SpringRedisTest
模板代码: 代码如下所示 👇:
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-redis.xml")
public class SpringRedisStringTest {
@Autowired
private RedisTemplate<String,String> redisTemplate;
}
api操作:
直接通过@test声明测试方法,然后通过redisTRemplate.opsForXXX().方法()
进行测试
下面通过几种数据结构的新增演示
String一次新增一个键值对:
@Test
public void testInsertOne(){
// 新增一个键值对
redisTemplate.opsForValue().set("name","zhangsan");
}
新增 list 类型
..
long result = redisTemplate.opsForList().leftPushAll("list1","zhangsan","yangguo","xiaolongnv","zhangwuji","赵敏");
System.out.println(result);
新增 set 类型的数据
long result = redisTemplate.opsForSet().add("set1","zhangsan","yangguo","xiaolongnv","zhangwuji","赵敏");
新增 zset 类型的成员
boolean flag = redisTemplate.opsForZSet().add("zset1","zhangsan",20.0);
System.out.println(flag? "新增成功":"新增失败");
}
新增 hash 类型的数据
@Test
public void testInsertHash(){
// 新增 hash 类型的数据
Map<String,String> param = new HashMap<String,String>();
param.put("name","zhangsan");
param.put("sex", "man");
param.put("address", "浙江杭州");
param.put("age", "19");
param.put("email", "33345567@qq.com");
param.put("phone", "19999995235");
redisTemplate.opsForHash().putAll("hash1", param);
}