redis的 分布式锁 golang/erlang 简单实现

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% import (
% “redigo/redis”
% )

% const (
% SET_IF_NOT_EXIST = “NX” // 不存在则执行
% SET_WITH_EXPIRE_TIME = “EX” // 过期时间(秒) PX 毫秒
% SET_LOCK_SUCCESS = “OK” // 操作成功
% DEL_LOCK_SUCCESS = 1 // lock 删除成功
% DEL_LOCK_NON_EXISTENT = 0 // 删除lock key时,并不存在
% )

% var (
% RdPool *redis.Pool
% Conn redis.Conn
% )

% // NewRedisPool
% func init(){

% pool := &redis.Pool{
% Dial: func() (conn redis.Conn, e error) {
% return redis.Dial(“tcp”,”localhost:6379″)
% },
% MaxIdle: 10,
% MaxActive: 20,
% IdleTimeout: 100,
% }

% RdPool = pool
% Conn = pool.Get()
% }

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%s
%添加lock锁
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% redis 类型 字符串设置一个分布式锁 (哈希内部字段不支持过期判断,redis只支持顶级key过期)

% @param key: 锁名,格式为 用户id_操作_方法
% @param requestId: 客户端唯一id 用来指定锁不被其他线程(协程)删除
% @param ex: 过期时间

% func AddLock(key,requestId string,ex int) bool {
% msg,_ := redis.String(
% Conn.Do(“SET”,key,requestId,SET_IF_NOT_EXIST,SET_WITH_EXPIRE_TIME,ex),
% )
% if msg == SET_LOCK_SUCCESS {
% return true
% }
% return false
% }

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%s
%添加lock锁
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
addLock(Key) ->
Key1 = “LOCK:” ++ binary_to_list(Key),
Value = easemob_redis:q(mute, [“SET”,Key1, true, “NX”,”EX”, 50]),
io:format(“Value..AddLock…~p~n”,[Value]),
Value.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%s
%查
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 获得redis分布式锁的值
% @param key:redis类型字符串的key值
% @param return: redis类型字符串的value
%
% func GetLock(key string) string {
% msg,_ := redis.String(Conn.Do(“GET”,key))
% return msg
% }

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%s
%查,获得redis分布式锁的值
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
getLock(Key) ->
Key1 = “LOCK:” ++ binary_to_list(Key),
{ok,Value} = easemob_redis:q(mute, [“GET”,Key1]),
io:format(“Value…GetLock..~p~n”,[Value]),
Value.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%s
%删除
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 删除redis分布式锁
%% @param key:redis类型字符串的key值
%% @param requestId: 唯一值id,与value值对比,避免在分布式下其他实例删除该锁
% func DelLock(key ,requestId string) bool{
% if GetLock(key) == requestId {
% msg,_ := redis.Int64(Conn.Do(“DEL”,key))
% %% 避免操作时间过长,自动过期时再删除返回结果为0
% if msg == DEL_LOCK_SUCCESS || msg == DEL_LOCK_NON_EXISTENT{
% return true
% }
% return false
% }
% return false
% }

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%s
%删除redis分布式锁
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
delLock(Key) ->
Key1 = “LOCK:” ++ binary_to_list(Key),
easemob_redis:q(mute, [“DEL”,Key1]).

%添加lock锁
addLock(Key) ->
Key1 = “LOCK:” ++ binary_to_list(Key),
Value = easemob_redis:q(mute, [“SET”,Key1, true, “NX”,”EX”, 3]),
Value.

%查询,获得redis分布式锁的值
getLock(Key) ->
Key1 = “LOCK:” ++ binary_to_list(Key),
{ok,Value} = easemob_redis:q(mute, [“GET”,Key1]),
Value.

%删除redis分布式锁
delLock(Key) ->
Key1 = “LOCK:” ++ binary_to_list(Key),
easemob_redis:q(mute, [“DEL”,Key1]).

