赞
踩
<!-- redisson -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.25.2</version>
</dependency>
spring:
redisson:
# 单机模式
host: 192.168.10.106
port: 6379
# 哨兵模式
sentinel:
master: mymaster
nodes: 192.168.10.106:6209,192.168.10.106:6219,192.168.10.106:6229
# 集群模式
cluster: 192.168.10.106:6109,192.168.10.106:6119,192.168.10.106:6129
# 密码
password: xj2022
import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.client.codec.StringCodec; import org.redisson.config.Config; import org.redisson.config.ReadMode; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @Slf4j public class RedissonConfig { @Value("${spring.redisson.sentinel.nodes}") private String sentinel; @Value("${spring.redisson.sentinel.master}") private String masterName; @Value("${spring.redisson.cluster}") private String cluster; @Value("${spring.redisson.host}") private String host; @Value("${spring.redisson.port}") private String port; @Value("${spring.redisson.password}") private String password; private int timeout = 2000; private int scanInterval = 60000; private static String ADDRESS_PREFIX = "redis://"; /** * 单机模式 */ @Bean public RedissonClient initBean() { // 哨兵模式 if (StringUtils.isNotBlank(sentinel)) { log.info("redis is sentinel mode"); return redissonSentinel(); } // 集群模式 if (StringUtils.isNotBlank(cluster)) { log.info("redis is cluster mode"); return redissonCluster(); } // 单机模式 if (StringUtils.isNotBlank(host)) { log.info("redis is single mode"); return redissonSingle(); } log.error("redisson config can not support this redis mode"); return null; } /** * 单机模式 */ private RedissonClient redissonSingle() { Config config = new Config(); String address = ADDRESS_PREFIX+host+":"+port; //设置 config.setCodec(new StringCodec()) //这是用的集群server .useSingleServer() .setAddress(address) .setTimeout(timeout) .setPassword(password); return Redisson.create(config); } /** * 哨兵模式 */ private RedissonClient redissonSentinel() { String[] nodes = sentinel.split(","); //redisson版本是3.5,集群的ip前面要加上“redis://”,不然会报错,3.2版本可不加 for(int i=0;i<nodes.length;i++){ nodes[i] = ADDRESS_PREFIX+nodes[i]; } Config config = new Config(); //设置 config.setCodec(new StringCodec()) .useSentinelServers() .setMasterName(masterName) .setPassword(password) .setTimeout(timeout) .addSentinelAddress(nodes) // 在Redisson启动期间启用sentinels列表检查,默认为true,这里我们设置为false,不检查 .setCheckSentinelsList(false); return Redisson.create(config); } /** * 集群模式 */ private RedissonClient redissonCluster() { String[] nodes = cluster.split(","); //redisson版本是3.5,集群的ip前面要加上“redis://”,不然会报错,3.2版本可不加 for(int i=0;i<nodes.length;i++){ nodes[i] = ADDRESS_PREFIX+nodes[i]; } Config config = new Config(); //设置 config.setCodec(new StringCodec()) //这是用的集群server .useClusterServers() //设置集群状态扫描时间 .setScanInterval(scanInterval) .addNodeAddress(nodes) .setPassword(password) .setReadMode(ReadMode.MASTER);; return Redisson.create(config); } }
import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.stereotype.Service; import java.util.concurrent.TimeUnit; @Service @Slf4j public class RedissonTestService { @Resource private RedissonClient redissonClient; //锁过期时间 private static final Long LOCK_KEY_TIME = 120L; public void doJobTask() { //定时任务执行周期较短,为防止数据重复修改,加入锁 RLock lock = redissonClient.getLock("your_task_name"); // 尝试获取锁并设定锁的过期时间 boolean acquired = false; try { //获取锁 acquired = lock.tryLock(0, LOCK_KEY_TIME, TimeUnit.SECONDS); } catch (InterruptedException e) { log.error("取锁失败"); } if (acquired) { try { // 执行业务逻辑 }catch (Exception e) { log.error("处理失败"); //业务异常处理逻辑 }finally { // 释放锁 lock.unlock(); } } else { // 获取锁失败,说明有其他线程或进程正在处理数据 // 可以进行重试或触发告警机制 } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。