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)

大家都在看

  • 软件定义网络第一次作业

    配置结果 如何pip解决下载过慢问题 实验环境配置 环境安装截图如下 安装环境过程中一些问题的解决 github连接不上 在hosts文件中加上以下语句 140.82.114.3 …

    Linux 2023年6月7日
    0112
  • django queryset列表合并

    import itertools queryset_top = query.filter(is_top=True).order_by("-updated_at"…

    Linux 2023年6月14日
    072
  • 你还有什么问题吗?

    在面试过程中,一般都会有一个固定环节,那就是在临近结束时,面试官会问求职者: 你还有什么问题吗? 其实,这是一个很好的了解公司,了解未来团队的机会,但很多求职者却不知道问什么,或者…

    Linux 2023年6月7日
    0112
  • 微信小程序转uniapp

    微信小程序转uniapp 安装包 cnpm install miniprogram-to-uniapp -g 查看版本 wtu -V 转化执行 wtu -i 要转化的小程序目录 例…

    Linux 2023年6月7日
    097
  • chmod 报错 changing permissions of ‘xxx’: Operation not permitted

    chmod的底层实现是 chattr命令,用此命的功能更为强大,甚至可以锁定文件,即使root用户也操作不了此文件。 先使用lsattr查看文件属性 `bashlsattr tem…

    Linux 2023年6月13日
    0105
  • 关于阿里云ECS Centos 5/6/7 Linux Glibc库严重安全漏洞修复方法

    本文来自转载http://www.shidehui.com/jingyan/about-ali-cloud-ecs-centos-567-linux-glibc-library-s…

    Linux 2023年6月13日
    0131
  • 树莓派Raspiberry 编译Linux实时内核PREEMPT-RT 实战

    树莓派4B 实时内核(Preempt_RT)的配置和编译https://blog.csdn.net/zlp_zky/article/details/114994444 基本按照这个…

    Linux 2023年6月7日
    0118
  • 一面数据: Hadoop 迁移云上架构设计与实践

    背景 一面数据创立于 2014 年,是一家领先的数据智能解决方案提供商,通过解读来自电商平台和社交媒体渠道的海量数据,提供实时、全面的数据洞察。长期服务全球快消巨头(宝洁、联合利华…

    Linux 2023年6月14日
    0139
  • PTA 《基础编程题目集》 6-7 统计某类完全平方数

    本题要求实现一个函数,判断任一给定整数N是否满足条件:它是完全平方数,又至少有两位数字相同,如144、676等。 函数接口定义: int IsTheNumber ( const i…

    Linux 2023年6月8日
    0120
  • Python中str()和repr()的区别

    其实用处就是最大的区别了:str()主要用来为终端用户输出一些信息,而repr()主要用来调试;同时后者的目标是为了消除一些歧义(例如浮点数的精度问题),前者主要为了可读。 In …

    Linux 2023年6月8日
    0120
  • ruoyi接口权限校验

    此文章属于ruoyi项目实战系列 ruoyi系统在前端主要通过权限字符包含与否来动态显示目录和按钮。为了防止通过http请求绕过权限限制,后端接口也需要进行相关权限设计。 @Pre…

    Linux 2023年6月7日
    0164
  • 【文件格式探究】EP.1 对ePub文件格式的初探

    这是”文件格式探究”专题的第 1 期——初探 “ePub” 文件格式。这个专题将会给各位读者呈现笔者探索各种文件格式的过程,具体则是…

    Linux 2023年6月13日
    0185
  • 记录一次shell脚本环境全局变量在函数内部生效问题

    背景 计划核对内网IP的使用情况,所以写了个小脚本扫描有哪些IP还在使用。执行脚本过程中发现函数中一直获取不到变量的值,排查后将结论记录下来。 问题现象 全局变量已配置,但在函数中…

    Linux 2023年5月27日
    081
  • redis批量删除key 远程批量删除key

    一、遇到的问题 在开发的过程中,经常会遇到要批量删除某种规则的key,如缓存的课程数据”course-课程uid”,其中课程uid是变量,我们需要删除&#8…

    Linux 2023年5月28日
    088
  • python爬虫_入门_翻页

    写出来的爬虫,肯定不能只在一个页面爬,只要要爬几个页面,甚至一个网站,这时候就需要用到翻页了 其实翻页很简单,还是这个页面http://bbs.fengniao.com/forum…

    Linux 2023年6月6日
    087
  • 【已解决】Windows环境下启动redis服务失败

    在redis安装目录下打开cmd窗口: 依次输入: redis-cli.exe shutdown exit redis-server.exe redis.windows.conf …

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