Redis实现刷票过滤

news/2024/11/25 16:29:08/

引言:

随着互联网的不断发展,网站或APP的用户流量增加,也衍生出了一些恶意刷量等问题,给数据分析及运营带来极大的困难,出现的刷票问题更是造成了严重的经济损失,所以网站或APP对恶意刷票进行过滤是十分必要的。Redis提供了很好的解决方案,其提供的内存存储和Key-Value的存储结构,能够高效地实现刷票过滤。

本文主要介绍如何使用SpringBoot和Redis实现刷票过滤,自定义同一IP每天刷票不得超过次数。

一、概述

本文主要分为以下几个模块:

1.开发环境

2.使用Redis存储数据

3.使用SpringBoot开发应用

4.实现同一IP每天刷票不得超过次数

二、技术选型

SpringBoot2.2.5.RELEASE

Spring5.2.4.RELEASE

JDK8

Redis

三、搭建开发环境

1.安装JDK8

2.安装Redis(版本不限,最好使用稳定版)

3.新建SpringBoot项目

使用IDEA新建SpringBoot项目

四、使用Redis存储数据

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.1port: 6379

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

@Configuration
public class RedisConfig {@Beanpublic 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;}@Beanpublic StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory){StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();stringRedisTemplate.setConnectionFactory(redisConnectionFactory);return stringRedisTemplate;}
}

四、使用SpringBoot开发应用

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;// 先判断是否已经投票,如果已经投票,则返回if(redisTemplate.opsForValue().get(key) != null){return "您已经投过票了!";}// 获取当天的日期SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");String date = sdf.format(new Date());// 拼接当天投票的keyString voteKey = "vote:" + date;// 将IP添加到Set中,记录当天所有投票的IPredisTemplate.opsForSet().add(voteKey,ip);// 获取当天已经投票的IP数量long voteCount = redisTemplate.opsForSet().size(voteKey);// 判断是否超过投票限制if(voteCount > 10){return "您今天的投票数已经用尽!";}// 记录已经投票,设置过期时间为1天redisTemplate.opsForValue().set(key,"已经投票", 1, TimeUnit.DAYS);return "投票成功!";}
}

五、 实现同一IP每天刷票不得超过次数

1. 在VoteController的submit接口中实现同一IP每天刷票不得超过次数

每次投票时,先通过Redis查看是否已经投过票,如果已经投过票,则返回“您已经投过票了!”,否则将该IP添加到当天投票的Set中,再通过Redis查看当天投票的IP数量是否超过设定的阈值,如果超过则返回“您今天的投票数已经用尽!”,否则记录已经投票,并将该条记录设置为1天后过期。

上述逻辑可以采用Redis提供的Set和过期时间来完成,便捷高效。

2. 优化方案

上述实现在高并发情况下可能存在问题,比如多个用户同时投票,从而同时访问Redis,产生并发问题或者性能问题,为此可以通过Redis的分布式锁或者使用Redisson等第三方库来解决。

下面简单介绍一下使用Redisson来实现分布式锁。

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.1port: 6379database: 0redisson:address: redis://127.0.0.1:6379

c. 新建RedissonConfig.java

@Configuration
public class RedissonConfig {@Autowiredprivate Environment env;@Bean(destroyMethod = "shutdown")RedissonClient redisson() throws IOException {// use "redis://" as the protocolConfig 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 {// 先判断是否已经投票,如果已经投票,则返回if (redisTemplate.opsForValue().get(key) != null) {return "您已经投过票了!";}// 获取当天的日期SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");String date = sdf.format(new Date());// 拼接当天投票的keyString voteKey = "vote:" + date;// 将IP添加到Set中,记录当天所有投票的IPredisTemplate.opsForSet().add(voteKey, ip);// 获取当天已经投票的IP数量long voteCount = redisTemplate.opsForSet().size(voteKey);// 判断是否超过投票限制if (voteCount > 10) {return "您今天的投票数已经用尽!";}// 记录已经投票,设置过期时间为1天redisTemplate.opsForValue().set(key, "已经投票", 1, TimeUnit.DAYS);return "投票成功!";} finally {lock.unlock();}}
}

以上是使用Redisson实现分布式锁的思路及代码,从而在高并发情况下,避免了多个用户同时对Redis进行访问的并发问题。

六、总结

本文介绍了如何使用SpringBoot和Redis实现刷票过滤,自定义同一IP每天刷票不得超过次数的功能。

通过使用Redis的Set和过期时间,实现了同一IP每天刷票不得超过次数的限制,并且代码简单高效。

在高并发情况下,通过使用Redisson等库实现分布式锁,避免了多个用户同时访问Redis的性能问题。

在实际应用中,除了IP限制和过期时间设置外,还可以根据具体需求,对投票做更细粒度的控制,比如设置对投票用户的身份验证、对投票的时间和场次进行限制等等。

最后,需要注意的是,防范恶意刷票是非常重要的,但是过度的限制可能也会造成用户体验不佳,需要在保障数据安全的前提下,兼顾用户体验的优化。
本文主要介绍了如何使用SpringBoot和Redis实现刷票过滤,自定义同一IP每天刷票不得超过次数的功能。同时,还对高并发情况下可能存在的问题进行了分析,并提出了一些优化的方案。希望本文能够对大家有所帮助。

七、参考资料

