Spring Boot
除了支持常见的 ORM 框架外,更是对常用的中间件提供了非常好封装,随着Spring Boot2.x
的到来,支持的组件越来越丰富,也越来越成熟,其中对Redis
的支持不仅仅是丰富了它的API,更是 替换掉底层 Jedis
的依赖,取而代之 换成了Lettuce(生菜)
[TOC]
Redis介绍
Redis 是一个开源的使用 ANSIC 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。相比 Memcached
它支持存储的类型相对更多包括string(字符串)、list(链表、set(集合)、zset(sorted set –有序集合)和 hash(哈希类型),GEO,同时Redis是线程安全的。2010年3月15日起,Redis 的开发工作由 VMware 主持,2013年5月开始,Redis的开发由 Pivotal
赞助。
Lettuce
Lettuce
和 Jedis
的都是连接Redis Server
的客户端程序。Jedis
在 实现上是直连 redis server,多线程环境下非线程安全,除非使用连接池,为每个Jedis实例增加物理连接。Lettuce
基于Netty的连接实例(StatefulRedisConnection),可以在多个线程间并发访问,且线程安全,满足多线程环境下的并发访问,同时它是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。
环境/版本一览:
- 开发工具:Intellij IDEA 2018.2.2
- springboot: 2.0.5.RELEASE
- jdk:1.8.0_171
- maven:3.3.9
- lettuce:5.0.5.RELEASE
- commons-pool2:2.5.0
1、pom.xml
1 | <dependencies> |
2、application.yml
1 | spring: |
3、config
默认情况下的模板只能支持
RedisTemplate<String, String>
,也就是只能存入字符串,这在开发中是不友好的,所以自定义模板是很有必要
的,当自定义了模板又想使用String
存储这时候就可以使用StringRedisTemplate
、RedisTemplate<String, String>
这两种方式,它们并不冲突…
1 | package com.fatal.config; |
4、entity
1 | package com.fatal.entity; |
5、Test
1 | package com.fatal; |
6、控制台
测试模板 -> StringRedisTemplate
测试默认模板 -> RedisTemplate<String, String>
测试自定义模板 -> RedisTemplate<String, Serializable>
控制台
redis 图形化界面
Redis其它操作方式
下列的就是Redis
其它类型所对应的操作方式
- opsForValue: 对应 String(字符串)
- opsForZSet: 对应 ZSet(有序集合)
- opsForHash: 对应 Hash(哈希)
- opsForList: 对应 List(列表)
- opsForSet: 对应 Set(集合)
- opsForGeo: 对应 GEO(地理位置)
参考资料
spring-data-redis文档
Redis 文档
Redis 中文文档
一起来学SpringBoot | 第九篇:整合Lettuce Redis
总结
如果少 spring-boot-starter-web 依赖,会报错
1
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.JsonSerializer
如果少 commons-pool2 依赖,会报错
1
Caused by: java.lang.ClassNotFoundException: org.apache.commons.pool2.impl.GenericObjectPoolConfig
反序列化的时候,实体类必须含有 无参构造方法
1
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.fatal.entity.User`
序列化
1、序列化是干什么的?
简单说就是为了保存在内存中的各种对象的 状态 而非行为(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是 序列化 。2、什么情况下需要序列化
a)当你想把的内存中的对象状态保存到一个文件的时候;
b)当你想用套接字在 网络上传送对象 的时候;
c)当你想通过 RMI 传输对象 的时候;3、相关注意事项
a)序列化时,只对对象的状态进行保存,而不管对象的方法;
b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现 Serializable接口 ;
c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化。
SpringBoot
的知识已经有前辈在我们之前探索了。比较喜欢的博主有:唐亚峰 | Battcn、方志朋的专栏、程序猿DD、纯洁的微笑。对这门技术感兴趣的可以去他们的博客逛逛。谢谢他们的分享~~
以上文章是我用来学习的Demo
,都是基于 SpringBoot2.x
版本。
源码地址: https://github.com/ynfatal/springboot2-learning/tree/master/chapter14