主页 > 知识库 > go redis实现滑动窗口限流的方式(redis版)

go redis实现滑动窗口限流的方式(redis版)

热门标签:官渡电销外呼管理系统怎么收费 利用地图标注位置 江苏呼叫中心外呼系统有效果吗 400开头电话怎样申请 地图区域图标注后导出 杭州人工智能电销机器人费用 赤峰电销 贵州电话智能外呼系统 谷歌美发店地图标注

之前给大家介绍过单机当前进程的滑动窗口限流 , 这一个是使用go redis list结构实现的滑动窗口限流 , 原理都一样 , 但是支持分布式

原理可以参考之前的文章介绍

func LimitFreqs(queueName string, count uint, timeWindow int64) bool {
 currTime := time.Now().Unix()
 length := uint(ListLen(queueName))
 if length  count {
  ListPush(queueName, currTime)
  return true
 }
 //队列满了,取出最早访问的时间
 earlyTime, _ := strconv.ParseInt(ListIndex(queueName, int64(length)-1), 10, 64)
 //说明最早期的时间还在时间窗口内,还没过期,所以不允许通过
 if currTime-earlyTime = timeWindow {
  return false
 } else {
  //说明最早期的访问应该过期了,去掉最早期的
  ListPop(queueName)
  ListPush(queueName, currTime)
 }
 return true
}

开源作品

开源GO语言在线WEB客服即时通讯管理系统GO-FLY

github地址:go-fly

在线测试地址:https://gofly.sopans.com

附录:下面看下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
}

开源作品

开源GO语言在线WEB客服即时通讯管理系统GO-FLY

github地址:go-fly

在线测试地址:https://gofly.sopans.com

到此这篇关于go redis实现滑动窗口限流-redis版的文章就介绍到这了,更多相关go redis滑动窗口限流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
  • 基于Redis+Lua脚本实现分布式限流组件封装的方法
  • Python+redis通过限流保护高并发系统
  • Springboot使用redis进行api防刷限流过程详解
  • Redis和Lua实现分布式限流器的方法详解
  • php使用lua+redis实现限流,计数器模式,令牌桶模式
  • 基于Redis的限流器的实现(示例讲解)
  • 基于Redis实现分布式应用限流的方法
  • redis限流的实际应用

标签:鹰潭 宜春 武汉 河池 松原 黔西 泰安 保定

巨人网络通讯声明:本文标题《go redis实现滑动窗口限流的方式(redis版)》,本文关键词  redis,实现,滑动,窗口,限,;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。
  • 相关文章
  • 下面列出与本文章《go redis实现滑动窗口限流的方式(redis版)》相关的同类信息!
  • 本页收集关于go redis实现滑动窗口限流的方式(redis版)的相关信息资讯供网民参考!
  • 推荐文章