最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis接口訪問優(yōu)化的方法步驟

 更新時間:2024年10月16日 11:11:11   作者:何中應(yīng)  
本文基于之前的Redis接口訪問進(jìn)行優(yōu)化,引入了接口防抖功能,通過時間段參數(shù)限制接口調(diào)用頻率,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

說明:之前寫過一篇使用Redis接口訪問的博客,如下。最近有相關(guān)需求,把代碼拿出來后,做了一些優(yōu)化,挺有意思的,本文介紹在原基礎(chǔ)上

使用Redis實(shí)現(xiàn)接口防抖

優(yōu)化

總的來說,這次使用Redis實(shí)現(xiàn)接口防抖,增加了一個時間段參數(shù),可以限制接口在某個時間段內(nèi),訪問不能超過多少次。如下:

(自定義注解,打在接口上)

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定義注解
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LimitAccess {

    /**
     * 限制訪問的key
     * @return
     */
    String key();

    /**
     * 限制訪問次數(shù)
     * @return
     */
    int times();

    /**
     * 時間段
     * @return
     */
    int duration();
}

(切面,實(shí)現(xiàn)限制訪問)

import com.hezy.annotation.LimitAccess;
import lombok.extern.log4j.Log4j2;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;

/**
 * AOP類(通知類)
 */
@Component
@Aspect
@Log4j2
public class LimitAspect {

    @Value("${access.enable:false}")
    private boolean enable;

    @Autowired
    private RedisTemplate redisTemplate;

    @Pointcut("@annotation(com.hezy.annotation.LimitAccess)")
    public void pt(){};

    @Around("pt()")
    public Object aopAround(ProceedingJoinPoint pjp) throws Throwable {
        // 設(shè)置一個開關(guān),控制是否執(zhí)行
        if (!enable) {
            return pjp.proceed();
        }
        // 獲取切入點(diǎn)上面的自定義注解
        Signature signature = pjp.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;

        // 獲取方法上面的注解
        LimitAccess limitAccess = methodSignature.getMethod().getAnnotation(LimitAccess.class);
        // 獲取注解上面的屬性值
        int limit = limitAccess.times();
        String key = limitAccess.key();
        int duration = limitAccess.duration();

        // 遞增鍵的值,如果鍵不存在則初始化為1
        Long currentCount = redisTemplate.opsForValue().increment(key, 1);

        // 如果鍵是新創(chuàng)建的,設(shè)置過期時間
        if (currentCount != null && currentCount == 1) {
            redisTemplate.expire(key, duration, TimeUnit.SECONDS);
        }

        // 檢查是否超過限制
        if (currentCount != null && currentCount > limit) {
            log.info("訪問過于頻繁: " + pjp.toLongString());
            throw new RuntimeException("訪問過于頻繁");
        }
        return pjp.proceed();
    }
}

(使用,在對應(yīng)的接口上,打上注解,填上數(shù)值,如下表示,1秒內(nèi)不能訪問超過3次)

    @LimitAccess(key = "test", times = 3, duration = 1)
    @GetMapping
    public String test() {
        return demoService.test();
    }

另外,在代碼中加了一個開關(guān),可在配置文件中設(shè)置此配置,表示開啟或者關(guān)閉,默認(rèn)是關(guān)閉的

access:
  enable: true

啟動項目,測試一下

在這里插入圖片描述

思考

以上代碼,有兩點(diǎn)需要思考:

  • 注解能不能加在Service層的方法上,加了有沒有用?另外加了會不會讓聲明式事務(wù)失效?

  • 這個限制,沒有到用戶的維度,也就是說所有的用戶,只要在一個時間段內(nèi)訪問超過次數(shù)就限制,這顯然是不行的。有什么辦法嗎?

第一點(diǎn),我測試過,注解可以加在Service層方法上,是可以的,不會讓事務(wù)失效,如下:

    @LimitAccess(key = "deleteUserById", times = 3, duration = 1)
    @Transactional
    @Override
    public void deleteUserById(Integer id) {
        // 刪除用戶
        userMapper.deleteUserById(id);
        
        int i = 1 / 0;

        // 刪除用戶對應(yīng)的角色
        userMapper.deleteUserRoleMapper(id);
    }

接口限制,事務(wù),都生效了。

第二點(diǎn),這確實(shí)是個問題,要做到針對用戶層面的接口限制是必須的,不然有一個用戶惡意刷新,其他用戶都用不了了,這怎么可以。要解決這個問題,首先要拿到當(dāng)前操作用的標(biāo)識,用戶名、用戶ID,然后再存入key的時候,拼接上這個標(biāo)識作為key。

	String key = limitAccess.key() + 用戶標(biāo)識(用戶名、用戶id);

