个人网站做百度推广,那些平台可以给网站做外链,佛山做网站企业,网站源码偷取工具分布式锁介绍
分布式锁是一种在分布式系统中用于控制不同节点上的进程或线程对共享资源进行互斥访问的技术机制。
在分布式环境中#xff0c;多个服务可能同时访问和操作共享资源#xff0c;如数据库、文件系统等。为了保持数据的一致性和完整性#xff0c;需要确保在同一…分布式锁介绍
分布式锁是一种在分布式系统中用于控制不同节点上的进程或线程对共享资源进行互斥访问的技术机制。
在分布式环境中多个服务可能同时访问和操作共享资源如数据库、文件系统等。为了保持数据的一致性和完整性需要确保在同一时刻只有一个服务能够执行写操作。分布式锁就是用来实现这种互斥控制的机制。以下是分布式锁的一些特点和实现方式 互斥性确保同一时刻只有一个线程或进程持有锁防止并发访问导致的数据不一致问题。 可重入性允许同一个节点上的同一个线程在已经获取锁的情况下再次获取锁而不会导致死锁。 锁超时支持锁在一定时间后自动释放避免因死锁导致的系统瘫痪。 高可用性加锁和解锁过程需要高效并且要保证高可用性以防止分布式锁失效。 阻塞和非阻塞性具备能够在必要时从阻塞状态中被唤醒的能力。
分布式锁的实现方式通常有以下几种 基于数据库通过数据库的行锁或条件乐观锁版本号来实现。适用于资源不存在数据库的情况操作简单易于理解但性能开销较大不适合高并发场景。 基于缓存数据库如使用Redis实现分布式锁利用其原子操作和高性能的特点来控制资源的访问。这种方式适合微服务项目中的应用。 基于文件系统通过在文件系统中创建锁文件的方式来实现适用于需要跨进程或跨主机的锁。 基于ZooKeeper利用ZooKeeper的顺序临时节点特性来实现分布式锁适合复杂的分布式系统环境。 本文介绍的是基于redis的分布式锁
引入依赖
dependencygroupIdorg.redisson/groupIdartifactIdredisson/artifactIdversion3.27.2/version
/dependency
package com.solo.platform.common.config;import lombok.Data;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** author: cc* date: 2023/4/09* description:*/
Configuration
ConfigurationProperties(prefix spring.data.redis)
Data
public class RedissonConfig {private String host;private String port;private Integer database;private String password;/*** Redis URI的写法是redis://[:password]host[:port][/db-number][?optionvalue]。* p* 其中* password可选用于连接Redis服务器的密码。* host必填Redis服务器的主机名或IP地址。* port可选Redis服务器的端口号默认为6379。* db-number可选要连接的数据库编号默认为0。* option可选连接选项例如timeout、ssl等。** return*/Beanpublic RedissonClient redisClient() {// 1.创建配置Config config new Config();String redisAddress String.format(redis://:%s%s:%s/%s, password, host, port, database);config.useSingleServer().setAddress(redisAddress);
// .setDatabase(database);// 2.创建实例RedissonClient redisson Redisson.create(config);return redisson;}} // 每个线程都创建自己的锁对象// 这是基于 Redis 实现的分布式锁Lock lock this.redissonClient.getLock(userPledgeTaskCalc);try {// 上锁lock.lock();// 查询参与质押任务的人...业务代码//} finally {// 释放锁lock.unlock();} 推荐阅读
springboot 调用外部接口的21种方式
分布式事务4种实现方式
SpringBoot项目快速启动停止脚本
redis 加强版keydb来了
nginx 就该这么用
Nginx、Kong、Apisix、Gateway网关比较
Spring Cloud Gateway 自定义全局过滤器拦截token
Spring Boot 3.2.0 试用CRaC启动速度提升3到10倍
Apache 架构师总结的 30 条架构原则