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

使用Redis實現(xiàn)記錄訪問次數(shù)的三種方案

 更新時間:2024年09月06日 08:56:05   作者:睆小白  
這篇文章主要介紹了使用Redis實現(xiàn)記錄訪問次數(shù)的三種方案,文中通過代碼示例和圖文講解的非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

0. 前言

準(zhǔn)備一個Controller,用來測試。

@RestController
@RequestMapping("test")
@Tag(name = "測試",description = "測試springMVC攔截器實現(xiàn)記錄訪問次數(shù)")
public class TestController {
    @GetMapping("getInfo/{id}")
    public String test(@PathVariable Integer id) {
        switch (id){
            case 1:
                return "1";
            case 2:
                return "2";
            default:
                return "3";
        }
    }
}

訪問次數(shù),記錄用戶訪問的次數(shù),一般有如下幾種方案:

1. 使用Filter實現(xiàn)

 emm有點麻煩,以后再說。

2. 使用AOP實現(xiàn)

1. 導(dǎo)入依賴

<!--        AOP依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

2. 寫一個切面類,實現(xiàn)統(tǒng)計訪問次數(shù)。

@Aspect // 表示這是一個切面
@Component // 托管到spring容器中
public class AccessRecordAspect {
    @Autowired
    private RedisTemplate<String,Object> redisTemplate;
    // 定義切點 匹配TestController中的test*方法
    @Pointcut("execution(* com.huan.web.controllers.TestController.test*(..))")
    public void a(){}

    // 使用后置增強,在方法正確執(zhí)行后執(zhí)行
    @AfterReturning("a()")
    public void record(JoinPoint joinPoint){
        System.out.println("記錄訪問記錄");
        // 獲取目標(biāo)方法參數(shù)
        Object[] args = joinPoint.getArgs();
        System.out.println(args[0]);
        redisTemplate.opsForValue().increment("訪問的數(shù)據(jù):"+args[0]);
    }
}

3. 開啟AOP

@Configuration
@ComponentScan
@EnableCaching // 開啟緩存功能
@EnableAspectJAutoProxy // 開啟aop功能
public class AppConfig {
}

4. 測試

訪問http://localhost:8080/test/getInfo/1 進行測試,測試結(jié)果。

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

5. plus版本

使用循環(huán)增強實現(xiàn),并將將redis中的記錄的數(shù)據(jù)返回給前端。

(1) 新建一個bean類

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class TestBean {
    private Integer id;
    private Long praise;
}

(2) 新增一個controller方法

在新增的controller方法中,返回一個map,將數(shù)據(jù)返回給前端。

@GetMapping("getInfo-getPraise/{id}")
public Map<String,Object> testPraise(@PathVariable Integer id) {
    Map<String,Object> map = new HashMap<>();
    TestBean testBean = null;
    testBean.setId(id);
    map.put("code",1);
    map.put("obj",testBean);
    return map;
}

(3) 新增一個循環(huán)增強方法

在新增的循環(huán)增強方法中,統(tǒng)計訪問次數(shù),并將訪問次數(shù)返回給前端。

@Pointcut("execution(* com.huan.web.controllers.TestController.testPraise*(..))")
public void c(){}
@Around("c()")
public Object showPraise_test(ProceedingJoinPoint joinPoint){
    System.out.println("showPraise_test顯示點贊數(shù)");
    //運行目標(biāo)方法返回的值
    Object proceed = null;
    try {
        proceed = joinPoint.proceed();
    } catch (Throwable e) {
        throw new RuntimeException(e);
    }
    Map<String,Object> map = (Map<String, Object>) proceed;
    TestBean testBean = (TestBean) map.get("obj");
    testBean.setPraise(redisTemplate.opsForValue().increment("PraiseNumById-test:"+testBean.getId()));
    return proceed;
}

(4) 測試

在這里插入圖片描述

3. 使用springMVC攔截器實現(xiàn)

1. 配置攔截器

@Configuration
@ComponentScan("com.huan.web")
public class InterceptorConfig implements WebMvcConfigurer {
    //這里需要注入攔截器,確保 RedisTemplate 在攔截器之前被正確創(chuàng)建和注入
    @Autowired
    private MyInterceptor myInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //將一個新的 MyInterceptor 實例添加到攔截器注冊表中
        //攔截/resfood/getById-map/*所有請求
        registry.addInterceptor(myInterceptor).addPathPatterns(
                        "/resfood/getById-map/**");
    }
}

注意如果這里沒有注入攔截器,可能會因為由于 RedisTemplate 沒有正確注入到你的攔截器中導(dǎo)致空指針異常(如下圖)。

2. 定義攔截器

在攔截器中使用RedisTemplate記錄訪問的次數(shù)。

