go redis实现滑动窗口限流的方式(redis版)
作者:陶士涵 发布时间:2024-02-02 18:04:27
标签:go,redis,限流
之前给大家介绍过单机当前进程的滑动窗口限流 , 这一个是使用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
来源:https://www.cnblogs.com/taoshihan/archive/2020/12/14/14134840.html


猜你喜欢
- 复数数据结构在 cpython 当中对于复数的数据结构实现如下所示:typedef struct { double
- 简单总结:1、与类和实例无绑定关系的function都属于函数(function);2、与类和实例有绑定关系的function都属于方法(m
- 本文实例主要是实现爬取一个网页上的图片地址,具体如下。读取一个网页的源代码:import urllib.requestdef getHtml
- Linux版本升级:1、首先确认Linux操作系统中自带的python 版本时候与自己所需要的版本一致所有的python版本都在https:
- 引言在已有的网站中,几乎所有的网站都已经实现了 自动登录所谓自动登录,其实就是在你登录后,然后关闭浏览器,接着再启动浏览器重新进入刚刚的网站
- MSDN:包含正在 SQL Server 实例上运行的进程的相关信息。这些进程可以是客户端进程或系统进程。 视图中主要的字段: 1. Spi
- uWSGI是一个Web应用服务器,它具有应用服务器,代理,进程管理及应用监控等功能。它支持WSGI协议,同时它也支持自有的uWSGI协议,该
- 写在前面最近有几个有趣的小想法想实践一下,希望使用低功耗、低成本的硬件跑一些持续性的独立的服务。最初的想法是入手一个树莓派得了,开发板尺寸小
- 看到Python中有个函数名比较奇特,__init__我知道加下划线的函数会自动运行,但是不知道它存在的具体意义..Python中所有的类成
- Array()CInt()CStr() Date() DateAdd() Day() FormatCurrency() FormatDate
- 有时候我们可能会把CSV中的数据导入到某个数据库的表中,比如做报表分析的时候。对于这个问题,我想一点也难不倒程序人员吧!但是要是SQL Se
- 前言最近公司为客户重新部署了一套新环境,由我来完成了基础环境的配置,配置过程中总结了一些经验,分享给各位园友使用 curl 命令检查网络拿到
- python应用文件读取与登录注册功能,具体实现代码如下所示:#!/usr/bin/python3# -*- coding: utf-8 -
- 一、IDEA连接MySQL数据库(一)首先新建普通Java项目(二)连接数据库1、点击右侧DataBase2、点击加号,找到MySQL,添加
- asyncio在Python 2的时代,高性能的网络编程主要是使用Twisted、Tornado和Gevent这三个库,但是它们的异步代码相
- 问题在使用matplotlib作图的时候,有的时候会遇到画图时坐标轴重叠,显示不全和图片保存时不完整的问题。如下:解决方案画图时重叠或者显示
- 1. 介绍目的:公司的支付宝小程序向指定用户发送红包。场景:积分兑换、邀请注册。2.开通权限2.1开通服务说明:进入支付宝商家中心 → 营销
- 默认登录mysql之后可以通过SHOW VARIABLES语句查看系统变量及其值。mysql> show variables like
- 有人把Go比作21世纪的C语言,第一是因为Go语言设计简单,第二,21世纪最重要的就是并行程序设计,而Go从语言层面就支持了并行。gorou
- function getHTTPRequest() { var xhr = false; if (window.XMLHttpRequest