spring整合redis

336 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情

上一篇学了 Java 连接 Redis - 掘金 (juejin.cn)

下面我们进行spring整合redis

介绍

Spring 整合 Redis 需要引入 spring-data-redis 这个依赖,此依赖中提供了 RedisTemplateStringRedisTemplate 这两个类,它们是对 Jedis Api 的高度封装。Spring data Redis 相对于 Jedis 来说可以方便的更换 Redis 的 Java 客户端,同时也提供了比 Jedis 更多的特性,方便与其他 Spring 框架进行搭配使用。 接下来我们会以 RedisTemplateStringRedisTemplate 中提供的 API 来操作 Redis 数据库,它们两者之间的区别是:

  • 两者的数据是不共通的,即 StringRedisTemplate 只能管理 StringRedisTemplate 里面的数据,RedisTemplate 只能管理 RedisTemplate 中的数据。

  • 它们使用的序列化不同。RedisTemplate 使用的是 JdkSerializationRedisSerializer ,存入数据会将数据先序列化成字节数组然后在存入 Redis 数据库;而 StringRedisTemplate 使用的是StringRedisSerializer

  • 两者使用场景:

    • 当你的 Redis 数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时候,那么你就使用 StringRedisTemplate 即可。
    • 如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从 Redis 里面取出一个对象,那么使用 RedisTemplate 是更好的选择。

通过官网我们可以找到,不同redis版本适用不同spring版本

image.png

如果想使用 Spring Data Redis 2.x 要求 JDK 1.8 及以上,Spring 也必须是 5.3.13 及以上。

连接步骤:

  1. 在 pom.xml 导入 spring-data-redis 和 Jedis 的依赖,同时将已有 JUnit 测试依赖的版本修改为 4.13.2
  2. 在 src/main 目录下新建 resources 文件夹,在其下面创建 sring-redis.xml 配置文件并添加连接 Redis 服务器相关的信息
  3. test 目录下新建一个 SpringRedisTest 类
  4. 通过redisTemplate.调用相关api。

关于api,我们可以直接查看,这里介绍一些常用api

string 类型 APIlist 类型 APIset 类型 APIzset 类型 APIhash 类型 API总结
数据结构操作redisTemplate.opsForValue():操作字符串redisTemplate.opsForList():操作 listredisTemplate.opsForSet():操作 setredisTemplate.opsForZSet():操作 zsetredisTemplate.opsForHash():操作 hashredisTemplate.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

image.png 其实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);
}