Original: https://www.cnblogs.com/unqiang/p/15248007.html
Author: 孤独信徒
Title: redis的 分布式锁 golang/erlang 简单实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/529410/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 浪剑天下H5游戏详细图文架设教程

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    090
  • python之pyautogui实现图片识别-办公自动化

    环境 python 3.8everedit编辑器 代码 from selenium import webdriver from selenium.webdriver.chrome….

    Linux 2023年6月7日
    0110
  • 【证券从业】金融基础知识-第六章 证券投资基金01

    注1:后续学习并整理到第八章,全书完结后再合并成一个笔记进行源文件分享 注2:本章内容巨多,大约分为三篇文章记录消化 posted @2022-06-10 16:38 陈景中 阅读…

    Linux 2023年6月13日
    094
  • Spring5新特性—Log4j2

    Spring5新特性—Log4j2 Spring5新特性—Log4j2 创建一个Maven项目,导入依赖 org.apache.logging.log4j log4j-core 2…

    Linux 2023年6月14日
    088
  • SSM中的拦截器

    SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。 过滤器与拦截器的区别…

    Linux 2023年6月14日
    085
  • Linux系统解压zip包出现中文乱码问题

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    095
  • Git常用命令

    克隆拉取远程代码 git clone https://xxxxxxxxx 本地添加远程仓库地址 git remote add origin(设定名字,随意。不过一般都叫这个名字) …

    Linux 2023年6月8日
    085
  • Java8新特性终极指南

    欢迎来到Java学习之Java8新特性终极指南 目录 系列文章目录 @ 目录 系列文章目录 Java语言新特性 Lambda表达式 函数式接口 方法引用 接口的默认方法 重复注解 …

    Linux 2023年6月13日
    098
  • Centos7升级内核

    1、查看当前内核版本 $ uname -r 3.10.0-1160.25.1.el7.x86_64 $ uname -a Linux localhost.localdomain 3…

    Linux 2023年6月13日
    072
  • POJ1573(Robot Motion)–简单模拟+简单dfs

    题目在这里 题意 问你按照图中所给的提示走,多少步能走出来??? 其实只要根据这个提示走下去就行了。模拟每一步就OK,因为下一步的操作和上一步一样,所以简单dfs。如果出现loop…

    Linux 2023年6月7日
    083
  • Pandas中的常用函数

    1. map、apply、applymap 参考:Pandas教程 | 数据处理三板斧——map、apply、applymap详解 在日常的数据处理中,经常会对一个 DataFra…

    Linux 2023年6月13日
    088
  • Shell中判断文件,目录是否存在

    一. 具体每个选项对应的判断内容: 二.常用的例子: Original: https://www.cnblogs.com/DreamDrive/p/7706585.htmlAuth…

    Linux 2023年5月28日
    082
  • @JsonFormat和@DateTimeFormat的作用

    @DatetimeFormat是将String转换成Date,一般前台给后台传值时用 import org.springframework.format.annotation.Da…

    Linux 2023年6月7日
    094
  • 一文带你全面了解什么是颠覆时代的Web3.0未来互联网

    前言 大家还记得前段时间Meta公司,也就是FaceBook改名后的那家,CEO扎克伯格发的那张元宇宙自拍吗? 他没想到的是,随手的一张自拍却引来了群嘲,20年前的像素感,粗糙的人…

    Linux 2023年6月7日
    0103
  • ASCLL 字符码

    信息在计算机上是用二进制数表示的,这种表示法让人很难理解。因此,计算机上都配有输入和输出设备,这些设备的主要目的就是以一种人类可阅读的形式将信息在这些设备上显示出来供人阅读理解。为…

    Linux 2023年6月7日
    097
  • NJU软件分析笔记(2)

    NJU Static Analysis Notes(2)——Data Flow Analysis Ⅰ 课程链接本次课程主要内容 Overview of Data Flow Anal…

    Linux 2023年6月8日
    0101
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球