网站建设公司江苏,shopex网站经常出错,ui设计风格有哪几种,网站备案系统登录接上文 Redis与分布式-集群搭建
1.分布式锁 为了解决上述问题#xff0c;可以利用分布式锁来实现。 重新复制一份redis#xff0c;配置文件都是刚下载时候的不用更改#xff0c;然后启动redis服务和redis客户。 redis存在这样的命令#xff1a;和set命令差不多#xff0…接上文 Redis与分布式-集群搭建
1.分布式锁 为了解决上述问题可以利用分布式锁来实现。 重新复制一份redis配置文件都是刚下载时候的不用更改然后启动redis服务和redis客户。 redis存在这样的命令和set命令差不多但是它有一个机制当指定的key不存在的时候才能进行插入实际上就是 set if not exists的缩写当key被删除后可以进行插入。
setnx key value利用这种特性可以再不同的服务中实现分布式锁。但是若某个服务加了锁并且卡顿了或者崩溃那么这把锁永远无法释放了因此可以加过期时间set a666 EX 5 NX 如果学习过JUC并发编程会发现若在超时之前那一刻进入到释放锁的阶段获取到的值肯定还是自己但是在即将执行删除之前由于超时机制导致被删除并且其他任务也加锁了那么这时候在删除仍会导致删除其他任务加的锁 导入Redisson依赖 dependencygroupIdorg.redisson/groupIdartifactIdredisson/artifactIdversion3.17.0/version
/dependencydependencygroupIdio.netty/groupIdartifactIdnetty-all/artifactIdversion4.1.75.Final/version
/dependency不加锁的情况 public static void main(String[] args) {for (int i 0; i 10; i) {new Thread(() - {try(Jedis jedis new Jedis(192.168.0.10, 6379)){for (int j 0; j 100; j) { //每个客户端获取a然后增加a的值再写回去如果不加锁那么肯定会出问题int a Integer.parseInt(jedis.get(a)) 1;jedis.set(a, a);}}}).start();}}在redis中设置a0然后测试不加锁 取出a得出结果不对 测试加锁
public static void main(String[] args) {Config config new Config();config.useSingleServer().setAddress(redis://192.168.0.10:6379); //配置连接的Redis服务器也可以指定集群RedissonClient client Redisson.create(config); //创建RedissonClient客户端for (int i 0; i 10; i) {new Thread(() - {try(Jedis jedis new Jedis(192.168.0.10, 6379)){RLock lock client.getLock(testLock); //指定锁的名称拿到锁对象for (int j 0; j 100; j) {lock.lock(); //加锁int a Integer.parseInt(jedis.get(a)) 1;jedis.set(a, a);lock.unlock(); //解锁}}System.out.println(结束);}).start();}
}执行完a的值加了1000此时写入为正常 此时若用于存放锁的redis服务挂了那么肯定会出问题的这个时候可以用RedLock它的思路是在多个redis服务器上保持锁只需要超过半数的redis服务获取到锁那么就真的获取到锁了这样挂掉一部分节点也能保证正常运行。