天天看點

從頭開始學Redisson--------限流器

一、限流器作用

        基于Redis的分布式限流器RateLimiter可以用來在分布式環境下現在請求方的調用頻率。既适用于不同Redisson執行個體下的多線程限流,也适用于相同Redisson執行個體下的多線程限流。

        RateLimter主要作用就是可以限制調用接口的次數。主要原理就是調用接口之前,需要擁有指定個令牌。限流器每秒會産生X個令牌放入令牌桶,調用接口需要去令牌桶裡面拿令牌。如果令牌被其它請求拿完了,那麼自然而然,目前請求就調用不到指定的接口。

緩存擊穿(2)接口需要限制調用次數

二、代碼

技術參考文檔:
RRateLimiter rateLimiter = redisson.getRateLimiter("myRateLimiter");
// 初始化
// 最大流速 = 每10秒鐘産生1個令牌
rateLimiter.trySetRate(RateType.OVERALL, 1, 10, RateIntervalUnit.SECONDS);
//需要1個令牌
if(rateLimiter.tryAcquire(1)){
    //TODO:Do something 
}      

        目前業務就是,向指定手機号發送短信。但是有每10秒隻允許發送1次的限制。完全可以使用Redisson限流器來完成。

package com.tyzhou.redisson.service;

import com.tyzhou.Constant;
import org.apache.commons.lang3.StringUtils;
import org.redisson.api.RRateLimiter;
import org.redisson.api.RateIntervalUnit;
import org.redisson.api.RateType;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author zhoutianyu
 * @date 2020/3/15
 * @time 18:55
 */
@Service
public class RateLimiterService {

    private static final Logger LOGGER = LoggerFactory.getLogger(RateLimiterService.class);

    @Autowired
    private RedissonClient redisson;

    public void sendMsg(String phone) {
        if (StringUtils.isNotBlank(phone)) {
            RRateLimiter rateLimiter =
                    redisson.getRateLimiter(Constant.REDISSON_RATE_LIMITER + phone);
            //每10秒産生1個令牌
            rateLimiter.trySetRate(RateType.OVERALL, 1, 10,
                    RateIntervalUnit.SECONDS);

            if (rateLimiter.tryAcquire(1)) {
                LOGGER.info("向手機:{}發送短信", phone);
            }
        }
    }
}      

         調用者:

@PostMapping("/send_msg")
    public void sendMsg(@RequestParam String phone) {
        while(true){
            rateLimiterService.sendMsg(phone);
        }
    }      

        用了一個死循環,但是從日志的列印效果上來看,每10秒才請求到一次我們的發送短信接口。

從頭開始學Redisson--------限流器