Skip to content

一个轻量级用于简化redis操作,基于spring boot的starter组件,并且提供了基于redis的分布式锁以及动态消息发布/订阅的功能

License

Notifications You must be signed in to change notification settings

terminux/redis-spring-boot

Repository files navigation

redis-spring-boot

一个轻量级用于简化redis操作,基于spring boot的starter组件,并且提供了基于redis的分布式锁以及动态消息发布/订阅的功能

基本配置

1、先把项目clone到本地
git clone git@github.com:terminux/redis-spring-boot.git
2、进入到项目根目录下执行
mvn -pl '!redis-spring-boot-samples' -DskipTests clean install
3、给项目添加依赖
<dependency> <groupId>com.ugrong.framework</groupId> <artifactId>redis-spring-boot-starter</artifactId> <version>2.0.2</version> </dependency>
4、在项目中配置一下redis
spring: redis: password: your_password host: localhost port: 6379

开始使用

1、假如我们需要序列化一个学生类到redis,需要实现序列化接口,例如:
@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; } }
这样就很方便地可以在 service 中使用:
@Autowired private StudentRedisRepository studentRedisRepository;
来对 redis 中的 Student 进行操作了
4、简单的字符串操作可以直接使用 IStringRedisRepository :
@Autowired private IStringRedisRepository stringRedisRepository;
5、为了支持不同数据结构的存储,除了 AbstractSimpleRedisRepositoryIStringRedisRepository
还提供了 AbstractHashRedisRepositoryAbstractListRedisRepository ,可以自行查看和使用

分布式锁

1、项目中还支持了redis分布式锁,可以在 IRedisLockRepository 中查看提供的方法和详细注释
2、在项目中注入 IRedisLockRepository
@Autowired private IRedisLockRepository redisLockRepository;
3、执行加锁
伪代码如下:
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、示例
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; } }
4.2、对id为 123456 的学生进行加锁
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);
消息订阅者

示例:

@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 类中查看

About

一个轻量级用于简化redis操作,基于spring boot的starter组件,并且提供了基于redis的分布式锁以及动态消息发布/订阅的功能

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages