[转]SpringBoot集成Redis分布式锁以及Redis缓存
1. 集成Redis
首先在pom.xml中加入需要的redis依赖和缓存依赖
第二个spring-boot-start-cache的依赖,是使用缓存注解需要的,我在项目中没有引入。
因为我在websocket中已经引入了。
查询依赖关系 ctrl+shift+alt+u 快捷键(也可以在pom.xml文件上右键->Maven->Show Dependencies…)查询maven包依赖引入关系,ctrl+f搜索包
SpringBoot的yml配置文件下增加redis的配置:
输入你自己Redis服务器的地址,端口和密码,没有密码的就不要password了。
2. 实现Redis分布式锁
在类中直接使用如下代码即可注入Redis的操作类
2-1. 简单的操作
更多的Redis内容请看: http://redis.cn/
set
使用存储的时候,最后要设置一个过期时间,就算是几年,你也要设置一个过期时间。否则会一直占用存储空间的
delete
get
2-2. 分布式锁
接下来就是讲分布式锁了。
假设在一个活动中,商品的特价出售,限时秒杀场景。比如双11的。
通常的做法,有乐观锁和悲观锁
介绍乐观锁和悲观锁是什么我就不介绍了。
其实这里的Redis分布式锁也算是一种乐观锁。也就是即使资源被锁了,后来的用户不会被阻塞,而是返回异常/信息给你,告诉你操作(在这里是抢购)不成功。
实现起来很简单。看下面的类:
这个是Redis加锁和解锁的工具类
里面使用的主要是两个命令,SETNX和GETSET。
SETNX命令 将key设置值为value,如果key不存在,这种情况下等同SET命令。 当key存在时,什么也不做
GETSET命令 先查询出原来的值,值不存在就返回nil。然后再设置值
对应的Java方法在代码中提示了。
注意一点的是,Redis是单线程的!所以在执行GETSET和SETNX不会存在并发的情况。
下面来看我们使用该类加锁解锁的类:
在上面是用Map来模拟查询数据库的操作了,sleep是为了模拟一些io操作的时间
你可以用apache ab工具进行高并发模拟。
3. Redis缓存
接下来就讲下缓存了
首先当然是导入Maven依赖咯
接下来就是在springboot启动类上加上注解:
因为我们上面已经在配置文件配置好了 redis的地址,账号。就不需要再配置了。
下面你就可以使用注解缓存了
3-1. 在Controller层的使用
在这里,product其实就相当于一个命名空间。key的话,在更新缓存,删除缓存的时候用到的。
注意,方法返回的对象加了缓存注解的,一定要实现序列化!
然后,我们可以在增删改的地方加上删除缓存,或者更新缓存的注解。
但是假如我们不想使用CacheEvict删除缓存呢,只希望更新缓存呢,但是这里的返回值是ModelAndView,和前面的ResultVO不一样,而且无法序列化ModelAndView。所以在这里写注解,肯定只能是删除缓存的注解CacheEvict
其实我们可以去service层写缓存注解的,或者是Dao层,这样,返回对象是受我们控制的了。
3-2. 在service层使用缓存
在整个类上注解
这样,这个类下的方法就不用再写cacheNames了 。
3-3. 缓存注解的另外一些值
key我们是可以动态设置的
可以根据参数来进行判断,是否缓存
这样只有条件成立才会直接返回缓存,结果不成立是不缓存的,即使有缓存,也会运行方法
还可以根据返回结果来判断是不是缓存这个结果
依据结果来判断是否缓存 unless = “#result.getCode() != 0”,#result其实就是ResultVO,也就是返回的对象
unless(除什么之外,如果不 的意思) 如果=0就缓存,需要写成!=0。理解起来就是,除了不等于0的情况之外,才缓存,也就是等于0才缓存。
其实就是,你想要什么条件下缓存,你写在这里面,把条件反过来写就行了
你如果测试缓存的话,你可以在方法内打一个断点进行测试。没有运行那个方法就获取到数据了,证明缓存生效了。
最后,注意,返回的缓存对象一定要实现序列化!!!
4. 项目地址:
GITHUB项目地址: https://github.com/chenhaoxiang/WeChatOrderSystem
[source]SpringBoot集成Redis分布式锁以及Redis缓存