当前位置: 首页 > news >正文

主题巴士WordPressseo与网络推广的区别和联系

主题巴士WordPress,seo与网络推广的区别和联系,深圳设计师,网页源代码怎么看懂Redis分布式锁 Redis 分布式锁是一种使用 Redis 数据库实现分布式锁的方式#xff0c;可以保证在分布式环境中同一时间只有一个实例可以访问共享资源。 实现机制 以下是实现其加锁步骤#xff1a; 获取锁 在 Redis 中#xff0c;一个相同的key代表一把锁。是否拥有这把锁可以保证在分布式环境中同一时间只有一个实例可以访问共享资源。 实现机制 以下是实现其加锁步骤 获取锁 在 Redis 中一个相同的key代表一把锁。是否拥有这把锁需要判断key和value是否是自己设置的同时还要判断锁是否已经过期。 首先通过get命令去获取锁如果获取不到说明还没有加锁如果还没有加锁我们就可以去通过set命令去加锁并且需要设置一个expire过期时间防止成为一个长生不老锁那如果业务还没有执行完锁就释放了怎么办呢这个后面会提到续锁如果获取到了key说明已经被其他实例抢到了锁加锁失败加锁失败还需要根据一些操作例如超时时间内去重试加锁直到加锁成功或者超时 这些操作都需要原子性操作需要用lua脚本进行封装 lock.lua val redis.call(get, KEYS[1]) if val false thenreturn redis.call(set, KEYS[1], ARGV[1], EX, ARGV[2]) elseif val ARGV[1] thenredis.call(expire, KEYS[1], ARGV[2])return OK elsereturn end释放锁 释放锁的时候就是把key删除不过删除的时候需要判断是不是自己加的锁 unlock.lua if redis.call(get, KEYS[1]) ARGV[1] thenreturn redis.call(del, KEYS[1]) elsereturn 0 endGo 实现分布式锁 结构体字段配置 // redis客户端连接 type Client struct {client redis.CmdablevarFunc func() stringg singleflight.Group }// 锁的结构体 type Lock struct {client redis.Cmdablekey stringvalue stringexpiration time.Durationunlock chan struct{}unlockOne sync.Once }// NewClient creates a *Client func NewClient(client redis.Cmdable) *Client {return Client{client: client,varFunc: func() string {return uuid.New().String()},} }// 重试策略 type RetryStrategy interface {// Next determines the time interval for Lock// and whether Lock to retryNext() (time.Duration, bool) }// 周期性重试 type FixedIntervalRetry struct {Interval time.DurationMax intcnt int }lua 脚本使用go的embed映射到luaLock string var (ErrFailedToPreemptLock errors.New(redis-lock: failed to lock)ErrLockNotHold errors.New(redis-lock: lock not hold)ErrLockTimeout errors.New(redis-lock: lock timeout)//go:embed lua/unlock.lualuaUnlock string//go:embed lua/refresh.lualuaRefresh string//go:embed lua/lock.lualuaLock string )加锁Lock 加锁时有两种方案一种是比较简单的( TryLock )尝试加锁只需要传个过期时间另一种是比较完善的( Lock )加锁会有超时策略等 func newLock(client redis.Cmdable, key string, value string, expiration time.Duration) *Lock {return Lock{client: client,key: key,value: value,expiration: expiration,unlock: make(chan struct{}, 1),} }// TryLock tries to acquire a lock func (c *Client) TryLock(ctx context.Context,key string,expiration time.Duration) (*Lock, error) {val : c.varFunc()ok, err : c.client.SetNX(ctx, key, val, expiration).Result()if err ! nil {return nil, err}if !ok {return nil, ErrFailedToPreemptLock}return newLock(c.client, key, val, expiration), nil }// Lock tries to acquire a lock with timeout and retry strategy func (c *Client) Lock(ctx context.Context,key string,expiration time.Duration,timeout time.Duration, retry RetryStrategy) (*Lock, error) {var timer *time.Timerval : c.varFunc()for {lCtx, cancel : context.WithTimeout(ctx, timeout)res, err : c.client.Eval(lCtx, luaLock, []string{key}, val, expiration.Seconds()).Result()cancel()if err ! nil !errors.Is(err, context.DeadlineExceeded) {return nil, err}if res OK {return newLock(c.client, key, val, expiration), nil}interval, ok : retry.Next()if !ok {return nil, ErrLockTimeout}if timer nil {timer time.NewTimer(interval)} else {timer.Reset(interval)}select {case -timer.C:case -ctx.Done():return nil, ctx.Err()}} } 解锁unLock // Unlock releases the lock func (l *Lock) Unlock(ctx context.Context) error {res, err : l.client.Eval(ctx, luaUnlock, []string{l.key}, l.value).Int64()defer func() {l.unlockOne.Do(func() {l.unlock - struct{}{}close(l.unlock)})}()if errors.Is(err, redis.Nil) {return ErrLockNotHold}if err ! nil {return err}if res ! 1 {return ErrLockNotHold}return nil }小结 使用分布式锁本身会有各种各样的问题需要自己去处理异常情况例如超时等对锁的操作一定要判断是不是自己加的那把锁否则会误删会导致业务错误对锁的续约部分我们下一篇再讲 本文go的代码是完整的可以直接copy使用有兴趣的小伙伴可以去使用一下
http://www.hkea.cn/news/14405596/

相关文章:

  • 网站 框架图网站搭建推广优化
  • 电子商务网站主要功能在线视频直播网站建设
  • 想做个网站不知道怎么做新媒体运营的相关优势
  • 朔州市住房与城乡建设厅网站娱乐网站怎么制作
  • 网站打开是404错误软件开发项目实施方案
  • 建设网站需要提交什么资料一个完整的个人网站
  • 网站前后台代码无锡本地模板网站建设产品
  • 桂林餐饮兼职网站建设ppt主题模板下载免费
  • 做网站怎样建立服务器德阳小程序开发
  • 建设官方网站公司怎样建设淘客网站
  • 设置网站的默认文档电商创业需要多少资金
  • 通过RP如何做网站网站留言短信通知
  • 大连做网站的企业爱汉中app客户端
  • 做外贸的网站域名怎么买wordpress调查问卷
  • 金华市建设局网站网页传奇游戏排行
  • 自己网站建设要维护网推平台
  • 东莞网站建设 塑胶五金百度广告怎么推广
  • 网站后台管理系统多少钱easyphp搭建wordpress
  • 河南网站建设优化wordpress 迁移 新目录
  • 手机网站免费空间网络设计专业究竟好不好就业
  • 深圳网站制作hi0755中国建设银行北京市互联网网站
  • 住房和城乡建设部网站 绿地申请网站建设费用的请示
  • sem和seo哪个工作好资阳优化团队信息
  • 科技类网站怎么做做外贸需要关注的网站有什么好处
  • 高端网站开发方案岳阳市住房和城乡建设路网站
  • 网站架构设计英文翻译百度网站下拉排名
  • 做网站不带优化的吗可视化网页编辑工具
  • 网易 自助网站建设wordpress js无效
  • 哪个网站做婚礼邀请函好wordpress教程自学网
  • 马克·扎克伯格大学做的网站大连建设局网站地址