Spring-data-redis 学习笔记(香蕉个棒棒锤让人直接裂开的原理简述)
Spring-data-redis 学习笔记(香蕉个棒棒锤让人直接裂开的原理简述)
简单了解Spring-data-redis
SpringDataRedis是spring大家族中的一部分,提供了在spring应用中通过简单的配置访问redis服务,对redis底层开发包(Jedis,JRedis,andRJC)进行了高度封装,RedisTemplate提供了redis各种操作,异常处理及序列化,支持发布订阅,并对Spring3.1cache进行了实现.
在这里不关注于redis上,而关注Spring-data-redis上。
RedisConnection
RedisConnection是Spring为了整合各个redis的API而开放的接口,如Jedis,Jredis,Lettuce等,通过这个接口消除了各个API之间的差别,从而达到整合的作用。
同时,提供了Redis通信的核心构建块,因为它处理与Redis后端通信。它还自动将底层连接库异常转换为Spring一致的DAO异常层次结构,这样您就可以在不更改任何代码的情况下切换连接器,因为操作语义保持不变。(翻译自官网解释,其实简单理解下,就是用来连接Redis的)
看看类图。
可以看到,RedisConnection继承了RedisCommands接口,而RedisCommands又继承了很多很多接口。
随便点进去一个看一看,找几个咱认识的。
虽说是英文,但咱好歹还是看的出来这是判断key是否存在的一个抽象方法,那么也可以判断出,这些类存放着操作Redis的命令。
OK。
既然RedisCommands继承所有命令,拥有所有的redis操作命令。
那么说明只要拥有RedisConnection就能执行redis客户端的所有命令。
而各个连接的实现类都继承抽象类AbstractRedisConnection,而这个抽象类实现了 RedisConnection 接口。所以对于使用者而言,只需要知道 RedisConnection 接口的 API 就可以消除各个 API 的差异了。
而且Spring 会提供创建这个接口对象的工厂----RedisConnectionFactory(这里不做多阐述)。
再用工具看看。
点进去,看看代码行数咱们也知道它实现了RedisConnection接口。
附上带佬的图。
知道了怎么封装Redis命令后,再来看看Spring的具体实现。
Spring实现Redis命令
OK,CV一下。
Spring对Redis的6种数据类型的命令进行了更深层次封装,封装为6个接口:
• ValueOperations 一键值对操作接口
• HashOperations 一哈希操作接口
• ListOperations一一链表操作接口
• SetOperations 一一无序集合操作接口
• ZSetOperations一一有序集合操作接口
• HyperLogLogOperations一一基数操作接口 。
Spring也会为它们提供默认的实现类, 在大部分情况下只要使用Spring提供的实现类即可,这些实现类是: DefaultValueOperations、DefaultHashOperations、DefaultListOperations、 DefaultSetOperations、 DefaultZSetOperations和 DefaultHyperLogLogOperations。 通过名字即可知道这些实现类对应的操作命令是什么。
继续随便点一个看看。
实现了ValueOperations接口的同时也继承了AbstractOperations,是不是只有这一个是特例呢?
点开瞧瞧。
可以看到似乎都继承了这个抽象类。
咱也不懂啊,baidu一下。
Spring把 key和 value转化为 rawKey和 rawValue,然后通过 RedisConnection的set方法发给 Redis 存储。其实就是将key和value转换为字节,由Spring 通过 AbstractOperations 抽象类进行转化,它有两个方法 rawKey 和 rawValue。
再去找到这两个方法。
转换成了字节去让redis保存,妙啊。
问题来了,怎么存对象呢?
答:序列化
Redis 序列化
使用 Redis 进行存储,取回序列化的内容后,通过转换转变为 Java 对象, Spring 模板中提供了封装的方案,在它内部提供了 RedisSerializer 接口和一些实现类。
这时,就需要序列化和反序列化。
- 序列化:将数据存储到Redis中时需要,序列化能够使java的对象在传输和存储的过程中,能够成功的传输和读取
- 反序列化:从Redis中读取数据时需要,例如取出存储的对象时。
带佬的图。
举出RedisSerializer 的一些实现类。
GenericJackson2JsonRedisSerializer,通用的使用 Json2.jar 的包,将 Redis 对象的序 列化器。
Jackson2JsonRedisSerializer,通过 Jackson2.jar包提供的序列化进行转换。
JdkSerializationRedisSerializer, 使用 JDK 的序列化器进行转化。
OxmSerializer, 使用 SpringO/X 对象 Object和 XML相互转换。
StringRedisSerializer, 使用字符串进行序列化 。
GenericToStringSerializer,通过通用 的字符串序列化进行相互转换。
最后的最后,简单了解一下模板类RedisTemplate。
RedisTemplate模板类
Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)。
而这个类里面则提供这些数据类型存储取出的具体方法。
在这里列举几个常用的。
String
String是redis最基本的存储类型,一个key对应一个value,数据库存储格式如下。
redisTemplate.opsForValue().set("num","123"); redisTemplate.opsForValue().get("num") 输出结果为123
Hash
System.out.println(template.opsForHash().delete("redisHash","name")); System.out.println(template.opsForHash().entries("redisHash")); 1 {class=6, age=28.1}
List
System.out.println(template.opsForList().size("list")); 6
Set
String[] strs= new String[]{"str1","str2"}; System.out.println(template.opsForSet().add("setTest", strs)); 2
最后的最后,附上带佬的链接:https://blog.csdn.net/striveb/article/details/85019370
- 点赞
- 收藏
- 分享
- 文章举报
- Java框架学习笔记——初识Spring之简述
- Redis学习笔记~把redis放在DATA层,作为一种数据源,我认为更合理,也更符合我的面向对象原则
- Spring Boot学习进阶笔记(四)-多数据源配置(JdbcTemplate、Spring-data-jpa)
- Spring Data JPA,基础学习笔记.
- Spring学习笔记——Spring依赖注入原理分析
- 简单springData学习笔记
- 分布式缓存技术redis学习系列(五)——spring-data-redis与JedisPool的区别、使用ShardedJedisPool与spring集成的实现及一致性哈希分析
- Spring中AOP原理,源码学习笔记
- spring 控制反转与依赖注入原理-学习笔记
- [spring入门学习笔记][spring的IoC原理]
- 遗传算法与直接搜索工具箱学习笔记 七-----模式搜索工作原理详解
- Spring Boot学习进阶笔记(三)-Spring-data-jpa
- Spring-data-jpa 学习笔记(二)
- 【redis】5.spring boot项目中,直接在spring data jpa的Repository层使用redis +redis注解@Cacheable直接在Repository层使用,报错问题处理Null key returned for cache operation
- Neo4j学习笔记九【Spring Data Neo4j】
- 剖析Spring管理Bean的原理(学习笔记)
- [Spring Data MongoDB]学习笔记--_id和类型映射
- spring-data-jpa 学习笔记一(转)
- Spring学习笔记——Sprin管理Bean的原理
- Spring Data Redis 学习(一)