redis分布式锁的go-redis实现方法详解
在分布式的业务中 , 如果有的共享资源需要安全的被访问和处理 , 那就需要分布式锁
分布式锁的几个原则;
1.「锁的互斥性」:在分布式集群应用中,共享资源的锁在同一时间只能被一个对象获取。
2. 「可重入」:为了避免死锁,这把锁是可以重入的,并且可以设置超时。
3. 「高效的加锁和解锁」:能够高效的加锁和解锁,获取锁和释放锁的性能也好。
4. 「阻塞、公平」:可以根据业务的需要,考虑是使用阻塞、还是非阻塞,公平还是非公平的锁。
redis实现分布式锁主要靠setnx命令
1. 当key存在时失败 , 保证互斥性
2.设置了超时 , 避免死锁
3.利用mutex保证当前程序不存在并发冲突问题
package redis import ( "context" "github.com/go-redis/redis/v8" "github.com/taoshihan1991/miaosha/setting" "log" "sync" "time" ) var rdb *redis.Client var ctx = context.Background() var mutex sync.Mutex func NewRedis() { rdb = redis.NewClient(&redis.Options{ Addr: setting.Redis.Ip + ":" + setting.Redis.Port, Password: "", // no password set DB: 0, // use default DB }) } func Lock(key string) bool { mutex.Lock() defer mutex.Unlock() bool, err := rdb.SetNX(ctx, key, 1, 10*time.Second).Result() if err != nil { log.Println(err.Error()) } return bool } func UnLock(key string) int64 { nums, err := rdb.Del(ctx, key).Result() if err != nil { log.Println(err.Error()) return 0 } return nums }
到此这篇关于redis分布式锁的go-redis实现方法的文章就介绍到这了,更多相关redis分布式锁内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
相关推荐
-
golang实现redis的延时消息队列功能示例
前言 在学习过程中发现redis的zset还可以用来实现轻量级的延时消息队列功能,虽然可靠性还有待提高,但是对于一些对数据可靠性要求不那么高的功能要求完全可以实现.本次主要采用了redis中zset中的zadd, zrangebyscore 和 zdel来实现一个小demo. 提前准备 安装redis, redis-go 因为用的是macOS, 直接 $ brew install redis $ go get github.com/garyburd/redigo/redis 又因为比较懒,生成任
-
Redis分布式锁的实现方式(redis面试题)
什么是分布式锁? 要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁.进程锁. 线程锁:主要用来给方法.代码块加锁.当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段.线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如synchronized是共享对象头,显示锁Lock是共享某个变量(state). 进程锁:为了控制同一操作系统中多个进程访问某个共享资源,因为进程具有独立性,各个进程无法访问其他进程的资源,因此无法通过synchronize
-
redis与mongodb的区别总结
MongoDB更类似MySQL,支持字段索引.游标操作,其优势在于查询功能比较强大,擅长查询JSON数据,能存储海量数据,但是不支持事务. Mysql在大数据量时效率显著下降,MongoDB更多时候作为关系数据库的一种替代. mongodb更吃内存,因为当mongo发现内存不够的时候,是以2的指数级别来申请内存的.所以一般都建议把mongodb单独放. 其实可以说redis更像缓存机制,cookie,也可以设定数据的过期时间,当然也可以永久存储(但是好像稍逊色?).mongodb是文档式的存储.
-
Docker部署Django+Mysql+Redis+Gunicorn+Nginx的实现
一. 前言 docker技术现在非常火热,通过容器构建项目环境,运行效率和部署效率都很不错.所以最近抽空看了一些教程,然后将博客部署方式改为了docker,感觉网上没有特别好的关于 docker 部署 django 项目的教程,特意写了这篇文章,算是记录自己的心得. 本次教程的测试环境为 Deepin ,主要侧重于 容器的编排 和 Django 相关部署知识,一些细节方面,例如环境依赖安装,不会讲得特别详细.由于是在本地测试,所以在配置 nginx 相关信息时,将配置 http 代理而非 htt
-
Redis实现分布式锁的几种方法总结
Redis实现分布式锁的几种方法总结 分布式锁是控制分布式系统之间同步访问共享资源的一种方式.在分布式系统中,常常需要协调他们的动作.如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁. 我们来假设一个最简单的秒杀场景:数据库里有一张表,column分别是商品ID,和商品ID对应的库存量,秒杀成功就将此商品库存量-1.现在假设有1000个线程来秒杀两件商品,500个线程秒杀第一个商品,
-
基于Redis实现分布式锁以及任务队列
一.前言 双十一刚过不久,大家都知道在天猫.京东.苏宁等等电商网站上有很多秒杀活动,例如在某一个时刻抢购一个原价1999现在秒杀价只要999的手机时,会迎来一个用户请求的高峰期,可能会有几十万几百万的并发量,来抢这个手机,在高并发的情形下会对数据库服务器或者是文件服务器应用服务器造成巨大的压力,严重时说不定就宕机了,另一个问题是,秒杀的东西都是有量的,例如一款手机只有10台的量秒杀,那么,在高并发的情况下,成千上万条数据更新数据库(例如10台的量被人抢一台就会在数据集某些记录下 减1),那次这个
-
Redis上实现分布式锁以提高性能的方案研究
背景: 在很多互联网产品应用中,有些场景需要加锁处理,比如:秒杀,全局递增ID,楼层生成等等.大部分是解决方案基于DB实现的,Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系. 项目实践 任务队列用到分布式锁的情况比较多,在将业务逻辑中可以异步处理的操作放入队列,在其他线程中处理后出队,此时队列中使用了分布式锁,保证入队和出队的一致性.关于redis队列这块的逻辑分析,我将在下一次对其进行总结,此处先略过. 接下来对redis实现的分
-
详解使用Redis SETNX 命令实现分布式锁
使用Redis的 SETNX 命令可以实现分布式锁,下文介绍其实现方法. SETNX命令简介 命令格式 SETNX key value 将 key 的值设为 value,当且仅当 key 不存在. 若给定的 key 已经存在,则 SETNX 不做任何动作. SETNX 是SET if Not eXists的简写. 返回值 返回整数,具体为 - 1,当 key 的值被设置 - 0,当 key 的值没被设置 例子 redis> SETNX mykey "hello" (integer
-
Redis分布式锁的使用和实现原理详解
模拟一个电商里面下单减库存的场景. 1.首先在redis里加入商品库存数量. 2.新建一个Spring Boot项目,在pom里面引入相关的依赖. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <gr
-
redis分布式锁的问题与解决方法
分布式锁 在分布式环境中,为了保证业务数据的正常访问,防止出现重复请求的问题,会使用分布式锁来阻拦后续请求.我们先写一段有问题的业务代码: public void doSomething(String userId){ User user=getUser(userId); if(user==null){ user.setUserName("xxxxx"); user.setUserId(userId); insert(user); return; } update(user); } 上
-
thinkPHP框架通过Redis实现增删改查操作的方法详解
本文实例讲述了thinkPHP框架通过Redis实现增删改查操作的方法.分享给大家供大家参考,具体如下: 一.概述 Redis是一个NoSQL数据库,由于其数据类型的差异,所以要在MVC框架中实现CURD操作,比较繁锁.事实上在ThinkPHP框架中,只能实现简单的缓存应用.而不像MongoDB那样能够实现常见数据库的CURD操作.本文章将通过扩展的方式,实现Redis的CURD操作,这样我们就可以像操作普通的Mysql数据库那样实现Redis的编程了. 二.实现过程 接下为将以ThinkPHP
-
mac下redis安装、设置、启动停止方法详解
需要下载release版本,下载地址: http://download.redis.io/releases/ 我这里下载的是: http://download.redis.io/releases/redis-3.2.5.tar.gz 解压到/usr/local/redis目录中,然后依次执行以下命令: cd /usr/local/redis sudo make test sudo make install 启动redis-server redis-server 如上图,redis-server启
-
Java分布式锁的概念与实现方式详解
什么是分布式锁?在回答这个问题之前,我们先回答一下什么是锁. 普通的锁,即在单机多线程环境下,当多个线程需要访问同一个变量或代码片段时,被访问的变量或代码片段叫做临界区域,我们需要控制线程一个一个的顺序执行,否则会出现并发问题. 如何控制呢?就是设置一个各个线程都能看的见的标志.然后,每个线程想访问临界区域时,都要先查看标志,如果标志没有被占用,则说明目前没有线程在访问临界区域.如果标志被占用了,则说明目前有线程正在访问临界区域,则当前线程需要等待. 这个标志,就是锁. 在单机多线程的java程
-
Redis教程之代理ip池设计方法详解
前言 众所周知代理 ip 因为配置简单而且廉价,经常用来作为反反爬虫的手段,但是稳定性一直是其诟病.筛选出优质的代理 ip 并不简单,即使付费购买的代理 ip 源,卖家也不敢保证 100% 可用:另外代理 ip 的生命周期也无法预知,可能上一秒能用,下一秒就扑街了.基于这些原因,会给使用代理 ip 的爬虫程序带来很多不稳定的因素.要排除代理 ip 的影响,通常的做法是建一个代理 ip 池,每次请求前来池子取一个 ip,用完之后归还,保证池子里的 ip 都是可用的.本文接下来就探讨一下,如何使用
-
利用Redis实现访问次数限流的方法详解
假设我们要做一个业务需求,这个需求就是限制用户的访问频次.比如1分钟内只能访问20次,10分钟内只能访问200次.因为是用户维度的场景,性能肯定是要首先考虑,那么适合这个场景的非Redis莫属. 最简单的实现,莫过于只是用incr进行计数操作,于是有了下面的代码: long count = redisTemplate.opsForValue().increment("user:1:60"); if (count > maxLimitCount) { throw new Limit
-
基于springboot实现redis分布式锁的方法
在公司的项目中用到了分布式锁,但只会用却不明白其中的规则 所以写一篇文章来记录 使用场景:交易服务,使用redis分布式锁,防止重复提交订单,出现超卖问题 分布式锁的实现方式 基于数据库乐观锁/悲观锁 Redis分布式锁(本文) Zookeeper分布式锁 redis是如何实现加锁的? 在redis中,有一条命令,实现锁 SETNX key value 该命令的作用是将 key 的值设为 value ,当且仅当 key 不存在.若给定的 key 已经存在,则 SETNX不做任何动作.设置成功,返
-
Redis分布式锁如何实现续期
目录 Redis分布式锁如何续期 Redis分布式锁的正确姿势 如何回答 源码分析 真相大白 Redis分布式锁的5个坑 一.锁未被释放 二.B的锁被A给释放了 三.数据库事务超时 四.锁过期了,业务还没执行完 五.redis主从复制的坑 Redis分布式锁如何续期 Redis分布式锁的正确姿势 据肥朝了解,很多同学在用分布式锁时,都是直接百度搜索找一个Redis分布式锁工具类就直接用了.关键是该工具类中还充斥着很多System.out.println();等语句.其实Redis分布式锁比较正确
-
redis分布式锁的8大坑总结梳理
目录 前言 1 非原子操作 2 忘了释放锁 3 释放了别人的锁 4 大量失败请求 5 锁重入问题 6 锁竞争问题 6.1 读写锁 6.2 锁分段 7 锁超时问题 8 主从复制的问题 前言 在分布式系统中,由于redis分布式锁相对于更简单和高效,成为了分布式锁的首先,被我们用到了很多实际业务场景当中. 但不是说用了redis分布式锁,就可以高枕无忧了,如果没有用好或者用对,也会引来一些意想不到的问题. 今天我们就一起聊聊redis分布式锁的一些坑,给有需要的朋友一个参考. 1 非原子操作 使用r
随机推荐
- js实现的全国省市二级联动下拉选择菜单完整实例
- 如何准确地获得一个整数?
- 修改Jquery Dialog 位置的实现方法
- Python深入学习之装饰器
- 理解Javascript_08_函数对象
- 在Nginx上部署ThinkPHP项目教程
- 深入分析C++中类的大小
- centos编译安装mysql 5.6及安装多个mysql实例详解
- ECMAScript6块级作用域及新变量声明(let)
- 在数据库中自动生成编号的实现方法分享
- 情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
- Javascript 构造函数详解
- JavaScript 类似flash效果的立体图片浏览器
- 基于Java实现杨辉三角 LeetCode Pascal's Triangle
- phpword插件导出word文件时中文乱码问题处理方案
- 建立文件交换功能的脚本(二)
- python在线编译器的简单原理及简单实现代码
- Java全排列算法字典序下的下一个排列讲解
- python实现随机漫步算法
- PyTorch搭建多项式回归模型(三)