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

SpringBoot整合Redis實現(xiàn)刷票過濾功能

 更新時間:2023年06月01日 10:17:59   作者:FeereBug  
隨著互聯(lián)網(wǎng)的不斷發(fā)展,網(wǎng)站或APP的用戶流量增加,也衍生出了一些惡意刷量等問題,給數(shù)據(jù)分析及運營帶來極大的困難,所以本文使用SpringBoot和Redis實現(xiàn)一個刷票過濾功能,需要的可以參考一下

引言

隨著互聯(lián)網(wǎng)的不斷發(fā)展,網(wǎng)站或APP的用戶流量增加,也衍生出了一些惡意刷量等問題,給數(shù)據(jù)分析及運營帶來極大的困難,出現(xiàn)的刷票問題更是造成了嚴重的經(jīng)濟損失,所以網(wǎng)站或APP對惡意刷票進行過濾是十分必要的。Redis提供了很好的解決方案,其提供的內(nèi)存存儲和Key-Value的存儲結(jié)構(gòu),能夠高效地實現(xiàn)刷票過濾。

本文主要介紹如何使用SpringBoot和Redis實現(xiàn)刷票過濾,自定義同一IP每天刷票不得超過次數(shù)。

一、概述

本文主要分為以下幾個模塊:

1.開發(fā)環(huán)境

2.使用Redis存儲數(shù)據(jù)

3.使用SpringBoot開發(fā)應用

4.實現(xiàn)同一IP每天刷票不得超過次數(shù)

二、技術選型

SpringBoot2.2.5.RELEASE

Spring5.2.4.RELEASE

JDK8

Redis

三、搭建開發(fā)環(huán)境

1.安裝JDK8

2.安裝Redis(版本不限,最好使用穩(wěn)定版)

3.新建SpringBoot項目

使用IDEA新建SpringBoot項目

四、使用Redis存儲數(shù)據(jù)

1. 在pom.xml中加入Redis依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.在application.yml中配置Redis

spring:
  redis:
    host: 127.0.0.1
    port: 6379

3. 在RedisConfig.java中配置RedisTemplate和StringRedisTemplate

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
    @Bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory){
        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
        stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
        return stringRedisTemplate;
    }
}

五、使用SpringBoot開發(fā)應用

1.在pom.xml中加入SpringBoot依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.新建Controller

@RestController
@RequestMapping("/vote")
public class VoteController {
    private final StringRedisTemplate redisTemplate;
    public VoteController(StringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }
    /**
     * 投票接口
     * @param ip
     * @return
     */
    @PostMapping("/submit")
    public String submit(@RequestParam String ip){
        String key = "ip:" + ip;
        // 先判斷是否已經(jīng)投票,如果已經(jīng)投票,則返回
        if(redisTemplate.opsForValue().get(key) != null){
            return "您已經(jīng)投過票了!";
        }
        // 獲取當天的日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String date = sdf.format(new Date());
        // 拼接當天投票的key
        String voteKey = "vote:" + date;
        // 將IP添加到Set中,記錄當天所有投票的IP
        redisTemplate.opsForSet().add(voteKey,ip);
        // 獲取當天已經(jīng)投票的IP數(shù)量
        long voteCount = redisTemplate.opsForSet().size(voteKey);
        // 判斷是否超過投票限制
        if(voteCount > 10){
            return "您今天的投票數(shù)已經(jīng)用盡!";
        }
        // 記錄已經(jīng)投票,設置過期時間為1天
        redisTemplate.opsForValue().set(key,"已經(jīng)投票", 1, TimeUnit.DAYS);
        return "投票成功!";
    }
}

六、 實現(xiàn)同一IP每天刷票不得超過次數(shù)

1. 在VoteController的submit接口中實現(xiàn)同一IP每天刷票不得超過次數(shù)

每次投票時,先通過Redis查看是否已經(jīng)投過票,如果已經(jīng)投過票,則返回“您已經(jīng)投過票了!”,否則將該IP添加到當天投票的Set中,再通過Redis查看當天投票的IP數(shù)量是否超過設定的閾值,如果超過則返回“您今天的投票數(shù)已經(jīng)用盡!”,否則記錄已經(jīng)投票,并將該條記錄設置為1天后過期。

