一个轻量级用于简化redis操作,基于spring boot的starter组件,并且提供了基于redis的分布式锁以及动态消息发布/订阅的功能
git clone git@github.com:terminux/redis-spring-boot.gitmvn -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 类中查看