这里先贴上RedLock的使用方法:
package com.dazhiyouqiu.api;
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
public class test {
public static void main(String[] args) {
//配置redis数据
Config config = new Config();
config.useSingleServer().setAddress("127.0.0.1:6379");
RedissonClient redissonClient = Redisson.create(config);
//通过redisson获取redlock
RLock lock = redissonClient.getLock("redlock");
for (int i = 0; i < 20; i++) {
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
//加锁
lock.lock();
try {
Redis ru= new Redis();
//获取redis的number
Integer number=ru.getInteger("number");
//加1
number++;
//放回redis
ru.set("number",number.toString());
System.out.println(Thread.currentThread().getName() +"---->result:" + number) ;
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
});
thread1.start();
}
}
}
运行的结果如下,没有出现并发问题。
Thread-11---->result:1
Thread-8---->result:2
Thread-19---->result:3
Thread-14---->result:4
Thread-18---->result:5
Thread-5---->result:6
Thread-6---->result:7
Thread-3---->result:8
Thread-10---->result:9
Thread-15---->result:10
Thread-17---->result:11
Thread-9---->result:12
Thread-7---->result:13
Thread-0---->result:14
Thread-4---->result:15
Thread-12---->result:16
Thread-2---->result:17
Thread-13---->result:18
Thread-16---->result:19
Thread-1---->result:20
但需要注意的是这里的config参数是单机下的参数,如果涉及到集群的话,需要根据redis的集群类型使用不同的方法进行配置。
哨兵模式,即sentinel模式,实现代码和单机模式几乎一样,唯一的不同就是Config的构造:
Config config = new Config();
config.useSentinelServers().addSentinelAddress(
"redis://172.29.3.245:26378","redis://172.29.3.245:26379", "redis://172.29.3.245:26380")
.setMasterName("mymaster")
.setPassword("a123456").setDatabase(0);
集群模式
Config config = new Config();
config.useClusterServers().addNodeAddress(
"redis://172.29.3.245:6375","redis://172.29.3.245:6376", "redis://172.29.3.245:6377",
"redis://172.29.3.245:6378","redis://172.29.3.245:6379", "redis://172.29.3.245:6380")
.setPassword("a123456").setScanInterval(5000);