Spring Data Redis源码解析

Spring Data Redis

Spring Data Redis是较大的Spring Data系列的一部分,可轻松配置并从Spring应用程序访问Redis。它提供了与商店交互的低层和高层抽象,使用户摆脱了基础设施的困扰。

.为什么使用Spring Data Redis?

Spring框架是领先的全栈Java / JEE应用程序框架。它提供了一个轻量级的容器和一个非侵入性编程模型,该模型通过使用依赖项注入,AOP和可移植服务抽象来实现。

NoSQL存储系统为水平可伸缩性和速度提供了传统RDBMS的替代方案。在实现方面,键值存储代表NoSQL空间中最大(和最旧)的成员之一。

Spring Data Redis(SDR)框架通过Spring出色的基础架构支持消除了与存储库交互所需的冗余任务和样板代码,从而简化了编写使用Redis键值存储库的Spring应用程序的过程。

SpringBoot对Redis的支持

1. Redis 连接
spring redis封装了不同redis 客户端,对于底层redis客户端的抽象分装,使其能够支持不同的客户端,基于工厂模式和代理模式设计的spring redis 连接管理模块,可以方面接入不同的redis客户端, Jedis,Jredis,Rjc等,而不影响上层代码
连接接管理模块的类大概有以下:

类名 作用
RedisCommands 继承了Redis各种数据类型操作的整合接口(BaseRedisCommands, RedisClusterCommands, RedisGeoCommands, RedisHashCommands, RedisHLLCommands, RedisKeyCommands, RedisListCommands, RedisScriptingCommands, RedisServerCommands, RedisSetCommands, RedisSortedSetCommands, RedisStreamCommands, RedisStringCommands, RedisTransactionalCommands
RedisConnection 抽象了不同底层redis客户端类型:不同类型的redis客户端可以创建不同实现,提供了Redis通信的核心构建块,它处理与Redis后端的通信
RedisConnectionFactory 抽象Redis连接工厂,不同类型的redis客户端实现不同的工厂( RedisConnection getConnection();)
JedisConnection 实现RedisConnection接口,将操作委托给Jedis
JedisConnectionFactory 实现RedisConnectionFactory接口,创建JedisConnection

2. 通过RedisTemplate处理对象
2.1. Redis Template 的注入
当要使用Spring Boot提供的redis客户端功能时,注入RedisTemplate的流程

1.pom中引入spring-boot-starter-data-redis,并配置application.properties。

 <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-data-redisartifactId>
        dependency>
spring.datasource.driverClassName=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:mldn
spring.datasource.username=scott
spring.datasource.password=tiger
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

2.pom会根据spring-boot-starter-data-redis来引入spring-data-redis。
Spring Data Redis源码解析_第1张图片
3.spring-data-redis中包含RedisOperations类。
Spring Data Redis源码解析_第2张图片
Spring Data Redis源码解析_第3张图片
4.启动Spring Boot,在refreshContext(context);中会初始化beanFactory,读取配置信息,初始化Spring容器,注入bean。因为@EnableAutoConfiguration开启的关系,会读取配置中EnableAutoConfiguration相关的类,并实例化注入Spring 容器。
5.根据配置文件扫描到RedisAutoConfiguration。当RedisOperations存在时RedisAutoConfiguration才会被扫描。
6.通过@EnableConfigurationProperties(RedisProperties.class)和@ConfigurationProperties(prefix = “spring.redis”),把application.properties中的对应属性进行绑定,并注入RedisProperties配置类。
7.RedisAutoConfiguration中的@Import会引入LettuceConnectionConfiguration和JedisConnectionConfiguration
8.LettuceConnectionConfiguration和JedisConnectionConfiguration被扫描,扫描到内部的@Bean,使用上一步中注入的RedisProperties bean作为参数来实例化LettuceConnectionFactory和JedisConnectionFactory,并以RedisConnectionFactory类注入Spring容器。
8.扫描并注入RedisAutoConfiguration类内的@Bean,其中会使用RedisConnectionFactory bean作参数实例化RedisTemplate。
9.将RedisTemplate实例注入。
10.然后就能通过引用RedisTemplate来操作redis了。
2.2 Redis Template 的操作方法
RedisTemplate是Spring为方便操作Redis各种命令而封装出来的工具类,是spring data redis 中的核心操作类,提供了丰富的,通用的接口,用于针对某种类型或某些键

Spring Data Redis源码解析_第4张图片
按键类型操作

GeoOperations Redis的地理空间操作的,比如GEOADD,GEORADIUS…
HashOperations Redis哈希操作
HyperLogLogOperations Redis的HyperLogLog操作,例如PFADD,PFCOUNT,…
ListOperations Redis列表操作
SetOperations Redis设置操作
ValueOperations Redis字符串(或值)操作
ZSetOperations Redis zset(或排序集)操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Spring Data Redis源码解析_第5张图片
在这里插入图片描述
关键绑定操作

BoundGeoOperations Redis键绑定地理空间操作
BoundHashOperations Redis哈希键绑定操作
BoundKeyOperations Redis键绑定操作
BoundListOperations Redis列表键绑定操作
BoundSetOperations Redis设置键绑定操作
BoundValueOperations Redis字符串(或值)键绑定操作
BoundZSetOperations Redis zset(或排序集)键绑定操作

配置后,该模板是线程安全的,并且可以在多个实例之间重用

RedisOperations
RedisTemplate实现了RedisOperations
在这里插入图片描述
RedisOperations(封装了Redis的各种数据操作)
其中每一种操作类型有都进行了接口封装.下面就看一下五种数据类型的操作接口
ValueOperations
Spring Data Redis源码解析_第6张图片
ListOperations对应List

Spring Data Redis源码解析_第7张图片

SetOperations对应Set
Spring Data Redis源码解析_第8张图片
ZSetOperations对应 sortedSet
Spring Data Redis源码解析_第9张图片
HashOperations对应于Hash.
Spring Data Redis源码解析_第10张图片
两个模板类提供的数据访问方法.(五种类型的数据操作方法).这些方法调用Redis的命令的方式提供了实现.当然还有基于注解的操作Redis.

 opsForValue():操作只有简单属性的数据.String.

 opsForList():操作含有list的数据.

 opsForSet():操作含有set的数据

 opsForZSet():操作含有ZSet(有序的set)的数据.

 opsForHash():操作含有hash的数据.

3. 序列化器 Serializer
在Spring Data中,用户(自定义)类型和原始数据之间的转换(反之亦然)在org.springframework.data.redis.serializer包中的Redis中进行处理
我们数据存储到Redis的时候,我们的键值Key和Value都是通过Spring提供的Serializer序列化到db中的
Spring Data Redis源码解析_第11张图片
spring data 提供的序列化工具
Spring Data Redis源码解析_第12张图片
JdkSerializationRedisSerializer,默认用于RedisCache和RedisTemplate的StringRedisSerializer。

你可能感兴趣的:(Spring Data Redis源码解析)