的情况
为科尔沁左翼等地区用户提供了全套网页设计制作服务,及科尔沁左翼网站建设行业解决方案。主营业务为成都网站设计、网站制作、科尔沁左翼网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
Redis作为一款非常受欢迎的开源内存数据库,已经普遍应用于不同社区环境中,其最强大之处在于可以通过其内置的、重写的建立锁来实现可靠的数据同步,实现资源的排他性访问和有效的冗余数据存储,但是Redis锁也存在一些值得我们注意的潜在缺陷。
Redis锁是信号量机制,不在进程内部实现,当我们使用Redis保证资源访问的排他性时,仍然存在危险的情况。比如,当进程B尝试获取该资源时,若资源已被进程A占有,而进程A由于网络原因无法释放该锁,此时就会出现进程B永久无法获得并使用该资源的情况。
另一方面,无论使用进程间同步/异步发送Redis命令的方式,都可能发生由于网络等原因而引起的数据读取延迟。由于访问这种数据的硬件架构的增加,这种延迟的发生几率也越来越高,从而打破可靠的数据同步机制,使得锁机制无法发挥本应拥有的原子性和可靠性。
为了避免这种潜在危险,可以借助常用的安全工具来保证Redis锁正确得以被使用,比如使用一把备用锁,当Redis锁被可能锁被持续占有时,使用备用锁来解决锁死危险。同时,使用实时系统处理网络延迟推进Redis锁的正常工作,以帮助正确地弱化或失效锁,从而实现安全的锁使用。
存在的潜在缺陷并不使Redis锁失去其作为一种让数据同步可靠的重要角色,但只要主动检测并妥善应用响应的保证金机制,就可以有效防范Redis锁可能存在的危险情况。
示例代码:
// 尝试获取Redis锁超时时间
public static final long LOCK_WT_SECONDS = 10;
// 上锁以后自动释放锁的超时时间
public static final long LOCK_EXPIRE_SECONDS = 10;
// 备用锁KEY
public static final String SPARE_LOCK = “spare_lock”;
private boolean getLock(String key, String value) {
return redisTemplate.opsForValue().setIfAbsent(key, value,
LOCK_WT_SECONDS, TimeUnit.SECONDS);
}
private void relaseLock(String key) {
// 获取备用锁
boolean spareLock = getLock(SPARE_LOCK, “”);
// 获取锁失败时释放备用锁
if (!spareLock) {
redisTemplate.delete(SPARE_KEI);
} else {
// 尝试释放 Redis 锁
redisTemplate.opsForValue.getOperations().delete(key);
// 如果没有释放给定 key,说明锁还被占用,释放备用锁
if (redisTemplate.hasKey(key)) {
redisTemplate.opsForValue.getOperations().delete(SPARE_KEI);
}
}
}
创新互联【028-86922220】值得信赖的成都网站建设公司。多年持续为众多企业提供成都网站建设,成都品牌网站设计,成都高端网站制作开发,SEO优化排名推广服务,全网营销让企业网站产生价值。
网站标题:Redis锁存在潜在缺陷一种危险(redis锁缺陷)
本文链接:http://www.mswzjz.com/qtweb/news34/191334.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联