当前位置: 首页 > news >正文

国外网站做盗版百度接单平台

国外网站做盗版,百度接单平台,找工作一般上什么网站比较好,网站建设公司兴田德润可信赖问题: 先执行get获取值,判断符合条件再执行incr、decr操作。在临界缓存失效的情况下,会默认赋值当前key为永不过期的0,再执行加减法,导致程序异常。 推荐解决方案: 1、限制接口频率:先incr&…

问题
先执行get获取值,判断符合条件再执行incr、decr操作。在临界缓存失效的情况下,会默认赋值当前key为永不过期的0,再执行加减法,导致程序异常。

推荐解决方案
1、限制接口频率:先incr,执行后值为1,说明是第一次执行,需要额外设置过期时间,再判断是否超过当前接口频率限制(注意上述步骤不可调换顺序)

2、使用lua脚本完整提交一次操作,脚本中的key可以保证一致。以加减库存为例,先查询key存在的情况下,再进行库存变更,如果不存在无需处理,等待下次缓存加载即为最新的值


问题描述

场景1:我们缓存了一个商品的库存,过期时间为5分钟,根据用户的购买和取消执行 incr、decr 操作。代码通常会这样来编写:

		// 库存存在则加一if(redisService.get(prefix, key, Integer.class) != null){redisService.incr(prefix, key);}

场景2:对访问频次进行限流,我们可以通过redis简单实现:

        // 首先获取当前访问频次Integer count = redisService.get(prefix, key, Integer.class);// 如果频次为空,则设置访问次数为1if (count == null) {redisService.set(prefix, key, 1);} else if (count < checkFrequencyCount) {// 如果频次小于限制,则设置访问次数加1redisService.incr(prefix, key);} else {// 如果频次超过限制,则限流throw new AppException("访问频次过高,请稍候再试");}

两种场景编码看似都没有问题,但实际运行中却发现redis中有一些key变成了永不过期的key,而且值不正确。

原因是: 因为redis的incr操作,当key不存在时, 会生成这个key并将值初始化为0, 并且默认设置key的有效时间为永久。


解决方案

1.优化Java代码,例如场景2。不论这个key是否存在都先加一,然后判断其过期时间是否为永不过期,如果是永不过期则说明是新生成的key,给它设置过期时间即可,如果非永不过期则无需操作。最后再判断一下是否值已经大于访问频次了,是则限流。

		long count = redisService.incr(prefix, key);// 判断必须放在后面,否则key没有过期时间永远无法清除long expire = redisService.ttl(prefix, key);if (expire == -1) {redisService.setExpire(prefix, key, accessExpireSecond);}if (count > checkFrequencyCount) {throw new AppException("访问频次过高,请稍候再试");}

2.使用lua脚本执行,保证原子性。

脚本updateStore.lua

--- 获取key
local key = KEYS[1]
--- 获取参数:incr、decr
local action = ARGV[1]
--- 如果key存在,再执行增加或减少的操作
if redis.call('exists', key) == 1 
then redis.call(action, key)return true
end 
return false

配置LuaConfiguration.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.scripting.support.ResourceScriptSource;@Configuration
public class LuaConfiguration {@Bean(name = "update")public DefaultRedisScript<Boolean> redisScript() {DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<>();redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("luascript/updateStore.lua")));redisScript.setResultType(Boolean.class);return redisScript;}
}

使用方法:

    @Resource(name = "update")private DefaultRedisScript<Boolean> redisScript;@Resourceprivate StringRedisTemplate stringRedisTemplate;// 执行脚本并传参Boolean result = stringRedisTemplate.execute(redisScript, Arrays.asList(stockPrefix.getPrefix() + key), "incr");
http://www.jinmujx.cn/news/106537.html

相关文章:

  • 企业网站建设记什么会计科目济南seo排名搜索
  • 北京市建设局网站企业网站系统
  • 企业门户网站汕头seo全网营销
  • 中国做二手房最大的网站网站媒体推广
  • 做目录网站注意关键词采集软件
  • 响应式电商网站制作百度竞价广告怎么收费
  • 有专门做ppt的网站seo专业课程
  • 有没有学做ppt发网站或论坛百度网盘搜索
  • wordpress专用空间如何进行搜索引擎优化 简答案
  • 哪里有网站建设官网免费的网站申请
  • 检测网站速度上海整站seo
  • 南沙规划建设局网站百度域名注册查询
  • wordpress主题汉化包怎么用seo优化的技巧
  • iis服务器网站301重定向怎么做网络营销策略研究论文
  • 菠菜网站做首存百度快照手机版
  • 名师工作室建设名师网站seo提升排名技巧
  • 做网站1008做网站 - 百度网站搜索引擎优化主要方法
  • 一个网站想看访客量怎么做真正永久免费的建站系统有哪些
  • wordpress插件 网站跳转百度自然搜索排名优化
  • 制作网站的方法有哪些内容信息流广告投放渠道
  • 微信采集wordpress优化seo是什么
  • 图片制作成视频的手机软件重庆seo顾问
  • 重庆技术支持 网站建设公司广告联盟论坛
  • 做vr网站google网址直接打开
  • 服务型政府门户网站建设windows7优化大师
  • 国家鼓励乡镇级政府网站建设企业建站公司
  • 五十家装修公司官网搜索引擎优化是什么意思
  • 永春信息网站建设招标营销案例100例小故事
  • 做新媒体国外网站中国进入一级战备2023
  • 天猫网站建设基本情况东营网站建设哪家更好