您的位置:首页 > 数据库 > Redis

Spring-data-redis 学习笔记(香蕉个棒棒锤让人直接裂开的原理简述)

2020-01-15 11:00 1556 查看

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

  • 点赞
  • 收藏
  • 分享
  • 文章举报
colahhh 发布了5 篇原创文章 · 获赞 3 · 访问量 256 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: