什么是分布式锁极速飞艇平台开发

分布式锁,是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。

 分布式锁的本质可以看作是特殊的普通锁,它的竞争者不是普通的进程和线程,它的竞争者分布在不同的主机上,需要通过网络来相互通信,不同的主机分布和网络的不确定性给分布式锁的实现和普通锁有着很大的不同。

什么是分布式锁极速飞艇平台开发,需要请搜索【大神源码论坛】dsluntan.com 客服企娥3393756370 V信17061863513,
目前常见的分布式锁的实现有基于数据库,基于缓存(redis等缓存数据库),基于zoonkeeper三种:

  基于redis实现分布式锁很简单,通过一个命令setnx(set if no exist).只有在key不存在的时候才set成功返回1,否则返回失败0,但是要考虑到一些意外情况还是需要一个很严谨的逻辑。

//
// Created by dguco on 18-9-9.
//

#ifndef SERVER_REDI_LOCK_H
#define SERVER_REDI_LOCK_H
#include <iostream>
#include <redis_client.h>
#include <future>

using namespace std;

// 获取当前秒数
int GetSecond()
{
struct timeval tmval = {0};
int nRetCode = gettimeofday(&tmval, NULL);
if (nRetCode != 0) {
return 0;
}
return (int) (tmval.tv_sec);
}

#define LOCK_TIME_OUT 1 //1s

CRedisClient g_RedisCli;

class CRedisLock
{
public:
/*

  • @param lockKey
  • @param isBlock 司机阻塞
  • @return 是否锁成功
    */
    bool Lock(std::string &lockKey, bool isBlock = false);
    template<class F, class... Args>
    void DoWithLock(std::string &lockKey, F &&f, Args &&... args);
    template<class F, class... Args>
    void TryDoWithLock(std::string &lockKey, F &&f, Args &&... args);
    private:
    int m_iLockTimeOut;
    };

template<class F, class... Args>
void CRedisLock::TryDoWithLock(std::string &lockKey, F &&f, Args &&... args)
{
bool isLock = Lock(lockKey, false);
if (isLock) {
using return_type = typename std::result_of<F(Args...)>::type;
auto task = std::make_shared<std::packaged_task<return_type()> >(
std::bind(std::forward<F>(f), std::forward<Args>(args)...)
);
(*task)( );
int now = GetSecond( );
if (now < m_iLockTimeOut) {
g_RedisCli.Del(lockKey);
}
}
}

template<class F, class... Args>
inline void CRedisLock::DoWithLock(std::string &lockKey, F &&f, Args &&... args)
{
bool isLock = Lock(lockKey, true);
if (isLock) {
using return_type = typename std::result_of<F(Args...)>::type;
auto task = std::make_shared<std::packaged_task<return_type()> >(
std::bind(std::forward<F>(f), std::forward<Args>(args)...)
);
(*task)( );
int now = GetSecond( );
if (now < m_iLockTimeOut) {
g_RedisCli.Del(lockKey);
}
}
}

bool CRedisLock::Lock(std::string &lockKey, bool isBlock)
{
int lock = 0;
m_iLockTimeOut = 0;
bool isLock = false;
while (lock != 1) {
int now = GetSecond( );
m_iLockTimeOut = now + LOCK_TIME_OUT + 1;
lock = g_RedisCli.Setnx(lockKey, to_string(m_iLockTimeOut));
//是否获取成功
if (lock == 1) {
isLock = true;
}
//判断是否超时,并设置新的超时时间
if (!isLock) {
string res = "";
g_RedisCli.Get(lockKey, &res);
//如果没有被其他竞争者
if (res != "") {
int out1 = atoi(res.c_str( ));
string res1 = "";
g_RedisCli.Getset(lockKey, &res1);
//如果更新超时之前没有被其他竞争者抢先且超时
if (now > out1 && res == res1) {
isLock = true;
}
}

    }
    if (isLock or !isBlock) {
        break;
    }
    else {
        usleep(1000);
    }
}
return isLock;

}

#endif //SERVER_REDI_LOCK_H

原文地址:http://blog.51cto.com/13970120/2175198

时间: 2024-10-09 23:32:13

什么是分布式锁极速飞艇平台开发的相关文章

在Windows*上极速飞艇平台定制开发编译Tensorflow教程

最简单极速飞艇平台定制开发[大神源码论坛]dsluntan.com [布丁源码论坛]budingbbs.com 企娥3393756370的 Tensorflow 的安装方法是在 pip 一键式安装官方预编译好的包 pip install tensorflow 通常这种预编译的包的编译参数选择是为了最大兼容性而不是为了最优性能,导致在使用过程中,每次运行代码都会输出一大堆的 warning 信息.例如在安装了谷歌官方的 Tensorflow 1.3.0 包后,运行以下测试代码时 import te