獲取當(dāng)前用戶信息,參考下面這篇文章:

獲取當(dāng)前用戶信息的幾種方式

如果你不是自己從0開發(fā)項目,一般成熟的項目都會有獲取當(dāng)前操作用戶信息的方式的。實(shí)在不行,你讓前端把用戶id作為參數(shù)傳給你,你在切面里獲取這個用戶id都可以。

總結(jié)

本文是對之前用Redis接口訪問的優(yōu)化,以及對兩個問題的考慮,希望能對大家有啟發(fā)。

獲取源碼:https://github.com/HeZhongYing/limit_access_demo

到此這篇關(guān)于Redis接口訪問優(yōu)化的方法步驟的文章就介紹到這了,更多相關(guān)Redis接口訪問優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis發(fā)布訂閱和實(shí)現(xiàn).NET客戶端詳解

    Redis發(fā)布訂閱和實(shí)現(xiàn).NET客戶端詳解

    發(fā)布訂閱在應(yīng)用級其作用是為了減少依賴關(guān)系,通常也叫觀察者模式。主要是把耦合點(diǎn)單獨(dú)抽離出來作為第三方,隔離易變化的發(fā)送方和接收方。下面這篇文章主要給大家介紹了關(guān)于Redis發(fā)布訂閱和實(shí)現(xiàn).NET客戶端的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 詳解Redis?鍵和字符串常用命令

    詳解Redis?鍵和字符串常用命令

    字符串是?Redis?最基本的數(shù)據(jù)結(jié)構(gòu),它將以一個鍵?和一個值?儲存在?Redis?內(nèi)部,本文重點(diǎn)給大家介紹Redis鍵和字符串常用命令,感興趣的朋友一起看看吧
    2022-02-02
  • 聊一聊redis奇葩數(shù)據(jù)類型與集群知識

    聊一聊redis奇葩數(shù)據(jù)類型與集群知識

    現(xiàn)在越來越多的項目都會利用到redis,多實(shí)例redis服務(wù)比單實(shí)例要復(fù)雜的多,這里面涉及到定位、容錯、擴(kuò)容等技術(shù)問題,下面這篇文章主要給大家介紹了關(guān)于redis奇葩數(shù)據(jù)類型與集群知識的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • 簡介Redis中的showlog功能

    簡介Redis中的showlog功能

    這篇文章主要介紹了簡介Redis中的showlog功能,作者同時對比了DEL命令的性能,需要的朋友可以參考下
    2015-06-06
  • 詳解Redis 數(shù)據(jù)類型

    詳解Redis 數(shù)據(jù)類型

    這篇文章主要介紹了Redis 數(shù)據(jù)類型的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08
  • redis 存儲對象的方法對比分析

    redis 存儲對象的方法對比分析

    這篇文章主要介紹了redis 存儲對象的方法對比分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Redis消息隊列實(shí)現(xiàn)秒殺教程

    Redis消息隊列實(shí)現(xiàn)秒殺教程

    這篇文章主要介紹了Redis消息隊列實(shí)現(xiàn)秒殺教程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Redis集群水平擴(kuò)展、集群中添加以及刪除節(jié)點(diǎn)的操作

    Redis集群水平擴(kuò)展、集群中添加以及刪除節(jié)點(diǎn)的操作

    這篇文章主要介紹了Redis集群水平擴(kuò)展、集群中添加以及刪除節(jié)點(diǎn)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • 查看redis占用內(nèi)存的實(shí)現(xiàn)方法

    查看redis占用內(nèi)存的實(shí)現(xiàn)方法

    這篇文章主要介紹了查看redis占用內(nèi)存的實(shí)現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • redis慢查詢?nèi)罩镜脑L問和管理方式

    redis慢查詢?nèi)罩镜脑L問和管理方式

    這篇文章主要介紹了redis慢查詢?nèi)罩镜脑L問和管理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評論

盱眙县| 济阳县| 河南省| 枣强县| 巴南区| 玉林市| 新源县| 永昌县| 汪清县| 杭锦旗| 山东省| 正安县| 孝感市| 平安县| 兰坪| 专栏| 乌鲁木齐市| 楚雄市| 嘉义县| 阳江市| 逊克县| 彭阳县| 江孜县| 无棣县| 南澳县| 柞水县| 安阳县| 乌兰县| 昭通市| 卫辉市| 长泰县| 灌云县| 富阳市| 溆浦县| 孝感市| 道孚县| 固始县| 金阳县| 杭州市| 杭州市| 富顺县|