redis开发帮助组件
组件编码
hzero-starter-redis
一、简介
1.1 概述
hzero-starter-redis
redis开发帮助组件,是从原hzero-starter-core
辅助开发组件抽离出来的组件,解决了辅助开发包对redis的强依赖。
1.2 组件坐标
<dependency>
<groupId>org.hzero.starter</groupId>
<artifactId>hzero-starter-redis</artifactId>
<version>${hzero.starter.version}</version>
</dependency>
1.3 特性
RedisHelper
封装了redis操作的常用方法- 提供了基于redis的消息队列工具。
二、使用指南
2.1 redis
- redis 包提供封装好的
RedisHelper
工具类,可以方便地操作各类redis数据结构。 - 同时,提供了线程安全的支持动态切换 redis database 的
DynamicRedisHelper
,DynamicRedisHelper
继承自RedisHelper
,在代码中只需注入RedisHelper
即可。 - 动态切 redis database 的功能默认开启,可配置
hzero.redis.dynamic-database=false
关闭该功能。 - 在需要切换 database 的地方,调用
redisHelper.setCurrentDatabase(int database)
即可,同时必须调用redisHelper.clearCurrentDatabase()
清除当前操作 database,否则当前线程将一直使用这个 database ,对于同一个线程内多次 redis 操作可能会有影响。
2.2 基础操作
部分常用操作方法展示
-
string类型数据操作:
/** * String 设置值 * * @param key 缓存key * @param value 缓存value * @param expire 超时时间 */ public void strSet(String key, String value, long expire, TimeUnit timeUnit) /** * String 获取自增字段,递减字段可使用delta为负数的方式 * * @param key 缓存key * @param delta 只增量 * @return */ public Long strIncrement(String key, Long delta) /** * String 获取值 * * @param key 缓存key * @return 缓存value */ public String strGet(String key)
-
list类型数据操作:
/** * List 推入数据至列表左端 * * @param key * @param value * @return */ public Long lstLeftPush(String key, String value) /** * List 移除并返回列表最左端的项 * * @param key * @return */ public String lstLeftPop(String key) /** * List 设置指定索引上的列表项。将列表键 key索引index上的列表项设置为value。 * 如果index参数超过了列表的索引范围,那么命令返回了一个错误 * * @param key * @param index * @param value */ public void lstSet(String key, long index, String value) /** * List 返回列表键key中,指定索引index上的列表项。index索引可以是正数或者负数 * * @param key * @param index * @return */ public Object lstIndex(String key, long index)
-
hash类型数据操作:
/** * Hash 将哈希表 key 中的域 field的值设为 value。如果 key不存在,一个新的哈希表被创建并进行HSET操作。 * 如果域 field已经存在于哈希表中,旧值将被覆盖 * * @param key * @param hashKey * @param value */ public void hshPut(String key, String hashKey, String value) /** * Hash 查看哈希表 key 中,给定域 field是否存在 * * @param key * @param hashKey * @return */ public Boolean hshHasKey(String key, String hashKey) /** * Hash 返回哈希表 key 中给定域 field的值,返回值:给定域的值。当给定域不存在或是给定 key不存在时,返回 nil。 * * @param key * @param hashKey * @return */ public String hshGet(String key, String hashKey)
-
set类型数据操作:
/** * Set 将数组添加到给定的集合里面,已经存在于集合的元素会自动的被忽略, 命令返回新添加到集合的元素数量。 * * @param key * @param values * @return */ public Long setAdd(String key, String[] values) /** * Set 将返回集合中所有的元素。 * * @param key * @return */ public Set<String> setMembers(String key) /** * Set 返回一个集合的全部成员,该集合是所有给定集合之间的差集 * * @param key * @param otherKey * @return */ public Set<String> setDifference(String key, String otherKey) /** * Set 计算所有给定集合的交集,并返回结果 * * @param key * @param otherKey * @return */ public Set<String> setIntersect(String key, String otherKey) /** * Set 计算所有的并集并返回结果 * * @param key * @param otherKey * @return */ public Set<String> setUnion(String key, String otherKey)
-
zset类型数据操作:
/** * ZSet Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中。 如果某个成员已经是有序集的成员, * 那么更新这个成员的分数值,并通过重新插入这个成员元素,来保证该成员在正确的位置上。分数值可以是整数值 * 或双精度浮点数。 如果有序集合 key 不存在,则创建一个空的有序集并执行 ZADD 操作。 当 key 存在但不是 * 有序集类型时,返回一个错误。 * * @param key * @param value * @param score */ public Boolean zSetAdd(String key, String value, double score) /** * ZSet 返回指定元素在有序集合中的排名,其中排名按照元素的分值从小到大计算。排名以 0 开始 * * @param key * @param value * @return */ public Long zSetRank(String key, String value)v /** * ZSet 返回有序集合中,指定元素的分值 * * @param key * @param value * @return */ public Double zSetScore(String key, String value) /** * ZSet 返回有序集合在升序排列元素的情况下,分值在 min和 max范围内的元素数量 * * @param key * @param min * @param max * @return */ public Long zSetCount(String key, Double min, Double max)
2.3 cache
cache下主要提供了一个功能,使用注解根据配置从缓存中获取值。
-
此功能默认不开启,可配置
hzero.cache-value.enable=true
来开启该功能。 -
使用方式,比如,将用户ID和用户名缓存到redis中,大部分情况下我们只有用户ID,此时我们可以根据用户ID来获取用户名。
主要使用到的注解有两个:@CacheValue
和@ProcessCacheValue
。对于某个DTO,有字段用到该功能时,需要实现Cacheable
接口,标识为可从缓存中取值的对象,这样便于对头行结构中的字段进行处理。 -
如下,DTO中有一个 createdBy 字段,我们需要根据该创建人ID获取到创建人姓名,通过
@CacheValue
来从redis中获取值:key
指定缓存的key,支持占位符的形式;primaryKey
指定根据哪个字段匹配;searchKey
指定从redis结构中要查找的字段;structure
指定redis的数据结构。缓存的数据结构不同,CacheValue的配置也不同,具体可参考源码注释详解。
public class DemoDTO implements Cacheable {
private Long createdBy; // 创建人ID
@CacheValue(key = HZeroCacheKey.USER, primaryKey = "createdBy", searchKey = "realName",
structure = CacheValue.DataStructure.MAP_OBJECT)
private String createdUserName; // 创建人姓名
// getter/setter
}
- 配置好后,还需在查询的 service 或 controller 的方法上加上
@ProcessCacheValue
注解,以此进行AOP拦截处理。
2.4 消息队列
配置:
hzero:
redis:
# 开启消息队列, 默认值false
redis-queue: true
# 消息队列默认使用的db, 默认值1
queue-db: 1
生产者产生消息:调用org.hzero.core.redis.RedisQueueHelper
的push``pushAll
方法,可以将消息推送到消息队列。其中key是消息队列的消息分组标识,需要全局唯一。
消息者消费消息:
- 逐条消费
实现接口org.hzero.core.redis.handler.IQueueHandler
,类添加注解org.hzero.core.redis.handler.QueueHandler
,value指定消息生产者对应的key
@QueueHandler("demo")
public class DemoListener implements IQueueHandler {
@Override
public void process(String message) {
System.out.println(message);
}
}
- 批量消费
实现接口org.hzero.core.redis.handler.IBatchQueueHandler
,类添加注解org.hzero.core.redis.handler.QueueHandler
,value指定消息生产者对应的key
@QueueHandler("demo")
public class DemoListener implements IBatchQueueHandler {
@Override
public void process(List<String> messages) {
for (String message : messages) {
System.out.println(message);
}
}
}
三、版本更新日志
1.1.0.RELEASE [2019-11-08]
1.2.0.RELEASE [2020-01-08]
- 队列消息消费添加循环逻辑
- 队列消息消费改为异步执行