1、spring-data-redis项目简介
1.1、spring-data-redis项目设计
1.2、RedisTemplate
1.3、Spring对Redis数据类型操作的封装
Redis能够支持7种类型的数据结构,这7种类型是字符串、散列、列表(链表)、集合、有序集合、基数和地理位置。
1.4、SessionCallback和RedisCallback接口
SessionCallback接口和RedisCallback接口,它们的作用是让RedisTemplate进行回调,通过它们可以在同一条连接下执行多个Redis命令。其中SessionCallback提供了良好的封装,对于开发者比较友好,因此在实际的开发中应该优先选择使用它;相对而言,RedisCallBack接口比较底层,需要处理的内容比较多,可读性较差,所以在非必要的时候尽量不选择使用它。
2、在SpringBoot中配置和使用Redis
2.1、在Spring Boot中配置Redis
2.2、操作Redis数据类型
操作Redis字符串和散列数据类型
使用Spring操作列表(链表)
列表也是常用的数据类型。在Redis中列表是一种链表结构,这就意味着查询性能不高,而增删节点的性能高,这是它的特性。在Redis中存在从左到右或者从右到左的操作。
使用Spring操作集合
对于集合,在Redis中是不允许成员重复的,它在数据结构上是一个散列表的结构,所以对于它而言是无序的,对于两个或者以上的集合,Redis还提供了交集、并集和差集的运算。
为了支持集合排序,Redis还提供了有序集合(zset)。它也是一种散列表存储的方式,同时它的有序性只是靠它在数据结构中增加一个属性——score(分数)得以支持。为了支持这个变化,Spring提供了TypedTuple接口,它定义了两个方法,并且Spring还提供了其默认的实现类DefaultTypedTuple。
使用Spring操作Redis有序集合
3、Redis的一些特殊用法
3.1、使用Redis事务
Redis是支持一定事务能力的NoSQL,在Redis中使用事务,通常的命令组合是watch...multi...exec,也就是在一个Redis连接中执行多个命令,这时我们考虑使用SessionCallback接口来达到这个目的。
Redis在执行事务时,要么全部执行,要么全部不执行,而且不会被其他客户端打断,这样就保证了Redis事务下数据的一致性。
对于Redis事务是让命令进入队列,所以一开始它并没有检测命令是否能够成功,只有在exec命令执行的时候,才能发现错误,对于出错的命令Redis只是报出错误,而错误后面的命令依旧被执行。
3.2、使用Redis流水线
流水线(批量执行命令),与事务一样,使用流水线的过程中,所有的命令也只是进入队列而没有执行,所以执行的命令返回值也为空。
3.3、使用Redis发布订阅
3.4、使用Lua脚本
为了增强Redis的计算能力,Redis在2.6版本后提供了Lua脚本的支持,而且执行Lua脚本在Redis中还具备原子性,所以在需要保证数据一致性的高并发环境中,我们也可以使用Redis的Lua语言来保证数据一致性,且Lua脚本具备更加强大的运算功能,在高并发需要保证数据一致性时,Lua脚本方案比使用Redis自身提供的事务要更好一些。
在Redis中有两种运行Lua的方法,一种是直接发送Lua到Redis服务器去执行,另一种是先把Lua发送给Redis,Redis会对Lua脚本进行缓存,然后返回一个SHA1的32为编码回来,之后只需要发送SHA1和相关参数给Redis就可以了。
在RedisTemplate中,execute方法执行脚本的方法有两种,其定义如下:
4、使用Spring缓存注解操作Redis
4.1、缓存管理器和缓存的使用
Spring在使用缓存注解前,需要配置缓存管理器,缓存管理器将提供一些重要的信息,如缓存类型、超时时间等。Spring可以支持多种缓存的使用,因此它存在多种缓存处理器,并提供了缓存处理器的接口CacheManager和与之相关的类。
4.2、开发缓存注解
对于命中率很低的场景,使用缓存并不能有效提供系统性能。
4.3、缓存注解自调用失效问题
Spring的缓存机制是基于Spring AOP原理,而在Spring中AOP是通过动态代理技术来实现的,类内部的方法自调用,并不存在代理对象的调用,这样便不会出现AOP。
4.4、自定义缓存管理器
在Spring中,我们有两种方法定制缓存管理器,一种是通过配置消除缓存键的前缀和自定义超时时间的属性来定制生成RedisCacheManager;另一种方法是不采用Spring Boot为我们生成的方式,而是完全通过自己的代码创建缓存管理器,尤其是当需要比较多自定义的时候。