上述邏輯可以采用Redis提供的Set和過期時間來完成,便捷高效。

2. 優(yōu)化方案

上述實現(xiàn)在高并發(fā)情況下可能存在問題,比如多個用戶同時投票,從而同時訪問Redis,產(chǎn)生并發(fā)問題或者性能問題,為此可以通過Redis的分布式鎖或者使用Redisson等第三方庫來解決。

下面簡單介紹一下使用Redisson來實現(xiàn)分布式鎖。

a. 在pom.xml中加入Redisson依賴

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.12.6</version>
</dependency>

b. 在application.yml中加入Redisson配置

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    database: 0
????redisson:
    address: redis://127.0.0.1:6379

c. 新建RedissonConfig.java

@Configuration
public class RedissonConfig {
    @Autowired
    private Environment env;
    @Bean(destroyMethod = "shutdown")
    RedissonClient redisson() throws IOException {
        // use "redis://" as the protocol
        Config config = new Config();
        config.useSingleServer().setAddress(env.getProperty("redisson.address"));
        return Redisson.create(config);
    }
}

d. 在VoteController中加入Redisson分布式鎖

@RestController
@RequestMapping("/vote")
public class VoteController {
    private final StringRedisTemplate redisTemplate;
    private final RedissonClient redissonClient;
    public VoteController(StringRedisTemplate redisTemplate, RedissonClient redissonClient) {
        this.redisTemplate = redisTemplate;
        this.redissonClient = redissonClient;
    }
    /**
     * 投票接口
     * @param ip
     * @return
     */
    @PostMapping("/submit")
    public String submit(@RequestParam String ip){
        String key = "ip:" + ip;
        // 使用Redisson加鎖
        RLock lock = redissonClient.getLock(key);
        lock.lock();
        try {
            // 先判斷是否已經(jīng)投票,如果已經(jīng)投票,則返回
            if (redisTemplate.opsForValue().get(key) != null) {
                return "您已經(jīng)投過票了!";
            }
            // 獲取當天的日期
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            String date = sdf.format(new Date());
            // 拼接當天投票的key
            String voteKey = "vote:" + date;
            // 將IP添加到Set中,記錄當天所有投票的IP
            redisTemplate.opsForSet().add(voteKey, ip);
            // 獲取當天已經(jīng)投票的IP數(shù)量
            long voteCount = redisTemplate.opsForSet().size(voteKey);
            // 判斷是否超過投票限制
            if (voteCount > 10) {
                return "您今天的投票數(shù)已經(jīng)用盡!";
            }
            // 記錄已經(jīng)投票,設置過期時間為1天
            redisTemplate.opsForValue().set(key, "已經(jīng)投票", 1, TimeUnit.DAYS);
            return "投票成功!";
        } finally {
            lock.unlock();
        }
    }
}

以上是使用Redisson實現(xiàn)分布式鎖的思路及代碼,從而在高并發(fā)情況下,避免了多個用戶同時對Redis進行訪問的并發(fā)問題。

七、總結(jié)

本文介紹了如何使用SpringBoot和Redis實現(xiàn)刷票過濾,自定義同一IP每天刷票不得超過次數(shù)的功能。

通過使用Redis的Set和過期時間,實現(xiàn)了同一IP每天刷票不得超過次數(shù)的限制,并且代碼簡單高效。

在高并發(fā)情況下,通過使用Redisson等庫實現(xiàn)分布式鎖,避免了多個用戶同時訪問Redis的性能問題。

在實際應用中,除了IP限制和過期時間設置外,還可以根據(jù)具體需求,對投票做更細粒度的控制,比如設置對投票用戶的身份驗證、對投票的時間和場次進行限制等等。

最后,需要注意的是,防范惡意刷票是非常重要的,但是過度的限制可能也會造成用戶體驗不佳,需要在保障數(shù)據(jù)安全的前提下,兼顧用戶體驗的優(yōu)化。
本文主要介紹了如何使用SpringBoot和Redis實現(xiàn)刷票過濾,自定義同一IP每天刷票不得超過次數(shù)的功能。同時,還對高并發(fā)情況下可能存在的問題進行了分析,并提出了一些優(yōu)化的方案。

