Spring Boot 中整合 Redis

Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。

自行从官网下载 redis

前端查询工具:RedisDesktopManager

在 Spring Boot 中整合 Redis 主要包含依赖添加、实体类定义、Repository 接口编写、配置文件设置及测试等步骤,以下是详细实现流程:

一、添加 Redis 依赖

pom.xml中引入 Spring Data Redis 启动器:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

二、定义实体类

使用@RedisHash注解标记实体类,并通过@Id@Indexed等注解配置字段映射:

// Person.java
@RedisHash("persons")  // 定义Redis中存储的哈希表名
public class Person {
    @Id  // 主键标识
    private String id;
    
    @Indexed  // 标记可索引字段,用于查询
    private String firstname;
    
    @Indexed
    private String lastname;
    
    private Address address;
    private List<Family> familyList;
    
    // 构造方法、getter和setter省略
}

// Address.java
public class Address {
    @Indexed
    private String city;
    
    @Indexed
    private String country;
    // getter和setter省略
}

// Family.java
public class Family {
    @Indexed
    private String type;
    
    @Indexed
    private String username;
    // getter和setter省略
}

三、编写 Repository 接口

继承CrudRepository接口,定义数据操作方法(支持按字段名查询、分页查询等):

public interface PersonRepository extends CrudRepository<Person, String> {
    // 按姓氏查询
    List<Person> findByLastname(String lastname);
    
    // 按姓氏分页查询
    Page<Person> findPersonByLastname(String lastname, Pageable page);
    
    // 按姓名和姓氏组合查询
    List<Person> findByFirstnameAndLastname(String firstname, String lastname);
    
    // 按地址城市查询(通过嵌套属性)
    List<Person> findByAddress_City(String city);
    
    // 按家庭成员用户名查询(通过集合属性)
    List<Person> findByFamilyList_Username(String username);
}

四、配置 Redis 连接

application.propertiesapplication.yml中添加 Redis 服务器连接信息:

# application.properties配置
spring.redis.host=127.0.0.1       # Redis服务器地址
spring.redis.port=6379            # Redis端口
spring.redis.password=            # Redis密码(若无则留空)
spring.redis.database=0           # 使用的数据库索引(默认0)
spring.redis.timeout=3000ms       # 连接超时时间

五、编写测试类

通过单元测试验证 Redis 操作功能:

import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageRequest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisTests {
    @Autowired
    private PersonRepository repository;
    
    @Test
    public void testFindByCity() {
        // 查询地址为"北京"的所有Person
        List<Person> list = repository.findByAddress_City("北京");
        list.forEach(System.out::println);
    }
    
    @Test
    public void testPagedQuery() {
        // 按姓氏分页查询(第1页,每页10条)
        Page<Person> page = repository.findPersonByLastname("张", PageRequest.of(0, 10));
        System.out.println("总记录数:" + page.getTotalElements());
        page.getContent().forEach(System.out::println);
    }
    
    @Test
    public void testSavePerson() {
        // 保存数据到Redis
        Person person = new Person();
        person.setId("1");
        person.setFirstname("张三");
        person.setLastname("张");
        // 配置address和familyList...
        repository.save(person);
    }
}

六、高级配置与优化

  1. 自定义 RedisTemplate
    若需自定义序列化方式(如使用 JSON 序列化替代默认的 JDK 序列化),可添加配置类:

    java

    @Configuration
    public class RedisConfig {
        @Bean
        public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
            RedisTemplate<String, Object> template = new RedisTemplate<>();
            template.setConnectionFactory(factory);
            
            // 使用JSON序列化
            Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
            template.setValueSerializer(serializer);
            template.setHashValueSerializer(serializer);
            
            // 字符串键序列化
            template.setKeySerializer(new StringRedisSerializer());
            template.setHashKeySerializer(new StringRedisSerializer());
            
            template.afterPropertiesSet();
            return template;
        }
    }
    
  2. 缓存注解集成
    结合 Spring Cache 注解简化缓存操作(需在启动类添加@EnableCaching):

    @Service
    public class PersonService {
        @Autowired
        private PersonRepository repository;
        
        @Cacheable(value = "persons", key = "#id")
        public Person getPersonById(String id) {
            return repository.findById(id).orElse(null);
        }
        
        @CacheEvict(value = "persons", key = "#id")
        public void deletePerson(String id) {
            repository.deleteById(id);
        }
    }
    

七、注意事项

  1. 索引与查询性能
    @Indexed注解会为字段创建索引,提升查询效率,但会增加写入开销,按需使用。

  2. 事务支持
    Redis 本身不支持事务,但 Spring Data Redis 提供了RedisTransaction接口,可实现批量操作的原子性。

  3. 集群配置
    若使用 Redis 集群,需在配置中添加:

    spring.redis.cluster.nodes=192.168.1.1:7000,192.168.1.2:7001
    spring.redis.cluster.max-redirects=3
    

通过以上步骤,可在 Spring Boot 中高效整合 Redis,实现数据的缓存、高速查询及持久化存储。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值