redis

几种常见的分布式锁的策略优缺点及对应处理

星期二, 十二月 19th, 2017 | JAVA-and-J2EE | 没有评论

在微信朋友圈看到的文章总结的很好,记录下以便翻阅.自己主要是以redis做分布式锁实现.

前言

随着互联网的发展,各种高并发、海量处理的场景越来越多。为了实现高可用、可扩展的系统,常常使用分布式,这样避免了单点故障和普通计算机cpu、内存等瓶颈。

但是分布式系统也带来了数据一致性的问题,比如用户抢购秒杀商品多台机器共同执行出现超卖等。有些同学容易将分布式锁与线程安全混淆,线程安全是指的线程间的协同。如果是多个进程间的协同需要用到分布式锁,本文总结了几种常见的分布式锁。

基于数据库

悲观锁—事务

比如用户抢购秒杀商品的场景,多台机器都接收到了抢购的请求,可以将获取库存、判断有货、用户付款、扣减库存等多个数据库操作放到一个事务,这样当一台机器与数据库建立链接请求了抢购商品这个事务,另外的机器只能等这个机器将请求完成才能操作数据库。在实际应用场景中,常常库存与交易是两个独立的系统,这时的事务是一个分布式事务,需要用到两段式、三段式提交。

优点:是比较安全的一种实现方法。

缺点:在高并发的场景下开销是不能容忍的。容易出现数据库死锁等情况。

乐观锁—基于版本号

乐观锁常常用于分布式系统对数据库某张特定表执行update操作。考虑线上选座的场景,用户A和B同时选择了某场次电影的一个座位,都去将座位的状态设置为已售。

设想这样的执行序列:
1、用户A判断该座位为未售状态;
2、用户B判断该座位为未售状态;
3、用户A执行update座位为已售;
4、用户B执行update座位为已售。

这样会出现同一个座位售出两次的情况,解决方案是在这张数据库表中增加一个版本号的字段。执行操作前读取当前数据库表中的版本号,在执行update语句时将版本号放在where语句中,如果更新了记录则说明成功,如果没有更新记录,则说明此次update失败。

加了乐观锁的执行序列:
1、用户A查询该座位,得到该座位是未售状态,版本号是5;
2、用户B查询该座位,得到该座位是未售状态,版本号是5;
3、用户A执行update语句将座位状态更新为已售,版本号更新为6;
4、用户B执行update语句时此时这个座位的记录版本号为6,没有版本号为5的这个座位的记录,执行失败。

优点:乐观锁的性能高于悲观锁,并不容易出现死锁。

缺点:乐观锁只能对一张表的数据进行加锁,如果是需要对多张表的数据操作加分布式锁,基于版本号的乐观锁是办不到的。

› Continue reading

Tags: ,

Redis3.2的保护模式

星期四, 十月 27th, 2016 | linux | 没有评论

Redis3.2的保护模式

针对之前Redis版本,默认无bind和密码设置存在很大安全风险;Redis3.2版本提出新特性protected mode(保护模式)。
如果Redis在启动时,未开启bind和密码设置功能,只能通过回环地址本地访问,如果尝试远程访问redis,会提示以下错误:

DENIED Redis is running protected mode because protected mode is enabled,
no bind address was specified, no authentication password is requested to clients.
In this mode connections are only accepted from the loopback interface.

当然也可直接执行CONFIG SET protected-mode no,关闭保护模式。
类似这种设置在MongoDB3.2或MySQL5.7的默认安全配置都有。

Tags:

centos快速安装redis部署

星期二, 六月 16th, 2015 | linux, webgame | 没有评论

每次部署环境的时候都要去安装下,写下文章记录下:
官方快速引导地址:http://redis.io/topics/quickstart

这里只是安装单实例版本,默认是6379的端口版本,预留配置文件等做多实例部署

1.安装redis最新的3.0.2版本

$ wget http://download.redis.io/releases/redis-3.0.2.tar.gz
$ tar xvzf redis-3.0.2.tar.gz
$ cd redis-3.0.2
$ make

2.复制执行文件到bin下(或者执行make install),若执行make test 请先yum install tcl

$ cp src/redis-server /usr/local/bin/
$ cp src/redis-cli /usr/local/bin/

› Continue reading

Tags: , , ,

Search

文章分类

Meta