@Component
public class MyInterceptor implements HandlerInterceptor {
    /*
        Spring Data Redis 提供的一個模板類,用于簡化與 Redis 數(shù)據(jù)庫的交互
        類似于map類型,可以存儲和檢索各種類型的數(shù)據(jù),包括字符串、對象、集合等。
        但是,它提供了一些額外的功能,如鍵的過期時間、哈希表操作、列表操作等。
    */
    @Autowired
    private RedisTemplate<String,Object> redisTemplate;
    /**
     * 在請求處理之后,視圖渲染之前執(zhí)行,用于進行資源清理
     */
    @Override
    public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, 
                    Object handler, 
                    ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
        //輸出接收的請求
        System.out.println(request.getRequestURI());
        String[] key = request.getRequestURI().split("/");
        System.out.println(Arrays.toString(key));
        //              操作值         自增1     鍵名為key[2]+":"+key[3]形成的新字符串
        redisTemplate.opsForValue().increment(key[2]+":"+key[3]);
    }
}

3. 控制器類

寫一個簡單的測試的控制器類。

@RestController
@RequestMapping("test")
//swagger注解
@Tag(name = "測試",description = "測試springMVC攔截器實現(xiàn)記錄訪問次數(shù)")
public class TestController {
    //rest風(fēng)格url
    @GetMapping("getInfo/{id}")
    public String test(@PathVariable Integer id) {
        switch (id){
            case 1:
                return "1";
            case 2:
                return "2";
            default:
                return "3";
        }
    }
}

4. 測試

在測試前在idea中查看redis中的數(shù)據(jù),在測試前redis中沒有任何數(shù)據(jù)。

在瀏覽器地址欄(或其他工具)輸入localhost:8080/test/getInfo/1,進行測試。

控制臺輸出。

再次查看redis中的數(shù)據(jù),發(fā)現(xiàn)多了鍵值,也記錄了訪問數(shù)據(jù)。

以上就是使用Redis實現(xiàn)記錄訪問次數(shù)的三種方案的詳細內(nèi)容,更多關(guān)于Redis記錄訪問次數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

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

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

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

    Redis Cluster添加、刪除的完整操作步驟

    這篇文章主要給大家介紹了關(guān)于Redis Cluster添加、刪除的完整操作步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)下吧。
    2017-09-09
  • 圖文詳解Windows下使用Redis緩存工具的方法

    圖文詳解Windows下使用Redis緩存工具的方法

    這篇文章以圖文結(jié)合的方式詳解Windows下使用Redis緩存工具的方法,感興趣的小伙伴們可以參考一下
    2015-12-12
  • Redis中的數(shù)據(jù)一致性問題以及解決方案

    Redis中的數(shù)據(jù)一致性問題以及解決方案

    這篇文章主要介紹了Redis中的數(shù)據(jù)一致性問題以及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • Redis和Lua使用過程中遇到的小問題

    Redis和Lua使用過程中遇到的小問題

    這篇文章主要給大家介紹了關(guān)于Redis和Lua使用過程中遇到的小問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Redis實現(xiàn)短信驗證碼登錄的示例代碼

    Redis實現(xiàn)短信驗證碼登錄的示例代碼

    本文主要介紹了基于Redis如何實現(xiàn)短信驗證碼登錄功能,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 詳解Redis如何處理Hash沖突

    詳解Redis如何處理Hash沖突

    在 Redis 中,哈希表是一種常見的數(shù)據(jù)結(jié)構(gòu),通常用于存儲對象的屬性,對于哈希表,最常遇到的是哈希沖突,那么,當(dāng) Redis遇到Hash沖突會如何處理?本文我們將詳細介紹Redis如何處理哈希沖突,需要的朋友可以參考下
    2024-09-09
  • Redis Cluster集群數(shù)據(jù)分片機制原理

    Redis Cluster集群數(shù)據(jù)分片機制原理

    這篇文章主要介紹了Redis Cluster集群數(shù)據(jù)分片機制原理,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • 詳解如何利用Redis實現(xiàn)生成唯一ID

    詳解如何利用Redis實現(xiàn)生成唯一ID

    隨著下單流量逐漸上升,為了降低數(shù)據(jù)庫的訪問壓力,需要通過請求唯一ID+redis分布式鎖來防止接口重復(fù)提交。今天我們就一起來看探討一下,如何通過服務(wù)端來完成請求唯一?ID?的生成
    2022-11-11
  • 防止redis內(nèi)存溢出優(yōu)化方法

    防止redis內(nèi)存溢出優(yōu)化方法

    本文主要介紹了防止redis內(nèi)存溢出優(yōu)化方法,包括使用maxmemory-policy選項、設(shè)置數(shù)據(jù)過期時間和配置Redis集群等,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03

最新評論

鄂托克前旗| 南康市| 古丈县| 达拉特旗| 石泉县| 阿克陶县| 宜章县| 长汀县| 长岛县| 扶沟县| 云和县| 赤城县| 安乡县| 砀山县| 青河县| 新乐市| 曲靖市| 南漳县| 繁峙县| 永胜县| 枞阳县| 潼关县| 漳浦县| 黔西县| 通辽市| 保康县| 湟源县| 七台河市| 油尖旺区| 织金县| 边坝县| 福鼎市| 磴口县| 万全县| 迁安市| 达尔| 利津县| 深圳市| 玉树县| 时尚| 容城县|