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

福建泉州网站建设营销类网站

福建泉州网站建设,营销类网站,成都网页开发,谷歌seo和百度seo区别前言: 相信很多小伙伴对缓存锁都不陌生,但是简单的缓存锁想要用好还是需要一些功力。本文总结了笔者多年使用缓存所的一些心得,欢迎交流探讨~ 幂等模型: 幂等场景一般由查重写入两步操作组成,两步操作组成一个最小完…

前言:

相信很多小伙伴对缓存锁都不陌生,但是简单的缓存锁想要用好还是需要一些功力。本文总结了笔者多年使用缓存所的一些心得,欢迎交流探讨~

幂等模型:

幂等场景一般由查重+写入两步操作组成,两步操作组成一个最小完整逻辑,再通过缓存锁保证原子性

实现:

实现redis分布式锁需要注意两个关键点:保证原子性、设置过期时间

保证原子性的目的:是为了保证同一时间只有一个请求能获取到锁

设置过期时间的目的:是为了防止解锁失败导致死锁

public class MethodLock {private static final Logger logger = LoggerFactory.getLogger(MethodLock.class);public static final String KEY_SEPARATOR = ":";public static final String PARAM_SEPARATOR = "_";public static final String KEY_PARAM_SEPARATOR = "#";public static final String SET_SUCCESS_RESULT = "OK";public static final String METHOD_LOCK = "doraemon:method:lock";private static Jedis jedis;private static Jedis getJedis() {if (jedis == null) {jedis = 自行实现;}return jedis;}/*** 获取锁** @param methodName 方法名,类名加方法名(例:MethodLock.getLock)* @param timeout    锁过期时间(单位秒)* @param params     参数(通过参数控制锁的粒度)* @return*/public static boolean getLock(String methodName, long timeout, String... params) {String method = "getLock|获取锁|";try {String key = getKey(methodName, params);String result = getJedis().set(key, methodName, "nx", "ex", timeout <= 0 ? 5 : timeout);if (Objects.equals(SET_SUCCESS_RESULT, result)) {return true;}} catch (Exception e) {logger.error(method + "执行失败,methodName={},timeout={},params={}", methodName, timeout, JSONObject.toJSONString(params), e);}return false;}/*** 释放锁** @param methodName 方法名,类名加方法名(例:MethodLock.getLock)* @param params     参数(通过参数控制锁的粒度)* @return*/public static boolean delLock(String methodName, String... params) {String method = "delLock|释放锁|";try {String key = getKey(methodName, params);long result = getJedis().del(key);if (result > 0) {return true;}} catch (Exception e) {logger.error(method + "执行失败,methodName={},params={}", methodName, JSONObject.toJSONString(params), e);}return false;}/*** 【私有方法】获取redis key** @param methodName* @param params* @return*/protected static String getKey(String methodName, String... params) {if (StringUtils.isBlank(methodName)) {return null;}String key = METHOD_LOCK + KEY_SEPARATOR + methodName;if (params != null && params.length > 0) {key += KEY_PARAM_SEPARATOR + Joiner.on(PARAM_SEPARATOR).useForNull("null").join(params);}return key;}

注意事项:

1、锁范围内的逻辑需要 完整+精简

锁范围内指的是:获取锁和释放锁中间的逻辑,只有必须保证原子性的关键的逻辑才能放入到锁范围内,其他的一些不相关逻辑完全可以放在锁范围外处理

完整:加锁的目的是为了解决并发问题,所以锁里面的逻辑要求完整,不完整的逻辑=没加锁

比如幂等场景下:一般是 查重+写入 两个操作需要保证原子性,这两个操作加起来就是一个完整逻辑

精简:精简的意思是在保证完整的前提下,不要有多余的逻辑,以免锁占用时间过长,进而影响性能

2、锁粒度选择要恰当

锁粒度指的是:锁对请求条件筛选的粗细程度,例如用户购买商品下单时可以 1、根据用户id加锁,2、也可以根据用户id + 商品id加锁,1和2就是两种粒度

锁的粒度太大会导致锁的范围过大,可能会影响当前逻辑之外的业务

锁的粒度太小会导致锁的范围过小,可能会导致锁失效

3、锁过期时间设置要合理

一般建议过期时间 = 逻辑执行时间 * 150%

过期时间太小可能导致在逻辑执行完成前,锁过期失效

过期时间太大+解锁失败,可能导致在锁过期失效之前重试的请求被拒之门外

4、加锁在try之前,锁中的逻辑使用try catch包围,解锁在finally里处理

若加锁操作在try catch中,并发场景下未获取锁的操作会执行到finally里将锁解除,影响正常逻辑

防止逻辑中出现异常,阻断流畅,导致解锁操作执行不到

5、基于redis的分布式锁并不100%可靠

在一些特殊情况下,比如redis宕机,数据丢失,可能会导致锁失效

http://www.15wanjia.com/news/40465.html

相关文章:

  • 网站建设需求方案全国疫情最新数据
  • 静安网站建设百度竞价排名平台
  • 怎么做网站的悬浮客服宁波网站建设网站排名优化
  • 网站权重划分seo快速提升排名
  • 网站前台数据库seo推广优化官网
  • 莱芜网站建设sem优化师是什么意思
  • 青岛网站维护公司互联网营销
  • 做网站一般有几个关键词友链之家
  • 献县做网站价格开户推广竞价开户
  • 江苏省城乡和建设厅网站做网站推广好做吗
  • 哪些外国购物网站可以做电商平台运营
  • 网友要求你帮助他在某网站做测试网页制作在线生成
  • 百度建设网站上海品牌推广公司
  • 西安市长安区规划建设局网站网络运营工作内容
  • 网站建设需要哪些成本网红推广团队去哪里找
  • 做个ppt模板网站开发免费seo网站优化
  • 上海企业网站设计公司友情链接样式
  • 如何拷贝网站代码手机系统优化
  • 浙江省建设职业注册中心网站云南百度推广开户
  • php怎么做p2p网站seo引擎优化外包
  • 苏州建筑类网站建设seo深度优化公司
  • 创造网站疫情防控最新数据
  • 空间设计网站公司百度问答怎么赚钱
  • 开发公司办出项目不动产证纪实网页搜索优化
  • 手机网站开发免费视频教程搜索seo引擎
  • 莆田高端网站建设百度知道电脑版网页入口
  • 小程序做网站软文推广页面
  • 增加网站广告位2345浏览器下载安装
  • 做行程的网站嘉兴seo外包公司
  • 6.网站开发流程是什么长沙谷歌优化