自己练习极速赛车平台开发写的--C#基础篇十小练习

[csharp] view plain copy极速赛车平台开发论坛:haozbbs.com Q1446595067 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace P03 { class Program { static void Main(string[] args) { Test03_01

Java创建极速飞艇平台出租线程的三种方式

(1)定义Thread类的子类,极速飞艇平台出租[企鹅21717-93408]并重写该类的run方法,该run方法的方法体就代 表了线程要完成的任务.因此把run()方法称为执行体.(2)创建Thread子类的实例,即创建了线程对象.(3)调用线程对象的start()方法来启动该线程. 二.通过Runnable接口创建线程类(1)定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体是该线程的线程执行体.(2)创建 Runnable实现类的实例,并依此实例作为T

分布式之抉择分布式锁快三平台出租

为什么写这篇文章?目前网上大部分的基于zookeeper快三平台出租请QQ2952777280[话仙源码论坛]http://hxforum.com [木瓜源码论坛]http://papayabbs.com ,和redis的分布式锁的文章都不够全面.要么就是特意避开集群的情况,要么就是考虑不全,读者看着还是一脸迷茫.坦白说,这种老题材,很难写出新创意,博主内心战战兢兢,如履薄冰,文中有什么不严谨之处,欢迎批评.博主的这篇文章,不上代码,只讲分析.(1)在redis方面,有开源redisson的ja

分布式锁实现极速飞艇源码定制原理

1 自旋锁 自旋锁如果已经被别的线程获取,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名.自旋锁是一种非阻塞锁,也就是说,如果某线程需要获取自旋锁,但该锁已经被其他线程占用时,该线程不会被挂起,而是在不断的消耗CPU的时间,不停的试图获取自旋锁. 2 互斥锁 (Mutex Lock)互斥锁是阻塞锁,也是我们最常用的一种锁,当某线程无法获取互斥锁时,该线程会被直接挂起,不再消耗CPU时间,当其他线程释放互斥锁后,操作系统会唤醒那个被挂起的线程.阻塞锁

MEF 插件幸运飞艇平台出租式开发 - DotNetCore 中强大的 DI

背景叙述在前面几篇幸运飞艇平台出租(www.1159880099.com)QQ1159880099 MEF 插件式开发 系列博客中,我分别在 DotNet Framework 和 DotNet Core 两种框架下实验了 MEF 的简单实验,由于 DotNet Framework 由来已久,因此基于该框架下衍生出的很多优秀的 MEF 框架较多.但是对于 DotNet Core 来说,情况有所不同,由于它本身对 DI 内置并提供支持,因此我尝试使用它的全新 依赖注入(DI) 来做一些实验. 动手实

基于zookeeper的分布式锁实现 【转】

工作中需要写一个定时任务,由于是集群环境,自然而然想到需要通过分布式锁来保证单台执行..相信大家都会想到使用zk来实现对应的分布式锁.下面就简单介绍一下几种实现 准备工作 有几个帮助类,先把代码放上来 ZKClient 对zk的操作做了一个简单的封装 Java代码 ZKUtil 针对zk路径的一个工具类 Java代码 NetworkUtil 获取本机IP的工具方法 Java代码 --------------------------- 正文开始  -------------------------

基于zookeeper的分布式锁实现 【转载】

工作中需要写一个定时任务,由于是集群环境,自然而然想到需要通过分布式锁来保证单台执行..相信大家都会想到使用zk来实现对应的分布式锁.下面就简单介绍一下几种实现 准备工作 有几个帮助类,先把代码放上来 ZKClient 对zk的操作做了一个简单的封装 Java代码 ZKUtil 针对zk路径的一个工具类 Java代码 NetworkUtil 获取本机IP的工具方法 Java代码 --------------------------- 正文开始  -------------------------

基于zookeeper的分布式锁实现【转】

工作中需要写一个定时任务,由于是集群环境,自然而然想到需要通过分布式锁来保证单台执行..相信大家都会想到使用zk来实现对应的分布式锁.下面就简单介绍一下几种实现 准备工作 有几个帮助类,先把代码放上来 ZKClient 对zk的操作做了一个简单的封装 Java代码 ZKUtil 针对zk路径的一个工具类 Java代码 NetworkUtil 获取本机IP的工具方法 Java代码 --------------------------- 正文开始  -------------------------