如何解决并发和重复请求?

哎呦-又忘了 发布于 2020/11/06 11:31
阅读 208
收藏 0

NGINX Sprint China 2022--NGINX年度旗舰盛会,已开启免费预约!>>>

感觉应该 没什么问题,但是觉得有点耗费资源?
希望大家指出问题,以及更好的方案


    @Autowired
    private RedisTemplate redisTemplate;

    @GetMapping("concurrent/key")
    public String concurrentKey() {
        String key = UUID.randomUUID().toString();
        redisTemplate.opsForValue().set(key, 0);
        redisTemplate.expire(key, 1 * 60 * 60, TimeUnit.SECONDS);
        return key;
    }

    /**
     * 考虑多节点部署
     * 解决并发和重复请求 (可以统一封装到拦截器)
     *
     * @param key
     * @return
     */
    @GetMapping("concurrent/and/repetition")
    public String concurrentAndRepetition(@RequestHeader("key") String key) {
        Boolean hasKey = redisTemplate.hasKey(key);
        if (!hasKey) {//解决重复请求
            return "erro key";
        }

        Long increment = redisTemplate.opsForValue().increment("increment:" + key, 1);
        if (increment != 1) {//解决并发
            return "Rep";
        }
        String dowork = "";
        try {
            dowork = dowork();
            redisTemplate.delete(key);
        } finally {
            redisTemplate.delete("increment:" + key);
        }
        return dowork;
    }

加载中
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部