【Spring Boot集成Redis】基础配置 使用Redis Repository简化RedisTemplate操作

6 篇文章 0 订阅

spring boot 引入redis

前言:
Spring Redis requires Redis 2.6 or above and Spring Data Redis integrates with Lettuce and Jedis, two popular open-source Java libraries for Redis.

Spring Redis 需要 Redis 2.6 或更高版本,Spring Data Redis 已经集成了Lettuce和Jedis,这是用于连接redis服务端的,比较流行的两个Java开源库。



1. 引入依赖

通过spring boot构建项目时,如果pom继承自spring-boot-starter-parent

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.1</version>
    <relativePath/>
</parent>

那么可以不用加版本号,直接引入就行

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




2. yml配置

spring:
  redis:
    host: localhost
    port: 6379
    password: admin123root
    database: 1

如果只使用RedisTemplate或StringRedisTemplate,那么以上的配置就足够使用了。




3. 设置配置类(缺省)

redis连接工厂在spring boot2.x版本后,默认使用LettuceConnectionFactory来创建与redis的连接(这个类的作用将在下一篇文章详细阐述),因此不用设置如下的配置类也能获取到RedisTemplate等相关bean。

@Configuration
public class RedisConfig {
	
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        return template;
    }
}




4. 扩展功能:Redis Repository

作用:

Redis Repositories 可以让我们在Redis哈希类型中转换和存储Java实体,支持自定义映射策略和二级索引。

注意:

  1. 使用该功能,需要保证Redis服务器版本在2.8.0之上
  2. 该功能并不支持Spring事务(RedisTemplate同样也不参与Spring事务,不过RedisTemplate可以用过在配置类添加@EnableTransactionManagement以启用事务支持)
  3. Redis Repositories的存储结构为<String, Hash>
  4. Redis Repositories的键构成形式:keyspace:id



RedisTemplate与Redis Repository的使用差异

一般来说,我们都是通过注入RedisTemplate<String, Object>或其派生类来CRUD redis数据的,如下:

@Resource
private StringRedisTemplate redisTemplate;

public String redisGetString(String id) {
    String name = redisTemplate.opsForValue().get(id);
    redisTemplate.opsForValue().set(id, "new name");
    return name;
}

RedisTemplate类使用的都是redis内部的数据结构,string、list、hash等等。

所以每次保存数据时,还需要开发者进行额外的转换操作,将值类型转为redis的底层支持,如下所示:

redisTemplate.opsForValue();
redisTemplate.opsForList();
redisTemplate.opsForSet();
redisTemplate.opsForZSet();
redisTemplate.opsForHash();

而通过使用Redis Repository功能,我们无须做这些工作(其默认就是以hash的数据结构来实现),也能更方便的使用redis的CRUD功能。



使用方式:

A. 设置实体类

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;

@Data
@RedisHash("User")
public class User {
    @Id
    private String id;
    
    private String name;
}

注意事项:

  • @Id标注了用于组成redis键的属性,当然如果实体中有名为id的属性,那么也可以不用设置@Id
  • redis中保存的键的形式为:keyspace:id,RedisHash中设置的值即是keyspace,若id="5"的话,那么redis的键可能为User:5。因此不同的实体尽量不要使用重复的keyspace。

B. 设置User的持久化存储接口

我们的自定义接口UserRedis并不需要自己的实现,在继承CrudRepository之后,UserRedis就拥有了基础的CRUD功能

@Repository
public interface UserRedis extends CrudRepository<User, String> {
}

CrudRepository<T, ID>:

  • T:值(value)
  • ID:键(key)

C. 在redis配置类中启用和扫描持久化存储接口

@Configuration
// 扫描CrudRepository实现类
@EnableRedisRepositories(basePackages = "cn.test.redis")
public class RedisConfig {
    // ………………

D. 注入并使用

@Resource
private UserRedis userRedis;

public Back<String> redisOps(String name) {
	User user = new User();
	String uuid = IdUtil.simpleUUID();
	user.setId(uuid);
	user.setName(name);
	// 新增or修改
	User save = userRedis.save(user);
	// id查询 
	User orElse = userRedis.findById(uuid).orElse(null);
	// 删除
	userRedis.deleteById(uuid);
	// 计数:根据keyspace统计可用总数
	long count = userRedis.count();
	Iterable<User> all = userRedis.findAll();
}

关于操作问题:

  • save:当user为null时,会生成一个随机的key,来组成完整的id — keyspace:key,并将值设为null。

上述是redis集成到spring boot的最简单配置,在redis没有做主从分离、哨兵、或者分布式集群的情况下,spring boot的默认功能已经满足需求。

但如果redis做了主从、集群,那么就需要通过RedisConnectionFactory配置,选择LettuceConnectionFactory或JedisConnectionFactory,来进行相应的读写分离设置、主从读写设置。

下一篇博客将着重描述这些内容

❤❤redis相关的其它文章❤❤




参考

  1. spring data redis
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值