redis用作计数器

  • 当遇到需求,在规定时间,用户的访问量不能超过规定次数的时候就可以用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());
        // 这个地方不可使用 json 序列化,如果使用的是ObjectRecord传输对象时,可能会有问题,会出现一个 java.lang.IllegalArgumentException: Value must not be null! 错误
        redisTemplate.setHashValueSerializer(RedisSerializer.string());
        return redisTemplate;
    }
}
  • 然后我们就可以用@Autowired进行注入到spring容器中使用了,这里我将方法都放在一个类中,用作与测试的
 /**
     * 利用redis做计数器
     * 可以处理业务上面的的一些访问次数之类的
     * 例如:文章的点赞数,阅读量,允许有一点的延迟效果,先保存到redis中,然后在同步到数据库当中
     */
    @RequestMapping("hello")
    public void count() {
        /**
         * 判断是否到达次数
         */
        Boolean aBoolean = invokeExceededTimes("time_key2",1,3);
        if (aBoolean) {
            LOGGER.info("可以访问");
        }else {
            LOGGER.info("请求次数达标了");
        }
    }

    /**
     * 判断同一个key在规定时间内访问次数是否到达了最高值
     * @param key   键
     * @param days  时间
     * @param count 一定时间内的访问次数
     * @return
     */
    public Boolean invokeExceededTimes(String key, int days, int count) {

        LOGGER.info("key值:{}",key);
        // 判断在redis中是否有key值
        Boolean redisKey = stringRedisTemplate.hasKey(key);
        if (redisKey) {
            // 获取key所对应的value
            Integer hasKey =Integer.parseInt((String)stringRedisTemplate.opsForValue().get(key));
            if (hasKey >= count) {
                return false;
            }
            // 对value进行加1操作
            stringRedisTemplate.opsForValue().increment(key,1);
            return true;
        }else {
            // 如果没有key值,对他进行添加到redis中
            stringRedisTemplate.opsForValue().set(key,"1",days,TimeUnit.DAYS);
        }
        return true;
    }
  • 这里面有用到这两个方法,关注一下
   // 对value进行加1操作
            stringRedisTemplate.opsForValue().increment(key,1);
     // 判断在redis中是否有key值
        Boolean redisKey = stringRedisTemplate.hasKey(key);
  • 最后我测试的是同一个key只能访问三次,当然根据业务需求来就行了,我这里只是一个测试
    在这里插入图片描述
  • 就到这里了,后面会分享更多的关于redis的操作
  • 10
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
Redis是一个开源的内存数据库,它可以用作计数器的储存和计算。在使用Redis作为计数器时,可以使用INCR命令来将存储在key中的数字值加1。如果key不存在,则会先将key的值设置为0,然后再执行INCR操作,使得key的值增加1。 举个例子,比如有一个接口请求,限制每秒请求总数为200次。可以使用Redis计数器来实现这个功能。当每个请求到达时,调用INCR命令来对一个特定的key进行加1操作,并获取当前key的值。如果key的值超过了限制的阈值(比如200),则等待下一秒再次请求。这样可以确保每秒的请求总数不会超过设定的限制。 需要注意的是,使用Redis作为计数器时,需要确保多个请求同时对同一个key进行加1操作时是线程安全的。可以使用Redis的原子操作来保证操作的原子性,从而避免并发冲突的问题。 在实际应用中,可以根据具体的需求来选择合适的Redis数据结构和命令,来实现更复杂的计数器功能,比如限制每分钟、每小时或每天的请求总数。<span class="em">1</span> #### 引用[.reference_title] - *1* [redis实现计数器-防止刷单方法介绍](https://download.csdn.net/download/weixin_38519060/14908117)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_46855885

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值