4、RedLock使用方法及原理

这里先贴上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);

你可能感兴趣的:(4、RedLock使用方法及原理)