
SpringBoot整合Redis实现分布式缓存、分布式锁等,实战分享!
一、摘要
在前几篇文章中,我们详细介绍了 redis 的一些功能特性以及主流的 java 客户端 api 使用方法。
在当前流行的微服务以及分布式集群环境下,Redis 的使用场景可以说非常的广泛,能解决集群环境下系统中遇到的不少技术问题,在此列举几个使用 redis 经常用到的功能!
- 分布式缓存:在分布式的集群架构中,将缓存存储在内存中会出现很多的问题,比如用户回话信息,因为这部分信息需要与其他机器共享,此时利用 Redis 可以很好的解决机器之间数据共享的问题,缓存也是 Redis 中使用最多的场景
- 分布式锁:在高并发的情况下,我们需要一个锁来防止并发带来的脏数据,Java 自带的锁机制显然对进程间的并发并不好使,此时利用 Redis 的单线程特性,实现分布式锁控制
- 接口限流:在集群环境下,可以利用 redis 的分布式自增ID功能,精准的统计每个接口在指定时间内的请求次数,利用这个特性,可以定向限制某个接口恶意频刷
当然 Redis 的使用场景并不仅仅只有这么多,还有很多未列出的场景,如发布/订阅,分布锁集合等。
现实中我们大部分的微服务项目,都是基于 SpringBoot 框架进行快速开发,在 SpringBoot 项目中我们应该如何使用 Redis 呢?
代码实践如下!
二、代码实践
2.1、添加 redis 相关依赖包
实际上,在 SpringBoot 项目中,使用redis
非常简单,开发者只需要在项目中添加如下的依赖即可!
在之前的 redis 系列文章中,我们知道官方推荐的 java 版本的 redis 客户端,一共有三个,分别是Jedis
、Lettuce
和Redisson
,其中大部分场景下,使用Jedis
或者Lettuce
就足够了。
在 SpringBoot 1.x 版本里面,spring-boot-starter-data-redis
默认集成的客户端是Jedis
;从 SpringBoot 2.x 开始,spring-boot-starter-data-redis
默认集成的客户端是Lettuce
。
以springBoot-2.1.0
版本为例,我们打开spring-boot-starter-data-redis
依赖配置,核心配置如下!
可以很清晰的看到,spring-boot-starter-data-redis
默认集成的客户端是Lettuce
。
2.2、配置 redis 相关连接信息
依赖包添加完成之后,我们还需要在application.properties
全局配置文件中,添加相关的 redis 配置信息。
最后,我们来跑一个最简单的单元测试,看看是否能联通(确保 redis 的服务端已经启动)。
如果控制台输出正常,说明基本配置已经完成,如果有错误,看错误信息然后依次排查!
2.3、重新配置 RedisTemplate 的序列化策略
SpringBoot 为我们提供了一个高度封装的RedisTemplate
类来操作redis
的各个命令,开发者无需关心具体的客户端 api 问题,通过RedisTemplate
提供的方法,就可以操作redis
,方便开发者可以无成本替换 java 客户端。
当我们存储对象的时候,RedisTemplate
默认采用的是 Jdk 提供的序列化工具库,该工具有个要求,缓存的对象必须显式实现序列化接口,才能保存。
通常情况下,我们会自定义RedisTemplate
的序列化策略,采用Jackson
将对象转成json
,查询的时候将json
转成对象。
具体实现如下:
2.4、RedisTemplate 使用介绍
我们知道,redis 提供的数据结构很丰富,支持字符串、哈希表、列表、集合、有序集合等数据类型的存储,RedisTemplate
对这五种数据结构分别定义了不同的操作类,具体如下:
-
ValueOperations
:操作最简单的K-V
数据 -
ListOperations
:操作list
类型的数据 -
HashOperations
:操作hash
类型的数据 -
SetOperations
:操作set
类型的数据 -
ZSetOperations
:操作zset
类型的数据
相关的 api 操作如下!
2.4.1、操作字符串的 api
2.4.2、操作对象的 api
2.4.3、操作列表的 api
2.4.4、操作哈希的 api
2.4.5、操作集合的 api
2.4.6、操作有序集合的 api
2.4.7、操作分布锁相关的 api
2.5、如果要换成 jedis,如果更换?
从 SpringBoot 2.x 开始,spring-boot-starter-data-redis
默认集成的客户端是Lettuce
,但是有的项目使用了Jedis
依赖包相关的代码,如何无缝替换呢?
在pom.xml
文件中,添加Jedis
依赖包,排除相关的包即可,示例代码如下:
最后,在application.properties
中,添加jedis
相关配置,内容如下:
2.6、手动封装一个分布式锁实现类
默认情况下,无论是Jedis
还是Lettuce
,都没有为我们提供redis
分布式锁的实现,因此我们自己进行封装,当然你也可以直接添加Redisson
包,里面也提供了分布式锁实现的相关 API。
如果当前 redis 是单机环境,或者哨兵模式,我们完全可以自行封装一个分布式锁实现类,具体代码如下:
三、关于 key 的设计
通常情况下,我们对key
采用如下方式进行设计,以便与其他项目中的key
错开,避免发生冲突!
其次,无论什么时候,只要有可能就利用key
超时的优势,尽可能避免数据永久存储,因为一旦所有的key
都永久存储,大量无效的key
,会服务器资源非常严重不足,甚至不可用!
四、小结
本文主要围绕在 SpringBoot 项目中,如何集成 redis 并正确使用进行了简单的分享,内容难免有缺漏,欢迎网友留言指出!
五、参考
1、博客园 - 卡斯特梅的雨伞 - springboot中RedisTemplate的使用
文章转载自公众号:Java极客技术
