• golang redis 分布式锁


    随机value 防止释放其他服务的锁 不可重入分布式锁

    import (
    	"crypto/rand"
    	"encoding/base64"
    	"errors"
    	"fmt"
    	"github.com/go-redis/redis/v7"
    	"time"
    )
    
    
    //分布式锁实现(不可重入)
    type RedisLock struct {
    	LockKey string
    	value   string
    }
    
    //保证原子性
    var delScript = `
    if redis.call('get',KEYS[1])==ARGV[1] then
    	return redis.call('del',KEYS[1])
    else
    	return 0
    end
    `
    
    func (rl *RedisLock) Lock(client *redis.Client, timeout int) error {
    	//随机数
    	if client == nil {
    		return errors.New("redis client is nil")
    	}
    	b := make([]byte, 16)
    	_, err := rand.Read(b)
    	if err != nil {
    		return err
    	}
    	rl.value = base64.StdEncoding.EncodeToString(b)
    	ok, err := client.SetNX(rl.LockKey, rl.value, time.Duration(timeout)*time.Second).Result()
    	if err !=nil && !ok {
    		errMsg := fmt.Sprintf("lock filed")
    		return errors.New(errMsg)
    	} else if err == nil {
    		return nil
    	} else {
    		errMsg := fmt.Sprintf("redis lock fail err: %v", err)
    		return errors.New(errMsg)
    	}
    }
    
    //解锁
    func (rl *RedisLock) Unlock(client *redis.Client) error {
    	if client == nil {
    		return errors.New("redis client is nil")
    	}
    	_, err := client.Eval(delScript, []string{rl.LockKey},[]string{rl.value}).Result()
    	return err
    }
    
  • 相关阅读:
    android 5.1 WIFI图标上的感叹号及其解决办法
    Recovery和Charger模式下屏幕旋转180度
    Android屏幕旋转总结
    Spring MVC 数据校验@Valid
    Spring注解装配
    Spring简单的REST例子
    Spring怎么引入多个xml配置文件
    spring使用c3p0报错
    Spring+JTA+Atomikos+MyBatis分布式事务管理
    (2-3)Eureka详解
  • 原文地址:https://www.cnblogs.com/9527s/p/14843396.html
Copyright © 2020-2023  润新知