- 当遇到需求,在规定时间,用户的访问量不能超过规定次数的时候就可以用redis中的计数器来实现了
- 又可以使用这个技术用来做限流(使用用户的ip作为key,用户访问一次,就加1,如果超过次数就返回false)
- 可以处理业务上面的的一些访问次数之类的,例如:文章的点赞数,阅读量,允许有一点的延迟效果,先保存到redis中,然后在同步到数据库当中
- 首先我们先初始化一下RedisTemplate,这个是操作redis的第三方库,我们先要对他初始化一下(重新序列化)
- 先把StringRedisTemplate注入进来,这里有人会用RedisTemplate可能会报错,可能是序列化的问题,私下百度一下就行了
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(RedisSerializer.string());
return redisTemplate;
}
}
- 然后我们就可以用@Autowired进行注入到spring容器中使用了,这里我将方法都放在一个类中,用作与测试的
@RequestMapping("hello")
public void count() {
Boolean aBoolean = invokeExceededTimes("time_key2",1,3);
if (aBoolean) {
LOGGER.info("可以访问");
}else {
LOGGER.info("请求次数达标了");
}
}
public Boolean invokeExceededTimes(String key, int days, int count) {
LOGGER.info("key值:{}",key);
Boolean redisKey = stringRedisTemplate.hasKey(key);
if (redisKey) {
Integer hasKey =Integer.parseInt((String)stringRedisTemplate.opsForValue().get(key));
if (hasKey >= count) {
return false;
}
stringRedisTemplate.opsForValue().increment(key,1);
return true;
}else {
stringRedisTemplate.opsForValue().set(key,"1",days,TimeUnit.DAYS);
}
return true;
}
stringRedisTemplate.opsForValue().increment(key,1);
Boolean redisKey = stringRedisTemplate.hasKey(key);
- 最后我测试的是同一个key只能访问三次,当然根据业务需求来就行了,我这里只是一个测试
![在这里插入图片描述](https://img-blog.csdnimg.cn/9244968358b040768c3db36c72433faa.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd2VpeGluXzQ2ODU1ODg1,size_20,color_FFFFFF,t_70,g_se,x_16)
- 就到这里了,后面会分享更多的关于redis的操作