Spring Data Redis 教程

StringRedisTemplate 便捷类

Spring Data Redis 为了方便操作字符串,提供了以字符串为中心的 StringRedisTemplate 便捷类。

由于存储在 Redis 中的键和值通常是 java.lang.String,因此 Redis 模块为 RedisConnection 和 RedisTemplate 提供了两个扩展实现,分别是 StringRedisConnection(及其 DefaultStringRedisConnection 实现)和 StringRedisTemplate

作为便捷的一站式解决方案,它们用于密集的字符串操作。除了绑定到字符串键之外,模板(template)和连接(connection)还使用了下面的 StringRedisSerializer 序列化器(字符串序列化器,可以将 Java 对象序列化为字符串),这意味着 Redis 中存储的键(key)和值(value)是人类可读的(假设在 Redis 和您的代码中使用相同的字符编码,没有出现乱码情况)。

使用XML方式配置StringRedisTemplate

如果你的项目是传统 Spring 项目,而非 Spring Boot 项目。那么需要在 Spring 的 XML 配置文件中配置 StringRedisTemplate 的Bean。application-content.xml 配置文件的内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 配置 Redis 连接工厂 -->
    <bean id="jedisConnFactory"
            class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
            p:use-pool="true"/>

    <!-- 配置 Redis 模板对象,设置 key 和 value 的序列化为字符串 -->
    <bean id="stringRedisTemplate"
            class="org.springframework.data.redis.core.StringRedisTemplate"
            p:connection-factory-ref="jedisConnFactory"/>
</beans>

接下来编写客户端测试代码,我们使用手动的方式去加载 appication-content.xml 配置文件和获取 Bean,代码如下:

package com.hxstrive.redis;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;

/**
 * 简单测试 StringRedisTemplate
 * @author hxstrive.com 2022/9/27
 */
public class StringRedisTemplateDemo {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "application-content2.xml");
        System.out.println("context = " + context);

        // 获取 StringRedisTemplate 对象
        StringRedisTemplate stringRedisTemplate = context.getBean(StringRedisTemplate.class);
        System.out.println("stringRedisTemplate=" + stringRedisTemplate);

        // 获取 Operations 对象
        ValueOperations<String,String> ops = stringRedisTemplate.opsForValue();
        ops.set("string-key", "hello world");
        // 获取值
        String value = ops.get("string-key");
        System.out.println("value=" + value);
    }

}

运行示例,输出结果:

context = org.springframework.context.support.ClassPathXmlApplicationContext@20fa23c1, started on Tue Sep 27 12:58:00 CST 2022
stringRedisTemplate=org.springframework.data.redis.core.StringRedisTemplate@78691363
value=hello world

注意:如果你使用的是 Spring 项目,则可以通过 @Autowired 注解自动注入 StringRedisTemplate。

使用 Configration 配置 StringRedisTemplate

上面介绍了怎样使用 XML 配置 StringRedisTemplate,下面将介绍使用 @Configration 配置类进行配置。代码如下:

配置类 RedisConfig.java

package com.hxstrive.redis.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;

/**
 * Redis配置
 * @author hxstrive.com 2022/2/26
 */
@Configuration
public class RedisConfig {
    @Bean
    public StringRedisTemplate stringStringRedisTemplate(RedisConnectionFactory factory) {
        StringRedisTemplate redisTemplate = new StringRedisTemplate();
        redisTemplate.setConnectionFactory(factory);
        return redisTemplate;
    }
}

客户端代码 StringRedisTemplateTest.java

package com.hxstrive.redis;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * StringRedisTemplate 测试类
 * @author hxstrive.com 2022/9/27
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class StringRedisTemplateTest {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    public void simple() {
        ValueOperations<String,String> ops = stringRedisTemplate.opsForValue();
        // 设置值
        ops.set("key", "hello world");
        // 获取值
        String value = ops.get("key");
        System.out.println("value=" + value);
    }

}

运行示例,输出结果:

value=hello world

注意,与其他 Spring 模板一样,RedisTemplate 和 StringRedisTemplate 可以通过 RedisCallback 接口直接与 Redis 对话。此功能可让您完全控制 Redis,因为它直接与 RedisConnection 对话。

当使用 StringRedisTemplate 时,回调会接收 StringRedisConnection 的实例。以下示例展示了如何使用 RedisCallback 接口:

package com.hxstrive.redis;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.StringRedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * StringRedisTemplate 测试类
 * @author hxstrive.com 2022/9/27
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class StringRedisTemplateTest {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    public void useCallback() {
        stringRedisTemplate.execute(new RedisCallback<String>() {
            @Override
            public String doInRedis(RedisConnection connection) throws DataAccessException {
                System.out.println("connection=" + connection);
                StringRedisConnection conn = (StringRedisConnection) connection;
                // 设置值
                conn.set("key", "test StringRedisConnection");
                // 获取值
                String value = conn.get("key");
                System.out.println("value=" + value);
                return null;
            }
        });
    }

}

运行示例,输出结果如下:

connection=org.springframework.data.redis.connection.DefaultStringRedisConnection@6403e24c
value=test StringRedisConnection
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号