美文网首页
spring整合jedis(单节点)

spring整合jedis(单节点)

作者: 水煮鱼又失败了 | 来源:发表于2020-08-08 21:49 被阅读0次

1 场景

spring中使用jedis整合单节点redis。

redis官网:https://redis.io/

spring集成redis官网:https://spring.io/projects/spring-data-redis

1.1 版本说明

jdk版本:1.8

spring版本:5.2.2.RELEASE

spring-data-redis版本:2.3.2.RELEASE

jedis版本:3.3.0

redis版本:5.0.8

连接redis组件:jedis

redis部署方式:单节点

1.2 代码地址

https://github.com/yjhcpdd/mymvc

1.3 项目结构

--java
--resources
    --conf
        -mybatis-redis.xml**[1]
        -spring.xml*********[2]
    --properties
        -redis.properties***[3]

2 整合步骤

2.1 配置maven依赖

pom.xml中配置相关依赖包(完整配置,可参见源码):

<dependencies>
    ...
    <!-- ==========【redis】========== -->
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-redis</artifactId>
        <version>2.3.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
        <version>2.8.1</version>
    </dependency>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.3.0</version>
    </dependency>
</dependencies>

2.2 配置redis配置文件

创建数据库配置文件redis.properties[3],增加如下配置:

#redis数据库连接配置
redis.hostName=192.168.1.11
redis.port=6379
redis.password=123456
redis.database=0

2.3 引入redis配置文件

spring配置文件中引入redis配置文件

<context:property-placeholder location="classpath:properties/redis.properties" />

2.4 spring中配置redis

更改jedis的spring配置文件mybatis-redis.xml[1]

<!-- 密码配置 -->
<bean id="redisPassword" class="org.springframework.data.redis.connection.RedisPassword" factory-method="of">
    <constructor-arg name="passwordAsString" value="${redis.password}" />
</bean>

<!-- 连接配置 -->
<bean id="redisStandaloneConfiguration"
      class="org.springframework.data.redis.connection.RedisStandaloneConfiguration">
    <property name="hostName" value="${redis.hostName}"/>
    <property name="port" value="${redis.port}"/>
    <property name="password" ref="redisPassword"/>
    <property name="database" value="${redis.database}"/>
</bean>

<!-- 连接池配置(根据需要配置连接池优化参数) -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <!-- 优化参数 -->
</bean>

<!-- 客户端连接配置 -->
<bean id="jedisClientConfiguration"
      class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory$MutableJedisClientConfiguration"
      factory-method="create">
    <constructor-arg name="jedisPoolConfig" ref="jedisPoolConfig"/>
</bean>

<!-- 连接工厂 -->
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    <!-- "单机"连接配置 -->
    <constructor-arg name="standaloneConfig" ref="redisStandaloneConfiguration"/>
    <!-- 客户端连接配置 -->
    <constructor-arg name="clientConfig" ref="jedisClientConfiguration"/>
</bean>

<!-- 字符串句柄 -->
<bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
    <constructor-arg name="connectionFactory" ref="jedisConnectionFactory"/>
</bean>

这里配置了redis常用的操作句柄stringRedisTemplate,如需要其他句柄实现,可以自己集成泛型类org.springframework.data.redis.core.RedisTemplate,自定义自己的泛型实现。

3 使用

spring中使用redis,只需要将redis的句柄stringRedisTemplate注入到spring环境中即可。

@Autowired
private StringRedisTemplate stringRedisTemplate;

句柄使用时,可调用对应的opsForXXX来操作不同类型的数据,如下:

//字符串句柄写法
stringRedisTemplate.opsForValue().set("k1", "v1");
stringRedisTemplate.opsForValue().get("k1");

在使用此句柄时,不需要自己手动关闭连接,查看源码,可以看到RedisTemplate.java中已经自动执行了连接的回收操作:

@Nullable
<T> T execute(RedisCallback<T> callback, boolean exposeConnection) {
    return template.execute(callback, exposeConnection);
}

public <T> T execute(RedisCallback<T> action, boolean exposeConnection, boolean pipeline) {
    //校验
    RedisConnectionFactory factory = getRequiredConnectionFactory();
    RedisConnection conn = null;
    try {
        //真正的数据库操作action
    } finally {
        RedisConnectionUtils.releaseConnection(conn, factory, enableTransactionSupport);
    }
}

4 扩展

如默认jedis默认提供的操作句柄stringRedisTemplate中提供的方法不能满足自己需求,又不想自定义泛型扩展类RedisTemplate。可以通过stringRedisTemplate获取原始的redisTemplate,手动编写回调方法execute,来实现需要的功能:

//调用原生jedis回调写法
stringRedisTemplate.execute((RedisCallback<Object>) connection -> {
    connection.flushAll();
    return null;
});

此种方式,可以通过更改匿名类中的泛型类型,来设置回调方法返回的数据类型,从而返回相应的执行结果。

相关文章