一个轻量级用于简化redis操作,基于spring boot的starter组件,并且提供了基于redis的分布式锁以及动态消息发布/订阅的功能
git clone git@github.com:terminux/redis-spring-boot.git
mvn -pl '!redis-spring-boot-samples' -DskipTests clean install
<dependency>
<groupId>com.ugrong.framework</groupId>
<artifactId>redis-spring-boot-starter</artifactId>
<version>2.0.2</version>
</dependency>
spring:
redis:
password: your_password
host: localhost
port: 6379
@Getter
@Setter
@ToString
public class Student implements Serializable {
private Long id;
private String name;
}
2、实现 IRedisCacheType 接口,并且重写 [getValue
] 方法,例如用枚举实现:
public enum EnumStudentCacheType implements IRedisCacheType {
/**
* 学生信息缓存
*/
STUDENT_CACHE("STUDENT");
private final String value;
EnumStudentCacheType(String value) {
this.value = value;
}
@Override
public String getValue() {
return this.value;
}
}
这样可以方便在key很多的情况下方便我们管理key,同时根据不同的业务场景统一key的规范
3、创建 StudentRedisRepository,并且继承 AbstractSimpleRedisRepository ,重写它的 [getCacheType
] 方法,例如:
@Component
public class StudentRedisRepository extends AbstractSimpleRedisRepository<Student> {
@Override
public IRedisCacheType getCacheType() {
return EnumStudentCacheType.STUDENT_CACHE;
}
}
@Autowired
private StudentRedisRepository studentRedisRepository;
4、简单的字符串操作可以直接使用 IStringRedisRepository :
@Autowired
private IStringRedisRepository stringRedisRepository;
5、为了支持不同数据结构的存储,除了 AbstractSimpleRedisRepository 和 IStringRedisRepository ,
还提供了 AbstractHashRedisRepository,AbstractListRedisRepository ,可以自行查看和使用
1、项目中还支持了redis分布式锁,可以在 IRedisLockRepository 中查看提供的方法和详细注释
2、在项目中注入 IRedisLockRepository :
@Autowired
private IRedisLockRepository redisLockRepository;
AtomicBoolean isLock = new AtomicBoolean(Boolean.FALSE);
try {
isLock.set(redisLockRepository.tryLock(...));
if (isLock.get()) {
//获取到锁
//do something
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//进行解锁
if (isLock.get()) {
redisLockRepository.unlock(...);
}
}
4.1、实现 IRedisLockType 接口,并且重写 [getValue
] 方法,例如用枚举实现:
public enum EnumStudentLockType implements IRedisLockType {
STUDENT_LOCK("STUDENT_LOCK");
private final String value;
EnumStudentLockType(String value) {
this.value = value;
}
@Override
public String getValue() {
return value;
}
}
IRedisLockType lockType = EnumStudentLockType.STUDENT_LOCK;
String lockField = "123456";
AtomicBoolean isLock = new AtomicBoolean(Boolean.FALSE);
try {
isLock.set(redisLockRepository.tryLock(lockType, lockField, 20, 20, TimeUnit.SECONDS));
if (isLock.get()) {
//获取到锁
//do something
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//进行解锁
if (isLock.get()) {
redisLockRepository.unlock(lockType, lockField);
}
}
5、提供了 @RedisLock 注解来支持aop加锁
-
1、实现 IRedisTopicType 接口,并且重写 [
getValue
] 方法,用来作为发布的消息主题类型,支持主题表达式 -
2、在项目中注入 IRedisChannelRepository 即可使用
IRedisTopicType 示例:
public enum EnumStudentTopicType implements IRedisTopicType {
STUDENT_TOPIC("/student/test_topic");
private final String value;
EnumStudentTopicType(String value) {
this.value = value;
}
@Override
public String getValue() {
return value;
}
}
发送消息示例:
redisChannelRepository.publish(EnumStudentTopicType.STUDENT_TOPIC, student);
-
1、实现 IRedisMessageHandler 接口,并且重写 [
handle
] 方法,用来接收消息 -
2、在上一步 IRedisMessageHandler 的实现类中添加 @RedisHandler 注解,并且修改
topic
属性,表示订阅的主题,支持主题表达式
示例:
@Component
@RedisHandler(topic = "/student/test_topic")
@Slf4j
public class StudentMessageHandler implements IRedisMessageHandler<Student> {
@Override
public void handle(Student student, String topic) {
log.info("Handle redis message.topic=[{}], received=[{}]", topic, student);
}
}
注:相关单元测试可以在 SamplesApplicationTests 类中查看