GithubHelp home page GithubHelp logo

ratelimit's Introduction

ratelimit用于对用户访问频率进行控制,同时支持一条或者多条用户访问控制策略,比如 每10秒只允许访问5次,每30分钟只允许访问50次,每天只允许访问500次,总体说来,比较灵活。 另外,ratelimit 用环形队列做为底层数据结构来存储用户访问数据,同时还针对于该队列做了缓存机制,所以有较高的性能

##测试代码如下

package main

import (
    "github.com/yudeguang/ratelimit"
	"log"
	"time"
)

func main() {
	log.SetFlags(log.Lshortfile | log.Ltime)
	/*
		初始化若干条访问控制规则 每10秒只允许访问5次,每30分钟只允许访问50次,每天只允许访问500次
	*/
	r := ratelimit.NewRule()
	r.AddRule(time.Second*10, 5)
	r.AddRule(time.Minute*30, 50)
	r.AddRule(time.Hour*24, 500)
	//模拟用户访问
	for {
		user := "小余"
		if r.AllowVisit(user) {
			log.Println(user, "访问一次,目前在相关时间段内还允许访问次数分别如下:", r.RemainingVisits(user))
		} else {
			log.Println(user, "访问数量过大,已经不允许访问,请过一段时间再试")
			break
		}
		time.Sleep(time.Second * 1)
	}
	log.Println("...............")
	for {
		user := "小明"
		if r.AllowVisit(user) {
			log.Println(user, "访问一次,目前在相关时间段内还允许访问次数分别如下:", r.RemainingVisits(user))
		} else {
			log.Println(user, "访问数量过大,已经不允许访问,请过一段时间再试")
			break
		}
		time.Sleep(time.Second * 1)
	}
	log.Println("...............")
	//模拟IP作为用户名访问
	for {
		ip := "127.0.0.1"
		if r.AllowVisitByIP4(ip) {
			log.Println(ip, "访问一次,目前在相关时间段内还允许访问次数分别如下:", r.RemainingVisitsByIP4(ip))
		} else {
			log.Println(ip, "访问数量过大,已经不允许访问,请过一段时间再试")
			break
		}
		time.Sleep(time.Second * 1)
	}
	log.Println("...............")
	//用户统计
	users := r.GetCurOnlineUsers()
	log.Println("目前所有在线用户如下:", users)
	log.Println("...............")
	//查看每个用户分别剩余的访问次数,注意如果用户是用IP4转化为INT64存储的,要用RemainingVisitsByIP4方法读取
	for _, user := range users {
		if ratelimit.IsIP(user) {
			log.Println(user, "目前在相关时间段内还允许访问次数分别如下:", r.RemainingVisitsByIP4(user))
		} else {
			log.Println(user, "目前在相关时间段内还允许访问次数分别如下:", r.RemainingVisits(user))
		}
	}
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.