首页 > 数据库 >GO——6分布式锁分布式id___自己使用redis实现,(官方),,分布式id,,go协程,,gin框架,,

GO——6分布式锁分布式id___自己使用redis实现,(官方),,分布式id,,go协程,,gin框架,,

时间:2024-04-10 09:02:50浏览次数:29  
标签:协程 name lock redis time gin id 分布式

分布式锁分布式id

# 锁的作用:保证多线程并发情况下,数据的安全
    -互斥锁
    -递归锁
    只能保证同一个进程下的线程
    
    
# django项目---》部署在多台机器上---》下单场景---》悲观锁--》同一时刻,必须获得锁才能进入下单流程,释放锁--》别人才能进入下单流程
    -用mysql的表锁---》行锁
    -分布式锁的一种方案
    
# 在分布式系统重,保证并发情况下的数据安全

# 分布式锁的实现方案
    -mysql行锁表锁
    -zookeeper(不聊)
    -redis实现
        -redis官方
        -实现起来比较简单--》公司自己写

自己使用redis实现(redis实现分布式锁的原理)

# 连接redis

# 保证性能
# 保证不出死锁

import redis
from threading import Thread
import time
import uuid

redis_client = redis.Redis(host="localhost",
                           port=6379,
                           db=10)


# 获取一个锁
# lock_name:锁定名称
# acquire_time: 客户端等待获取锁的时间
# time_out: 锁的超时时间
def acquire_lock(lock_name, acquire_time=10, time_out=10):
    """获取一个分布式锁"""
    identifier = str(uuid.uuid4())
    end = time.time() + acquire_time
    lock = "string:lock:" + lock_name
    while time.time() < end:
        if redis_client.setnx(lock, identifier):
            # 给锁设置超时时间, 防止进程崩溃导致其他进程无法获取锁
            redis_client.expire(lock, time_out)
            return identifier
        elif not redis_client.ttl(lock):
            redis_client.expire(lock, time_out)
        time.sleep(0.001)
    return False


# 释放一个锁
def release_lock(lock_name, identifier):
    """通用的锁释放函数"""
    lock = "string:lock:" + lock_name
    pip = redis_client.pipeline(True)
    while True:
        try:
            pip.watch(lock)
            lock_value = redis_client.get(lock)
            if not lock_value:
                return True

            if lock_value.decode() == identifier:
                pip.multi()
                pip.delete(lock)
                pip.execute()
                return True
            pip.unwatch()
            break
        except redis.excetions.WacthcError:
            pass
    return False


def seckill(i):
    identifier = acquire_lock('resource')

    print("第%s个线程执行秒杀"%i)
    release_lock('resource', identifier)


for i in range(50):
    t = Thread(target=seckill,args=[i,])

    t.start()

官方

#redlock 实现
pip install redlock-py


dlm = Redlock([{"host": "localhost", "port": 6379, "db": 0}, ])
要获得锁的地方
my_lock = dlm.lock("my_resource_name",1000)

要释放锁的地方
dlm.unlock(my_lock)
----------------------------------------
from redlock import Redlock


lock=Redlock([{"host": "localhost", "port": 6379, "db": 0}, ])


def task():
    my_lock=lock.lock("my_resource_name",1000)
    # 你的代码
    # 下单---》操作好多数据
    
    # 释放锁
    lock.unlock(my_lock)

分布式id

# 下单场景订单号     任务id号
# 在不同机器上,生成永不重复的 id号-->效率尽量高,尽量有规律递增

# 可以的方案
    1 uuid  规律递增,不会重复
    2 mysql 自增 --》容易被猜到,存在漏洞,效率不高
    3 redis 自增 ---》时间戳+机器id号+redis自增数字
    4 雪花算法
    5 美团 leaf算法

go 协程

# 进程
# 线程
------不能开启进程和线程----
---实现并发,go中有并发方案--》goroutine--》go协程
# 协程: 协程+线程池解决方案--》内部实现

gin框架

# 配置代理
# 下载
go get -u github.com/gin-gonic/gin
package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