到此這篇關于SpringBoot整合Redis實現(xiàn)刷票過濾功能的文章就介紹到這了,更多相關SpringBoot Redis刷票過濾內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java GUI圖形界面開發(fā)實現(xiàn)小型計算器流程詳解

    Java GUI圖形界面開發(fā)實現(xiàn)小型計算器流程詳解

    本文章向大家介紹Java GUI圖形界面開發(fā)實現(xiàn)小型計算器,主要包括布局管理器使用實例、應用技巧、基本知識點總結(jié)和需要注意事項,具有一定的參考價值,需要的朋友可以參考一下
    2022-08-08
  • Spring覆蓋容器中Bean的注解如何實現(xiàn)@OverrideBean

    Spring覆蓋容器中Bean的注解如何實現(xiàn)@OverrideBean

    文章介紹了在項目開發(fā)中如何通過偷梁換柱的方式重寫Spring容器中的內(nèi)置Bean,并指出了需要注意的兩點:1. 對應的Bean應基于接口注入;2. 如果不是基于接口注入,可以使用同包名同類名的方式重寫(可能存在潛在問題,不推薦),文章還強調(diào)了“基于接口編程”的好處
    2025-01-01
  • 基于mybatis-plus timestamp返回為null問題的排除

    基于mybatis-plus timestamp返回為null問題的排除

    這篇文章主要介紹了mybatis-plus timestamp返回為null問題的排除,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 解決java.lang.ClassCastException的java類型轉(zhuǎn)換異常的問題

    解決java.lang.ClassCastException的java類型轉(zhuǎn)換異常的問題

    這篇文章主要介紹了解決java.lang.ClassCastException的java類型轉(zhuǎn)換異常的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • MyBatis開發(fā)Dao層的兩種方式實現(xiàn)(原始Dao層開發(fā))

    MyBatis開發(fā)Dao層的兩種方式實現(xiàn)(原始Dao層開發(fā))

    這篇文章主要介紹了MyBatis開發(fā)Dao層的兩種方式實現(xiàn)(原始Dao層開發(fā)),并對數(shù)據(jù)庫進行增刪查改,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • SpringBoot配置文件方式,在線yml文件轉(zhuǎn)properties

    SpringBoot配置文件方式,在線yml文件轉(zhuǎn)properties

    這篇文章主要介紹了SpringBoot配置文件方式,在線yml文件轉(zhuǎn)properties,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • java Lambda表達式的使用心得

    java Lambda表達式的使用心得

    這篇文章主要介紹了java Lambda表達式的使用心得,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java如何使用JSR303校驗數(shù)據(jù)與自定義校驗注解

    Java如何使用JSR303校驗數(shù)據(jù)與自定義校驗注解

    這篇文章主要介紹了Java如何使用JSR303校驗數(shù)據(jù)與自定義校驗注解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Java實現(xiàn)精準Excel數(shù)據(jù)排序的方法詳解

    Java實現(xiàn)精準Excel數(shù)據(jù)排序的方法詳解

    在數(shù)據(jù)處理或者數(shù)據(jù)分析的場景中,需要對已有的數(shù)據(jù)進行排序,在Excel中可以通過排序功能進行整理數(shù)據(jù),而在Java中,則可以借助Excel表格插件對數(shù)據(jù)進行批量排序,下面我們就來學習一下常見的數(shù)據(jù)排序方法吧
    2023-10-10
  • Idea2024創(chuàng)建Maven項目沒有src文件夾的解決步驟

    Idea2024創(chuàng)建Maven項目沒有src文件夾的解決步驟

    本文主要介紹了Idea2024創(chuàng)建Maven項目沒有src文件夾,文中通過圖文示例介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-02-02

最新評論

安陆市| 宣化县| 朝阳区| 庆阳市| 扬中市| 公主岭市| 三门峡市| 湖南省| 忻州市| 马山县| 孝感市| 黎川县| 浏阳市| 侯马市| 祥云县| 仙居县| 库尔勒市| 垫江县| 瑞金市| 内丘县| 哈尔滨市| 扎囊县| 江陵县| 保德县| 海丰县| 寿阳县| 墨竹工卡县| 虎林市| 广东省| 呼图壁县| 巩义市| 南和县| 安福县| 阿拉尔市| 芜湖市| 罗江县| 巴楚县| 扎兰屯市| 莲花县| 麻江县| 台北县|