  1. Spring Boot官方文档

  2. Redis官方文档

  3. Redisson官方文档


http://www.ppmy.cn/news/127037.html

相关文章

三星Galaxy S22和 三星Galaxy S22+参数对比

三星Galaxy S22和S22均采用Galaxy S系列标志性轮廓设计&#xff0c;摄像头外框与机身边框紧密融合&#xff0c;呈现一体化视觉效果。同时&#xff0c;两款产品配备了独特的平面屏幕&#xff0c;并在玻璃材质后壳上采用高品质哑光质感涂层。机身配色方面&#xff0c;三星Galaxy …

三星Galaxy S22、三星Galaxy22+和三星Galaxy22 Ultra区别

每款系列都有四种基本颜色&#xff0c;绯影红、雾松绿、羽梦白、曜夜黑&#xff0c;但不是每款机型的颜色都一致&#xff0c;此外还有三种或者四种三星网上商城专属颜色&#xff0c;比如远山灰、湖屿蓝和蔷薇红等&#xff0c;看自己的喜欢了。 三款手机的屏幕亮度都可以达到175…

三星Note 20 Ultra获印尼电信认证:型号SM-N985F

根据手机评测网的报道&#xff0c;三星计划在8月5日发布Galaxy Note 20系列&#xff0c;其中包括Galaxy Note 20&#xff0c;Galaxy Note 20 Plus和Galaxy Note 20 Ultra。最近&#xff0c;三星Galaxy Note 20 Ultra通过了印度尼西亚电信的认证&#xff0c;其型号确认为SM-N985…

西门子S7-200 Smart PLC下载

提示&#xff1a;本文为学习交流&#xff0c;禁止转载 文章目录 一、下载方式二、安装方式三、其他附件四、个人主页 一、下载方式 1、官方网站下载 链接&#xff1a; S7-200SMART 2、下载方式 直接下载安装 二、安装方式 关闭杀毒软件&#xff0c;直接安装即可 三、其他附件 1…

smart200plc

smart200型号资料整理 1、CPU SRXX [AC/DC/Relay] -- SR代表的是继电器型输出的plc [ ]中三个子母单词组合分 别代表的是交流电源输入&#xff0c;直流信号输入&#xff0c;继电器型输出 CPU STXX [DC/DC/DC] -- ST代表的是晶体管型输出的plc [ ]中的三个字母…

TMC2208电机驱动简介

TMC2208是一款超静音的两相步进电机驱动芯片&#xff0c;持续驱动电流1.4A&#xff0c;峰值电流2A&#xff0c;电压范围4.75V-36V&#xff0c;256细分&#xff1b;灵活的microPlyer插值单元&#xff0c;可提供高达256的细分&#xff0c;即使是在脉冲频率有限的系统中仍可完美地…

三星linux驱动文件格式,Samsung三星打印通用驱动

Samsung三星打印机通用驱动For Linux是三星官方打印及扫描驱动For Liunx的通用驱动安装程序&#xff0c;适用于用于多种型号的三星打印机&#xff0c;推荐使用Linux的用户下载更新。 安装指南 确保已经打印机连接到计算机。 打开计算机及打印机。 当管理员登录窗口出现时&#…