func ping(c *gin.Context) {
    c.JSON(200, gin.H{
        "message": "pong",
    })
}
func index(c *gin.Context) {
    c.HTML(http.StatusOK, "index.html", gin.H{
        "title": "lqz",
    })
}
func demo(c *gin.Context) {
    var name = "彭于晏"
    c.String(http.StatusOK, "Hello %s", name)
}
func main() {
    r := gin.Default()
    r.LoadHTMLGlob("templates/*")
    r.GET("/ping", ping)
    r.GET("/index", index)
    r.GET("/demo", demo)
    r.Run("0.0.0.0:8000") // 监听并在 0.0.0.0:8000 上启动服务
}

 

标签:协程,name,lock,redis,time,gin,id,分布式
From: https://www.cnblogs.com/wzh366/p/18125290

相关文章

  • lida库介绍
    前言大家好,今天为大家分享一个超级厉害的Python库-lida。Github地址:https://github.com/microsoft/lida在当今信息爆炸的时代,自然语言处理(NaturalLanguageProcessing,NLP)技术变得越来越重要。Python作为一种功能强大且广泛应用的编程语言,拥有众多的NLP库,其中lida库......
  • 协程杂记
    协程杂记协程是什么协程是一种协作式多任务模型,不同于线程的抢占式多任务模型。协程是由程序员自己控制的,可以在任意时刻挂起或者恢复一个协程,更适合于用来实现彼此熟悉的程序组件。在通常使用线程的情景中,负责处理不同任务的线程之间存在着数据竞争,使用加锁可以解决问题,但其实......
  • [observe]面向Fedora Linux 40和Fedora Rawhide用户的安全警告(翻译)
    所有版本RedHatEnterpriseLinux(RHEL)均不受此漏洞影响。2024年3月30日补充:我们已确认FedoraLinux40beta版确实包含两个受影响的xz库版本——xz-libs-5.6.0-1.fc40.x86_64.rpm和xz-libs-5.6.0-2.fc40.x86_64.rpm。目前,Fedora40Linux似乎没有受到实际恶意软件攻击......
  • 协程操作
    协程操作一、asyncio模块asyncio模块是Python中实现异步的一个模块,该模块在Python3.4的时候发布async和await关键字在Python3.5中引入。因此,想要使用asyncio模块,建议Python解释器的版本不要低于Python3.5。二、事件循环所谓的事件循环,我们可以把它当作是一......
  • 协程理论
    协程理论一、单线程下的并发本节的主题是基于单线程来实现并发即只用一个主线程(很明显可利用的CPU只有一个)情况下实现并发为此我们需要先回顾下并发的本质:切换+保存状态当CPU正在运行一个任务会在两种情况下切走去执行其他的任务该任务发生了阻塞该任务计算的时间......
  • IDEA中使用tomcatconfiguration做服务器后,无法从html跳转到servlet的原因
    就我的项目而言,因为我没有用maven中的tomcat插件,用的是IDEA中的tomcatconfiguration,所以刚启动服务器生成的网址是http://localhost:8080/brand_demo_war/,而因为我的项目叫brand-demo,servlet叫做selectAllServlet,所以正常情况浏览器跳转到该servlet后的url应该是http://localhos......
  • 快速上手IntelliJ IDEA:配置与使用指南
    引言在当今软件开发领域,选择一款强大而高效的集成开发环境(IDE)对于开发人员来说至关重要。而IntelliJIDEA作为一款功能丰富、强大灵活的Java开发工具,在业界享有盛誉。本博客将带领读者深入了解IntelliJIDEA的配置与使用,旨在让开发者能够快速上手并熟练运用这一工具,提高开......
  • Sora开源平替 Stable Video Diffusion整合包
    Sora开源平替StableVideoDiffusion整合包StableVideoDiffusion,简称SVD,是一种基于人工智能技术的模型,由初创公司StabilityAI开发。它是基于之前发布的StableDiffusion文本转图片模型的延伸,能够通过现有的图片生成视频。这款模型在AI领域具有很大的应用潜力,可以为用户......
  • 如何用cadence617仿真出gm/id所需图标
        上次推文主要讲了gm/id的理论方法,这次推文以NMOS为例,主要关注如何用cadence617仿真出所需要的三张图标。        关于gm/id方法的理论推理-CSDN博客        方法视频传送链接:                Thegmidmethodology,adesigng......
  • java-validation(数据校验)
    @PostMapping("/register")@SystemLog(BusinessName="注册用户")//启动AOP实现日志记录publicResponseResultregister(@Validated(ValidateType.INSERT.class)@RequestBodyTsUsertsUser){returntsUserService.register(tsUser);......