导航:首页 > 编程语言 > php分布式锁

php分布式锁

发布时间:2022-05-31 09:20:48

‘壹’ php 使用redis锁限制并发访问类示例

本文介绍了php
使用redis锁限制并发访问类,并详细的介绍了并发访问限制方法。
1.并发访问限制问题
对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功。
例如换领优惠券,如果用户同一时间并发提交换领码,在没有加锁限制的情况下,用户则可以使用同一个换领码同时兑换到多张优惠券。
伪代码如下:
if
A(可以换领)

B(执行换领)

C(更新为已换领)
D(结束)
如果用户并发提交换领码,都能通过可以换领(A)的判断,因为必须有一个执行换领(B)后,才会更新为已换领(C)。因此如果用户在有一个更新为已换领之前,有多少次请求,这些请求都可以执行成功。
2.并发访问限制方法
使用文件锁可以实现并发访问限制,但对于分布式架构的环境,使用文件锁不能保证多台服务器的并发访问限制。
Redis是一个开源的使用ANSI
C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
本文将使用其setnx方法实现分布式锁功能。setnx即Set
it
N**ot
eX**ists。
当键值不存在时,插入成功(获取锁成功),如果键值已经存在,则插入失败(获取锁失败)
RedisLock.class.PHP
<?php
/**
*
Redis锁操作类
*
Date:
2016-06-30
*
Author:
fdipzone
*
Ver:
1.0
*
*
Func:
*
public
lock
获取锁
*
public
unlock
释放锁
*
private
connect
连接
*/
class
RedisLock
{
//
class
start
private
$_config;
private
$_redis;
/**
*
初始化
*
@param
Array
$config
redis连接设定
*/
public
function
__construct($config=array()){
$this->_config
=
$config;
$this->_redis
=
$this->connect();
}
/**
*
获取锁
*
@param
String
$key
锁标识
*
@param
Int
$expire
锁过期时间
*
@return
Boolean
*/
public
function
lock($key,
$expire=5){
$is_lock
=
$this->_redis->setnx($key,
time()+$expire);
//
不能获取锁
if(!$is_lock){
//
判断锁是否过期
$lock_time
=
$this->_redis->get($key);
//
锁已过期,删除锁,重新获取
if(time()>$lock_time){
$this->unlock($key);
$is_lock
=
$this->_redis->setnx($key,
time()+$expire);
}
}
return
$is_lock?
true
:
false;
}
/**
*
释放锁
*
@param
String
$key
锁标识
*
@return
Boolean
*/
public
function
unlock($key){
return
$this->_redis->del($key);
}
/**
*
创建redis连接
*
@return
Link
*/
private
function
connect(){
try{
$redis
=
new
Redis();
$redis->connect($this->_config['host'],$this->_config['port'],$this->_config['timeout'],$this->_config['reserved'],$this->_config['retry_interval']);
if(empty($this->_config['auth'])){
$redis->auth($this->_config['auth']);
}
$redis->select($this->_config['index']);
}catch(RedisException
$e){
throw
new
Exception($e->getMessage());
return
false;
}
return
$redis;
}
}
//
class
end
?>
demo.php
<?php
require
'RedisLock.class.php';
$config
=
array(
'host'
=>
'localhost',
'port'
=>
6379,
'index'
=>
0,
'auth'
=>
'',
'timeout'
=>
1,
'reserved'
=>
NULL,
'retry_interval'
=>
100,
);
//
创建redislock对象
$oRedisLock
=
new
RedisLock($config);
//
定义锁标识
$key
=
'mylock';
//
获取锁
$is_lock
=
$oRedisLock->lock($key,
10);
if($is_lock){
echo
'get
lock
success<br>';
echo
'do
sth..<br>';
sleep(5);
echo
'success<br>';
$oRedisLock->unlock($key);
//
获取锁失败
}else{
echo
'request
too
frequently<br>';
}
?>
测试方法:
打开两个不同的浏览器,同时在A,B中访问demo.php
如果先访问的会获取到锁
输出
get
lock
success
do
sth..
success
另一个获取锁失败则会输出request
too
frequently
保证同一时间只有一个访问有效,有效限制并发访问。
为了避免系统突然出错导致死锁,所以在获取锁的时候增加一个过期时间,如果已超过过期时间,即使是锁定状态都会释放锁,避免死锁导致的问题。
源码下载地址:点击查看

‘贰’ zookeeper怎么实现分布式锁

1. 利用节点名称的唯一性来实现共享锁
ZooKeeper抽象出来的节点结构是一个和unix文件系统类似的小型的树状的目录结构。ZooKeeper机制规定:同一个目录下只能有一个唯一的文件名。例如:我们在Zookeeper目录/test目录下创建,两个客户端创建一个名为Lock节点,只有一个能够成功。
算法思路: 利用名称唯一性,加锁操作时,只需要所有客户端一起创建/test/Lock节点,只有一个创建成功,成功者获得锁。解锁时,只需删除/test/Lock节点,其余客户端再次进入竞争创建节点,直到所有客户端都获得锁。
基于以上机制,利用节点名称唯一性机制的共享锁算法流程如图所示:

该共享锁实现很符合我们通常多个线程去竞争锁的概念,利用节点名称唯一性的做法简明、可靠。
由上述算法容易看出,由于客户端会同时收到/test/Lock被删除的通知,重新进入竞争创建节点,故存在"惊群现象"。
使用该方法进行测试锁的性能列表如下:

总结 这种方案的正确性和可靠性是ZooKeeper机制保证的,实现简单。缺点是会产生“惊群”效应,假如许多客户端在等待一把锁,当锁释放时候所有客户端都被唤醒,仅仅有一个客户端得到锁。

2. 利用临时顺序节点实现共享锁的一般做法
首先介绍一下,Zookeeper中有一种节点叫做顺序节点,故名思议,假如我们在/lock/目录下创建节3个点,ZooKeeper集群会按照提起创建的顺序来创建节点,节点分别为/lock/0000000001、/lock/0000000002、/lock/0000000003。
ZooKeeper中还有一种名为临时节点的节点,临时节点由某个客户端创建,当客户端与ZooKeeper集群断开连接,则开节点自动被删除。
利用上面这两个特性,我们来看下获取实现分布式锁的基本逻辑:
客户端调用create()方法创建名为“locknode/guid-lock-”的节点,需要注意的是,这里节点的创建类型需要设置为EPHEMERAL_SEQUENTIAL。
客户端调用getChildren(“locknode”)方法来获取所有已经创建的子节点,同时在这个节点上注册上子节点变更通知的Watcher。
客户端获取到所有子节点path之后,如果发现自己在步骤1中创建的节点是所有节点中序号最小的,那么就认为这个客户端获得了锁。
如果在步骤3中发现自己并非是所有子节点中最小的,说明自己还没有获取到锁,就开始等待,直到下次子节点变更通知的时候,再进行子节点的获取,判断是否获取锁。
释放锁的过程相对比较简单,就是删除自己创建的那个子节点即可。
上面这个分布式锁的实现中,大体能够满足了一般的分布式集群竞争锁的需求。这里说的一般性场景是指集群规模不大,一般在10台机器以内。
不过,细想上面的实现逻辑,我们很容易会发现一个问题,步骤4,“即获取所有的子点,判断自己创建的节点是否已经是序号最小的节点”,这个过程,在整个分布式锁的竞争过程中,大量重复运行,并且绝大多数的运行结果都是判断出自己并非是序号最小的节点,从而继续等待下一次通知——这个显然看起来不怎么科学。客户端无端的接受到过多的和自己不相关的事件通知,这如果在集群规模大的时候,会对Server造成很大的性能影响,并且如果一旦同一时间有多个节点的客户端断开连接,这个时候,服务器就会像其余客户端发送大量的事件通知——这就是所谓的惊群效应。而这个问题的根源在于,没有找准客户端真正的关注点。
我们再来回顾一下上面的分布式锁竞争过程,它的核心逻辑在于:判断自己是否是所有节点中序号最小的。于是,很容易可以联想的到的是,每个节点的创建者只需要关注比自己序号小的那个节点。

3、利用临时顺序节点实现共享锁的改进实现
下面是改进后的分布式锁实现,和之前的实现方式唯一不同之处在于,这里设计成每个锁竞争者,只需要关注”locknode”节点下序号比自己小的那个节点是否存在即可。
算法思路:对于加锁操作,可以让所有客户端都去/lock目录下创建临时顺序节点,如果创建的客户端发现自身创建节点序列号是/lock/目录下最小的节点,则获得锁。否则,监视比自己创建节点的序列号小的节点(比自己创建的节点小的最大节点),进入等待。
对于解锁操作,只需要将自身创建的节点删除即可。
具体算法流程如下图所示:

使用上述算法进行测试的的结果如下表所示:

该算法只监控比自身创建节点序列号小(比自己小的最大的节点)的节点,在当前获得锁的节点释放锁的时候没有“惊群”。
总结 利用临时顺序节点来实现分布式锁机制其实就是一种按照创建顺序排队的实现。这种方案效率高,避免了“惊群”效应,多个客户端共同等待锁,当锁释放时只有一个客户端会被唤醒。

4、使用menagerie
其实就是对方案3的一个封装,不用自己写代码了。直接拿来用就可以了。
menagerie基于Zookeeper实现了java.util.concurrent包的一个分布式版本。这个封装是更大粒度上对各种分布式一致性使用场景的抽象。其中最基础和常用的是一个分布式锁的实现: org.menagerie.locks.ReentrantZkLock,通过ZooKeeper的全局有序的特性和EPHEMERAL_SEQUENTIAL类型znode的支持,实现了分布式锁。具体做法是:不同的client上每个试图获得锁的线程,都在相同的basepath下面创建一个EPHEMERAL_SEQUENTIAL的node。EPHEMERAL表示要创建的是临时znode,创建连接断开时会自动删除; SEQUENTIAL表示要自动在传入的path后面缀上一个自增的全局唯一后缀,作为最终的path。因此对不同的请求ZK会生成不同的后缀,并分别返回带了各自后缀的path给各个请求。因为ZK全局有序的特性,不管client请求怎样先后到达,在ZKServer端都会最终排好一个顺序,因此自增后缀最小的那个子节点,就对应第一个到达ZK的有效请求。然后client读取basepath下的所有子节点和ZK返回给自己的path进行比较,当发现自己创建的sequential node的后缀序号排在第一个时,就认为自己获得了锁;否则的话,就认为自己没有获得锁。这时肯定是有其他并发的并且是没有断开的client/线程先创建了node。

‘叁’ 有谁用过基于memache的分布式锁

像memcache和redias这些想要与PHP结合的话一般都是有组件提供给你去使用的,
按照官方给的参考去做就可以了,要是想更具使用性建议自己封装操作类。

‘肆’ 基于java jsp asp php vb安卓系统毕业设计与实现论文源码下载

及时送上了计算机毕业设计相关资源 合意的换请采纳一下,大家顺遍点下赞吧
在线考试制卷系统(任务书,论文,源码)
net小型证券术语解释及翻译系统的设计与开发(源码,论文)
原创vf员工培训管理系统(任务书,论文)
asp科研信息管理系统(任务书,开题,论文,源码)
android小型企业工资管理系统(源码,论文)
asp出租车管理系统(任务书,论文,源码)
vb.net实验室计算机的ip地址自动设置程序——服务器端(任务书,论文,源码)
rsa可视化算法程序的实现与研究(任务书,论文)
j2ee数控加工技术教学素材资源库的构建(任务书,论文,源码)
eims系统-oa子系统的设计与开发(任务书,开题,论文,源码)
jsp网上购书(任务书,论文)
vb图书管理系统(任务书,论文)
vc户籍管理系统(任务书,论文,源码)
php基于bs结构的工艺品销售系统的实现(源码,论文)
net模块化动态电子商务网站的开发(任务书,论文,源码)
pb电信人事管理系统设计(任务书,论文)
vb成本费用计算系统(源码,论文)
jsp出租车管理系统(任务书,开题,论文,源码)
asp.net求职招聘网站设计(源码,论文)
vb.net机房监控系统(全套)
vf学生办证管理系统(任务书,开题,论文,源码)
jsp基于网络超市商品销售管理系统(任务书,论文,源码)
jsp团员管理
asp.net一个动态文学网站
vf基于jme平台的掌上网络商店-服务器端的开发
c#报警系统
net(vc)办公自动化管理系统
jsp计算机等级考试查询系统jdbc
vb.net商品配送中心库存仿真软件设计
jsp网络购物
net在线英语自学系统——知识库管理的设计
jsp企业进销存管理系统
php某公司进销存信息管理系统
pb干部档案管理系统
delphi学生信息管理系统毕业设计
asp学生信息管理系统
asj2eetoc电子商务网站
delphi图书管理系统(毕业程序翻译%通过)
jsp网上商城系统
jsp客户关系管理系统
jsp企业人事管理系统
c#办公管理系统
jsp搜索引擎的研究与实现
jsp网络房产信息超市
php会员管理系统
j2ee基于usbkey的文件加密工具—-客户端的实现
net网上图书订阅系统的设计
php网站流量统计
asp.net团员管理
android文件传输
delphi并行接口器件功能演示的可视化设计学位
php房屋租赁管理信息系统jdbc
数据采集电路pcb的设计与制作
androidsmart系统-考试监控及阅卷模块的设计与开发
java流动资金贷款业务系统
asp电脑配机
vf物流管理系统--仓储管理子系统的实现
简化的cpu逻辑功能的仿真实现
net网上教材管理系统
net高校学生宿舍管理系统
vc药品公司进销售存管理系统
基于des加密算法的word加密插件的实现
asp.net基于asp.net的房产中介系统
c#简单图片转化
asp基于asp的反垃圾邮件管理系统的设计
delphi航空客运订票系统
c#windows简单防火墙设计与实现
j2ee车间调度系统
php《信息论与编码》在线考试系统
vb.net基于角色访问控制的oa系统
asp某小型数字图书馆
vb图形识别和编辑
pb电脑公司财务管理系统
asp网上购书
android光盘信息管理系统
php新闻网程序
php购物系统
vb.net考试系统vb.net
java学生管理系统
基于apriori算法的关联规则挖掘系统
vf布匹出口管理系统
c#会计电算化系统——财务管理子系统
php毕业生信息管理系统
pb酒店客房餐饮管理系统
vf库存管理
asp.net药品销售数据管理系统
asp.net网上论坛
基于linux的远程控制技术服务端实现
php网络商城
文件压缩解压缩实践
asp学生管理系统
php科研项目网上申报管理系统
vb.net图片文件中的信息隐藏和还原的设计
asp销售供应链管理系统的设计与开发
asp基于asp技术的猎头公司管理软件的设计和实现——内部事务部分
网络求职招聘系统
neterp系统(毕业设计
php基于web的商场管理系统
vb电脑公司财务管理系统
delphi客户管理系统
net图书馆管理信息系统
java超市商品管理系统
pb在线考试
java原创库存管理系统可执行程序
c语言文件系统设计
基于webservice的数据库同步系统
vb.net考勤管理系统vb.net
vb简单几何图形的识别和编辑系统
net某公司员工管理系统
vf酒店客房管理系统
vf商场管理系统
vb.net开发在windows下的串口异步通信程序
asp一个小型搜索引擎
j2ee高速公路票据管理系统
vb小区物业管理系统
php酒店房间预约系统设计
asp《信息论与编码》在线考试系统
vf宿舍管理系统
android基于局域网的文件传输系统
asp学生网上选课系统
php校园学生信息在线管理系统
asp基于web的商场管理系统
net基于web的订餐系统
jsp仓储管理系统
简易网络存储系统
javaftp客户端
jsp公交查询系统
java人才管理系统
net企业投资价值分析系统
asp基于bbs的bbs系统设计(structmy)好
android通用图书馆管理系统
asp网上选课系统
最新asp网上论坛
vc网络爬虫程序
net考勤系统(net)
net交通信息网上查询系统
美食网站
pb企业物料需求计划管理系统
delphi公交车查询系统delphi源
asp.net网络招聘系统
asp视频点播系统
vf学生学籍管理
android毕业管理系统
简易网络存储系统
vb.net一种基于cc模式的网上购物系统
asp.net网络文件管理系统
asp.net学生信息管理系统
j2ee城市公交查询系统
j2ee人机接口设备—示波器的仿真实现
jsp网络商城
net基于bs的图书销售管理系统
net基于net的公司网站
j2ee汽车零件销售管理系统
vf图片文件中的信息隐藏和还原的设计
vf医药管理系统
net技术的猎头公司管理软件——内部事务部分
最新net高校学生宿舍管理系统
vb局域网抓包软件
asp.net企业物流平台
asp.net学生排课管理系统
vb.net网络数据包捕获工具
android企业考勤
c#在线考试
j2eealendar的跨平台系统的设计
vf书店辅助进书系统
asp仓库即时查询系统
asp作业提交与批改系统
vb开发在windows下的串口异步通信程序
javaac自动组卷系统
asp网上体育用品商店
jsp华夏文化交流平台
delphi采购管理
php校园新闻发布管理系统
vb.net成绩管理系统vb.net
delphi五子棋游戏(网络版)的设计与开发
最新net网上图书订阅系统的设计
vb教学辅助系统vb
android试题库自动组卷系统
vc试题库自动组卷系统(vc)cym
asp.net基于bs的家教交流平台的实现
vf学生成绩管理系统vf
asp.net楼宇专业网站毕业设计
net多语种网络硬盘系统的设计
vf考试系统vf
端口信息工具
vf物业管理
net公交车管理系统的实现与设计
pb基于半打开的端口扫描技术及其实现
j2ee水费管理系统
vf用遗传算法解决车辆优化调度问题任务书
jsp办公自动化管理系统
jsp基于android的在线购物系统
asp.net车辆调度管理系统
pb线程插入木马
delphi基于delphi的串口通信服务的开发
asp药店管理系统
jsp实验室设备管理系统
kasumi算法的研究与j2ee实现
net基于.net的城市公交查询系统
jsp基于web的subversion用户管理系统phb
delphivbd租赁管理系统
linux下的网络层加密解密的实现
android药品公司进销售存管理系统
asp服装销售系统
j2ee电信人事管理系统设计
jsp员工信息管理系统
android考勤管理系统android
vf基于.net的网上购物系统
vb.net财务管理系统
vc题库管理系统
delphi基于webcam的人脸检测技术
php在线学习系统
最新php团员管理
vb原创图书管理系统)毕业设计
net某企业信息管理系统
asvbtoc电子商务网站
vf火车站售票管理系统
asp科研信息管理系统
net某企业信息管理系统
vb基于usbkey的文件加密工具—-客户端的实现
net基于.net企业订单管理系统的开发
net房地产评估系统
net作业在线提交系统
vc多线程与线程安全实践-基于http协议的断点续传
vf地税局工资管理系统
delphi科研管理系统
delphi烟花爆竹经销管理系统
面向internet上的cscw的共享白板
php网络招聘系统
php网上求职与招聘系统
vb.net机房监控系统
asp.net考试报名信息处理系统
j2ee医院病房管理系统
基于进程和通信隐藏的木马设计与实现
net息加密与隐藏工具
c#汽车销售系统
jsp原创教师信息管理系统
android简易web服务器研究
asp科研项目网上申报管理系统
asp基于asp的论坛
php计算机组成原理教学网站
android超市销售系统
c#网络流量监控及分析工具
delphi电子邮件客户端软件
android排课系统程序
jsp网上拍卖平台系统)
j2ee某百货店pos积分管理系统-积分添加和通票回收
j2ee教务管理系统j2ee
vf银行代扣代发工资系统
php学生学籍管理系统
基于webservice的异构数据库检索系统的设计
android长途汽车信息管理系统
net系办办公自动化系统
c#网络计时管理系统
net网络商店销售管理系统
原创net高校学生宿舍管理系统
asp网络教学评判系统
net客户关系管理系统的实现
c语言遗传算法在求解tsp问题毕业
asp.net网上教学资源共享系统
基于icmp模拟网络控制软件的开发——控制管理模块
vb车间调度系统
net动态口令认证的网上选课系统
asp.net图书馆管理系统
asp企业公告及资料发布系统
pb原创图书管理系统)毕业设计
vf基于cs结构的企业人事管理系统
网络嗅探器
jsp网上书店售书系统
asp.net网上选课系统
asp酒店客房管理系统
asp.net自动排课系统
net信息安全研究所设备管理系统
最新net基于bs的图书销售管理系统
java药品销售系统
java简单小游戏设计
jsp基于web的旅游网站建设
android库存管理
php淘宝店主交易管理系统
net频点播系统
pb大型机房学生上机管理系统
jsp基于bs结构的工厂设备管理系统的设计与开发
web的入侵防御系统
最新php基于bbs的bbs系统设计(structmy)好
asp教师信息管理系统
net课件发布系统
j2ee在线英语自学系统——课程及自测管理的设计
asp网上二手商品交易管理系统
原创asp.net购物系统
pb小说租阅管理系统
人机接口设备—开关类部件的仿真实现
net校园新闻发布系统
php基于linux的远程管理系统客户端的实现
php在线exam
delphi物质管理系统
vb.net电信人事管理系统设计
android试题库自动组卷系统(android)cym
j2ee学生档案管理
net基于.net的内部邮件系统实现
asp.net学科建设
asp某公司进销存信息管理系统
java企业投资价值分析系统
java大随机数生成器算法的研究与实现
jsp某高校工资管理系统
vb在线英语自学系统——课程及自测管理的设计
net某店pos积分管理系统-清除履历表、日志表、月购买额
asp会员管理系统
原创美食网站
vs家庭理财系统
局域网监听系统
vc房屋租凭管理系统
jsp在线二手交易系统
vb.net模拟器件测试平台的设计与开发
原创net考勤系统(net)
java酒店管理信息系统
原创网络求职招聘系统
vf高校教务排课系统
c#rsa密码体制的实现
端口扫描与检测技术的实现
delphi猜数游戏的设计与开发
php宿舍管理系统设计
j2eeac自动组卷系统
原创php网络购物
android物质管理系统
php实验室设备管理系统
asp求职招聘网站设计
androidsc结构服装专卖店
net电子购物商城系统
java自动排课系统
java职员信息管理系统
vb书店辅助进书系统
android教师管理系统
jsp基于bs模式的中小企业人事管理系统
vc物质管理系统
最新简易网络存储系统
android并行接口器件功能演示的可视化设计学位
原创基于des加密算法的word加密插件的实现
net频点播系统
asp.net网络旅游信息系统
原创asp计算机组成原理教学网站
jsp车辆调度管理系统
asp.net基于bs的工艺品展示系统
基于纠错码的容错技术的研究——x码
asp电子商务系统
pb原创库存管理系统可执行程序
c#企业往来账务管理系统
vc超市售货管理系统
原创net网上图书订阅系统的设计
android人事管理系统
原创php在线学习系统
vf桌面日历系统
java商业汇票(支票管理)
asp聊天室
java计科教务管理系统
vb.net物业管理系统
asp公共课平时成绩查询系统asp
最新asp会员管理系统
vc书店管理系统
win平台下的pe文件病毒的研究及实现
j2ee电子邮件客户端软件
asp.net基于asp.net的学生信息管理系统
vf企业人事工资管理系统
vbrsa密码体制的实现
java基于bs方式的即时通讯软件
vf煤气站管理系统dpac
pb多媒体教学控制系统-网络通讯平台的设计
delphi酒店管理系统
jsp基于bs结构的工厂设备管理系统的设计与开发
jsp企业人力资源管理系统的设计
java课程设计医药管理系统(java)应要求源文件代码打包上传
j2ee实验室仪器管理系统
pb网吧管理系统
pb车队综合业务管理系统
最新php网络商城
c#大随机数生成器算法的研究与实现
asp基于bs结构的二手交易系统
javad的网络三维技术
最新net考勤系统(net)
jsp基于web的信息处理系统
net小型门户网自助建站系统
社区论坛
asp公交查询系统
java文档资料管理系统
php红旗汽车修理厂物资流通管理系统
校园网络工程综合布线方案
vc高校缴费系统
php格式化系统——前台
原创asp网上选课系统
最新asp校园学生信息在线管理系统
android基于特征的入侵检测系统
vb人事管理系统
vb.net图书管理系统
java简易web服务器研究
jsp基于jsp学生成绩管理系统软件的开发
net模块化动态电子商务网站的开发
delphi中大迅通合同统计系统
linux下的简单网络管理控制系统的设计与开发
vf航空售票模拟系统
vb通用销售管理系统
c#教学信息管理系统毕业
vc企业投资价值分析系统
j2ee基于bs方式的即时通讯软件
asp.net科研信息管理系统
vb.net软件项目开发管理系统vb.net
android可视化图像处理系统
c#高校题库管理系统附原代码程序万字
net基于.net电子相册的开发
pb商品配送中心库存仿真软件设计
android成本费用计算系统
asp.net旅游信息管理系统
j2ee宿舍管理系统
vb.net气象信息服务系统
net基于tcp协议的简单即时通信软件
原创vb职员信息管理系统
php小型企业网上订单系统
android人事管理
vb.net汽车销售系统
最新美食网站
最新简化的cpu逻辑功能的仿真实现
vb光盘信息管理系统
深水蓝文学网站
vb列车时刻查询决策系统
vc毕业管理系统
android商品交易系统
delphi列车时刻查询决策系统课程设计
java图书管理系统带
java基于jee的公交查询系统
net《数据库原理及应用技术》课程指导平台的开发
原创net某企业信息管理系统
delphi局域网的语音通信
vc家庭财务管理系统
android人脸识别系统设计.
php软件信息发布系统
社区论坛
net网上办公系统——公文流程管理设计与实现
原创delphi学生档案管理
delphi干部档案管理系统
asp基于bs的人才交流网站
asp.net酒店房间预约系统
java网络流量监控及分析工具
asp在线教学质量评价系统
php网络购物
快速加密解密芯片中kasumi算法的实现
asp.net网络购物系统
最新php科研项目网上申报管理系统
j2ee打字系统
基于ajaxlucene构建搜索引擎的设计和实现
pb超市配送运输管理系统
vf医疗纠纷检索系统
pb图书管理系统(毕业程序翻译%通过)
原创美食网站
vb网络在线考试系统原码
vb.net邮件收发系统的设计
jsp科研处管理信息系统
vcaccti电话语音应答系统
vc用遗传算法解决车辆优化调度问题任务书
delphi多媒体教学控制系统-网络通讯平台的设计
vc试卷生成系统
java气象信息服务系统
asp局域网文件共享及检索系统的设计与开发
php音乐网站
c内存映射文件在进程共享中的应用研究
php基于web的办公自动化管理系统可执行
php基于网络环境的库存管理系统
jsp在线直销商城
vb排课管理系统
最新简易网络存储系统
jsp基于jsp的网上考试系统_
第二代木马的研究与实现
vb.netjpeg编码优化
java基于java的五子棋游戏软件的设计与开发
java绩效评价系统
vc仓库管理系统
j2ee图书馆书库管理系统
php学生成绩查询
java基于windows入侵检测系统的研究与设计——检测模块设计
android象棋程序
vf网吧计费系统
c#smart系统-考试监控及阅卷模块的设计与开发
android某医疗部门总务信息管理系统
vb.net图书馆全开架借阅管理系统
vf电子通讯录(带系统托盘)
android指纹识别系统
android设备保养管理系统
android基于局域网的信息收发系统
android办公用品管理系统
pb企业考勤管理系统
pb药品公司进销售存管理系统
c#光盘管理系统
php服装销售系统
原创asp.net网上选课系统
net仪器设备管理系统设计与实现
j2ee基于特征的入侵检测系统
最新net基于net的公司网站
vb教学设备管理系统
net(java)办公自动化管理系统
c#企业人事管理系统
asp.net校友录server
android邮政编码系统
最新asjavatoc电子商务网站
原创基于icmp模拟网络控制软件的开发——控制管理模块
asp计算机组成原理教学网站
j2ee考试分析评价系统
net基于bs的计算机等级考试系统
端口扫描与检测技术的实现
vb.net题库管理系统
原创php基于php的论坛
文学网站
php网上体育用品商店
asp网上书店
php博客网站
php施甸县旅游咨询网
原创net客户关系管理系统的实现
vf木马检测工具的实现
vb社区人口资源管理系统设计与实现
vbd的网络三维技术
基于net教学辅助系统设计与实现
c局域网即时聊天程序
delphi象棋程序
jsp基于网络超市商品销售管理系统
c#计算机机房管理系统
asp网络教学平台
asp图书馆管理系统
pbsmart系统-公共资源模块的设计与开发--代码
asp助学贷款管理系统
j2ee学生档案管理系统
php网上购物系统答辩
net门诊就诊系统
php某小型数字图书馆
asp.net网上家电销售管理系统
asp.net网上商城系统
net中小企业oa系统
vb.net房屋销售管理信息系统
最新面向internet上的cscw的共享白板
php同学录系统
iptables图形管理工具
asjavatoc电子商务网站
vc考试系统vc
最新asvftoc电子商务网站
实验室计算机的ip地址自动设置程序——客户端
asp.net网络教学评判系统
asp.net基于asp.net的笔记本销售网站
php药品销售数据管理系统
android自动出题题库系统
原创j2ee电脑公司财务管理系统
数据库连接池的研究与实现
jsp课程设计
java上机考试系统
原创基于net教学辅助系统设计与实现
php科研信息管理系统
eims系统-oa子系统的设计与开发
net基于.net的工资绩效管理系统的开发
pb基于工作流引擎的系统框架设计开发
asp.net网上日记本
c#员工管理系统
基于rsa的数字签名
php企业人力资源管理系统的设计
原创asp《信息论与编码》在线考试系统
j2ee扫雷游戏的设计与开发
jsp网上考试系统
vb学生管理系统
c#基于c#的飞行模拟游戏的设计及实现
php求职招聘网站设计
jsp科研处管理信息系统
net基于svg的自动站雨量分析系统
asp.net文章在线发布系统
vb流动资金贷款业务系统
net网络考试系统.net
jsp聊天室
vb.net基于vb.net的两个通用安全模块
net小型证券术语解释及翻译系统的设计与开发
android电脑销售系统
j2ee自动点歌系统
net小型酒店管理系统的设计
vf办公自动化系统
java商业汇票(支票管理)
asp.net课程设计
pb银行设备管理
jsp企业网站设计
网络数据包的协议分析程序的设计开发
java网络多人聊天系统
android停车场管理系统
_基于.net的驾校理论考试模拟系统
jsp基于bs结构的工艺品销售系统的实现
asp.net格式化系统——前台
asp个人网站
c#兼职中介管理系统
jsp基于jsp的人事管理系统
最新基于des加密算法的word加密插件的实现
asp.net网络实验教学网站
asp网络招聘系统
vb.net煤气站管理系统dpac
asp仓储管理系统
android图书销售信息系统
asp.netcd销售管理系统
php学生信息管理系统
android图像处理工具
pb学生办证管理系统
j2ee党员管理系统
asp.net机房自由上机收费管理软件
vf网络计时管理系统
java基于java的五子棋游戏软件的设计与开发
c#中介管理系统
php酒店客房管理系统
c#图书馆管理系统
pb科研项目管理系统
jsp学生管理
jsp学生考试成绩分析(带饼状态图,柱状图)
asp课程设计
asp.netc语言试题生成与考试系统
vb.net教学信息管理系统
vb局域网的数据包监听及数据分析
vb高校题库管理系统附原代码程序万字
php视频点播系统
vb企业档案管理系统简单版
vb学生宿舍管理系统
net房地产管理系统
c#物业管理
vb音像店管理系统
javasmart系统-公共资源模块的设计与开发--代码
java基于ftp协议的文件访问系统
最新基于des加密算法的word加密插件的实现
vf绩效评价系统
asp操作系统课程教学网站
pb旅游资源及线路管理系统
vb.net计科教务管理系统
最新php客户关系管理系统
j2ee病房管理系统
php原创交友网设计
最新net频点播系统
php基于php学生成绩管理系统软件的开发
最新neterp系统(毕业设计
原创vc基于bs方式的即时通讯软件
基于lotus的故障报修系统
vf超市配送运输管理系统
vb.net试卷生成系统
原创文件压缩与解压缩实践
php教师档案管理系统
原创jsp《信息论与编码》在线考试系统
android网络数据包捕获工具
jsp药品销售数据管理系统
asp在线学习系统
j2ee考勤管理系统j2ee
asp网络商城
c局域网即时聊天程序
c#健身中心会员管理系统
vf客房管理信息系统
java基于采集
netxx职业中学图书管理系统的设计
基于caché的实验室资源管理系统的设计
最新基于net教学辅助系统设计与实现
vb.net学生管理系统
c内存映射文件在进程共享中的应用研究
vf中国象棋游戏
vbsmart系统-题库及试卷管理模块的设计与开发
win平台下的pe文件病毒的研究及实现
net基于手机短信平台聊天程序
jsp网上图书销售系统
原创web的入侵防御系统
vc干部档案管理系统
最新web的入侵防御系统
vf基于misty算法的加密软件的实现
vb.net数据结构辅助教学
php个人日志系统
asp.net论坛程序设计(万字功能强大)
asp网页设计辅导系统
最新net动态口令认证的网上选课系统
net基于.net电子相册的开发
j2ee学生信息管理系统万字
pb网上交易系统pb
vf超市进销存管理系统vf报稿
asp留言板
c#模拟atm机系统软件的设计与开发c#
asp交友录
pb车辆

‘伍’ php面试题 memcache和redis的区别

Redis与Memcached的区别传统MySQL+ Memcached架构遇到的问题实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题:1.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间。2.Memcached与MySQL数据库数据一致性问题。3.Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL无法支撑。4.跨机房cache同步问题。众多NoSQL百花齐放,如何选择最近几年,业界不断涌现出很多各种各样的NoSQL产品,那么如何才能正确地使用好这些产品,最大化地发挥其长处,是我们需要深入研究和思考的问题,实际归根结底最重要的是了解这些产品的定位,并且了解到每款产品的tradeoffs,在实际应用中做到扬长避短,总体上这些NoSQL主要用于解决以下几种问题1.少量数据存储,高速读写访问。此类产品通过数据全部in-momery 的方式来保证高速访问,同时提供数据落地的功能,实际这正是Redis最主要的适用场景。2.海量数据存储,分布式系统支持,数据一致性保证,方便的集群节点添加/删除。3.这方面最具代表性的是dynamo和bigtable 2篇论文所阐述的思路。前者是一个完全无中心的设计,节点之间通过gossip方式传递集群信息,数据保证最终一致性,后者是一个中心化的方案设计,通过类似一个分布式锁服务来保证强一致性,数据写入先写内存和redo log,然后定期compat归并到磁盘上,将随机写优化为顺序写,提高写入性能。4.Schema free,auto-sharding等。比如目前常见的一些文档数据库都是支持schema-free的,直接存储json格式数据,并且支持auto-sharding等功能,比如mongodb。面对这些不同类型的NoSQL产品,我们需要根据我们的业务场景选择最合适的产品。Redis适用场景,如何正确的使用前面已经分析过,Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用Memcached,何时使用Redis呢?如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:1 Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。2 Redis支持数据的备份,即master-slave模式的数据备份。3 Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。抛开这些,可以深入到Redis内部构造去观察更加本质的区别,理解Redis的设计。在Redis中,并不是所有的数据都一直存储在内存中的。这是和Memcached相比一个最大的区别。Redis只会缓存所有的 key的信息,如果Redis发现内存的使用量超过了某一个阀值,将触发swap的操作,Redis根据“swappability = age*log(size_in_memory)”计 算出哪些key对应的value需要swap到磁盘。然后再将这些key对应的value持久化到磁盘中,同时在内存中清除。这种特性使得Redis可以 保持超过其机器本身内存大小的数据。当然,机器本身的内存必须要能够保持所有的key,毕竟这些数据是不会进行swap操作的。同时由于Redis将内存 中的数据swap到磁盘中的时候,提供服务的主线程和进行swap操作的子线程会共享这部分内存,所以如果更新需要swap的数据,Redis将阻塞这个 操作,直到子线程完成swap操作后才可以进行修改。使用Redis特有内存模型前后的情况对比:VM off: 300k keys, 4096 bytes values: 1.3G usedVM on: 300k keys, 4096 bytes values: 73M usedVM off: 1 million keys, 256 bytes values: 430.12M usedVM on: 1 million keys, 256 bytes values: 160.09M usedVM on: 1 million keys, values as large as you want, still: 160.09M used当 从Redis中读取数据的时候,如果读取的key对应的value不在内存中,那么Redis就需要从swap文件中加载相应数据,然后再返回给请求方。 这里就存在一个I/O线程池的问题。在默认的情况下,Redis会出现阻塞,即完成所有的swap文件加载后才会相应。这种策略在客户端的数量较小,进行 批量操作的时候比较合适。但是如果将Redis应用在一个大型的网站应用程序中,这显然是无法满足大并发的情况的。所以Redis运行我们设置I/O线程 池的大小,对需要从swap文件中加载相应数据的读取请求进行并发操作,减少阻塞的时间。如果希望在海量数据的环境中使用好Redis,我相信理解Redis的内存设计和阻塞的情况是不可缺少的。补充的知识点:memcached和redis的比较1 网络IO模型Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述字pipe 传递给worker线程,进行读写IO, 网络层使用libevent封装的事件库,多线程模型可以发挥多核作用,但是引入了cache coherency和锁的问题,比如,Memcached最常用的stats 命令,实际Memcached所有操作都要对这个全局变量加锁,进行计数等工作,带来了性能损耗。(Memcached网络IO模型)Redis使用单线程的IO复用模型,自己封装了一个简单的AeEvent事件处理框架,主要实现了epoll、kqueue和select,对于单纯只有IO操作来说,单线程可以将速度优势发挥到最大,但是Redis也提供了一些简单的计算功能,比如排序、聚合等,对于这些操作,单线程模型实际会严重影响整体吞吐量,CPU计算过程中,整个IO调度都是被阻塞住的。2.内存管理方面Memcached使用预分配的内存池的方式,使用slab和大小不同的chunk来管理内存,Item根据大小选择合适的chunk存储,内存池的方式可以省去申请/释放内存的开销,并且能减小内存碎片产生,但这种方式也会带来一定程度上的空间浪费,并且在内存仍然有很大空间时,新的数据也可能会被剔除,原因可以参考Timyang的文章:/memcached/)。Memcached的客户端软件实现非常多,包括C/C++, PHP, Java, python, Ruby, Perl, Erlang, Lua等。当前Memcached使用广泛,除了LiveJournal以外还有Wikipedia、Flickr、Twitter、Youtube和WordPress等。在Window系统下,Memcached的安装非常方便,只需从以上给出的地址下载可执行软件然后运行memcached.exe –d install即可完成安装。在Linux等系统下,我们首先需要安装libevent,然后从获取源码,make && make install即可。默认情况下,Memcached的服务器启动程序会安装到/usr/local/bin目录下。在启动Memcached时,我们可以为其配置不同的启动参数。1.1 Memcache配置Memcached服务器在启动时需要对关键的参数进行配置,下面我们就看一看Memcached在启动时需要设定哪些关键参数以及这些参数的作用。1)-p Memcached的TCP监听端口,缺省配置为11211;2)-U Memcached的UDP监听端口,缺省配置为11211,为0时表示关闭UDP监听;3)-s Memcached监听的UNIX套接字路径;4)-a 访问UNIX套接字的八进制掩码,缺省配置为0700;5)-l 监听的服务器IP地址,默认为所有网卡;6)-d 为Memcached服务器启动守护进程;7)-r 最大core文件大小;8)-u 运行Memcached的用户,如果当前为root的话需要使用此参数指定用户;9)-m 分配给Memcached使用的内存数量,单位是MB;10)-M 指示Memcached在内存用光的时候返回错误而不是使用LRU算法移除数据记录;11)-c 最大并发连数,缺省配置为1024;12)-v –vv –vvv 设定服务器端打印的消息的详细程度,其中-v仅打印错误和警告信息,-vv在-v的基础上还会打印客户端的命令和相应,-vvv在-vv的基础上还会打印内存状态转换信息;13)-f 用于设置chunk大小的递增因子;14)-n 最小的chunk大小,缺省配置为48个字节;15)-t Memcached服务器使用的线程数,缺省配置为4个;16)-L 尝试使用大内存页;17)-R 每个事件的最大请求数,缺省配置为20个;18)-C 禁用CAS,CAS模式会带来8个字节的冗余;2. Redis简介Redis是一个开源的key-value存储系统。与Memcached类似,Redis将大部分数据存储在内存中,支持的数据类型包括:字符串、哈希表、链表、集合、有序集合以及基于这些数据类型的相关操作。Redis使用C语言开发,在大多数像Linux、BSD和Solaris等POSIX系统上无需任何外部依赖就可以使用。Redis支持的客户端语言也非常丰富,常用的计算机语言如C、C#、C++、Object-C、PHP、Python、Java、Perl、Lua、Erlang等均有可用的客户端来访问Redis服务器。当前Redis的应用已经非常广泛,国内像新浪、淘宝,国外像Flickr、Github等均在使用Redis的缓存服务。Redis的安装非常方便,只需从bin目录下。在启动Redis服务器时,我们需要为其指定一个配置文件,缺省情况下配置文件在Redis的源码目录下,文件名为redis.conf。php面试题 memcache和redis的区别

‘陆’ PHP如何做分布式锁

PHP其实没有这个需求,所以答案是,不能。 PHP作为一个模板语言,首要任务是输出HTML以及处理一些web方面的工作。 如果你的本意是想用脚本语言来做分布式运算,你可以试试erlang,这门语言专门为这个领域做了大量优化。

‘柒’ 分布式系统为什么要同步,同步所需要的构件有哪些

在Zookeeper的官 网上有这么一句话:ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. 这大概描述了Zookeeper主要可以干哪些事情:配置管理,名字服务,提供分布式同步以及集群管理。那这些服务又到底是什么呢?我们为什么需要这样的服务?我们又为什么要使用Zookeeper来实现呢,使用Zookeeper有什么优势?接下来我会挨个介绍这些到底是什么,以及有哪些开源系统中使用了。 配置管理 在我们的应用中除了代码外,还有一些就是各种配置。比如数据库连接等。一般我们都是使用配置文件的方式,在代码中引入这些配置文件。但是当我们只有一种配置,只有一台服务器,并且不经常修改的时候,使用配置文件是一个很好的做法,但是如果我们配置非常多,有很多服务器都需要这个配置,而且还可能是动态的话使用配置文件就不是个好主意了。这个时候往往需要寻找一种集中管理配置的方法,我们在这个集中的地方修改了配置,所有对这个配置感兴趣的都可以获得变更。比如我们可以把配置放在数据库里,然后所有需要配置的服务都去这个数据库读取配置。但是,因为很多服务的正常运行都非常依赖这个配置,所以需要这个集中提供配置服务的服务具备很高的可靠性。一般我们可以用一个集群来提供这个配置服务,但是用集群提升可靠性,那如何保证配置在集群中的一致性呢? 这个时候就需要使用一种实现了一致性协议的服务了。Zookeeper就是这种服务,它使用Zab这种一致性协议来提供一致性。现在有很多开源项目使用Zookeeper来维护配置,比如在HBase中,客户端就是连接一个Zookeeper,获得必要的HBase集群的配置信息,然后才可以进一步操作。还有在开源的消息队列Kafka中,也使用Zookeeper来维护broker的信息。在Alibaba开源的SOA框架Dubbo中也广泛的使用Zookeeper管理一些配置来实现服务治理。 名字服务 名字服务这个就很好理解了。比如为了通过网络访问一个系统,我们得知道对方的IP地址,但是IP地址对人非常不友好,这个时候我们就需要使用域名来访问。但是计算机是不能是别域名的。怎么办呢?如果我们每台机器里都备有一份域名到IP地址的映射,这个倒是能解决一部分问题,但是如果域名对应的IP发生变化了又该怎么办呢?于是我们有了DNS这个东西。我们只需要访问一个大家熟知的(known)的点,它就会告诉你这个域名对应的IP是什么。在我们的应用中也会存在很多这类问题,特别是在我们的服务特别多的时候,如果我们在本地保存服务的地址的时候将非常不方便,但是如果我们只需要访问一个大家都熟知的访问点,这里提供统一的入口,那么维护起来将方便得多了。 分布式锁 其实在第一篇文章中已经介绍了Zookeeper是一个分布式协调服务。这样我们就可以利用Zookeeper来协调多个分布式进程之间的活动。比如在一个分布式环境中,为了提高可靠性,我们的集群的每台服务器上都部署着同样的服务。但是,一件事情如果集群中的每个服务器都进行的话,那相互之间就要协调,编程起来将非常复杂。而如果我们只让一个服务进行操作,那又存在单点。通常还有一种做法就是使用分布式锁,在某个时刻只让一个服务去干活,当这台服务出问题的时候锁释放,立即fail over到另外的服务。这在很多分布式系统中都是这么做,这种设计有一个更好听的名字叫Leader Election(leader选举)。比如HBase的Master就是采用这种机制。但要注意的是分布式锁跟同一个进程的锁还是有区别的,所以使用的时候要比同一个进程里的锁更谨慎的使用。 集群管理 在分布式的集群中,经常会由于各种原因,比如硬件故障,软件故障,网络问题,有些节点会进进出出。有新的节点加入进来,也有老的节点退出集群。这个时候,集群中其他机器需要感知到这种变化,然后根据这种变化做出对应的决策。比如我们是一个分布式存储系统,有一个中央控制节点负责存储的分配,当有新的存储进来的时候我们要根据现在集群目前的状态来分配存储节点。这个时候我们就需要动态感知到集群目前的状态。还有,比如一个分布式的SOA架构中,服务是一个集群提供的,当消费者访问某个服务时,就需要采用某种机制发现现在有哪些节点可以提供该服务(这也称之为服务发现,比如Alibaba开源的SOA框架Dubbo就采用了Zookeeper作为服务发现的底层机制)。还有开源的Kafka队列就采用了Zookeeper作为Cosnumer的上下线管理。 后记 在这篇文章中,列出了一些Zookeeper可以提供的服务,并给出了一些开源系统里面的实例。后面我们从Zookeeper的安装配置开始,并用示例进一步介绍Zookeeper如何使用。 (转载)

‘捌’ php面试题 memcache和redis的区别

Redis与Memcached的区别

传统MySQL+ Memcached架构遇到的问题

实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题:

1.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间。

2.Memcached与MySQL数据库数据一致性问题。

3.Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL无法支撑。

4.跨机房cache同步问题。

众多NoSQL百花齐放,如何选择

最近几年,业界不断涌现出很多各种各样的NoSQL产品,那么如何才能正确地使用好这些产品,最大化地发挥其长处,是我们需要深入研究和思考的
问题,实际归根结底最重要的是了解这些产品的定位,并且了解到每款产品的tradeoffs,在实际应用中做到扬长避短,总体上这些NoSQL主要用于解
决以下几种问题

1.少量数据存储,高速读写访问。此类产品通过数据全部in-momery 的方式来保证高速访问,同时提供数据落地的功能,实际这正是Redis最主要的适用场景。

2.海量数据存储,分布式系统支持,数据一致性保证,方便的集群节点添加/删除。

3.这方面最具代表性的是dynamo和bigtable 2篇论文所阐述的思路。前者是一个完全无中心的设计,节点之间通过gossip方式传递集群信息,数据保证最终一致性,后者是一个中心化的方案设计,通过类似一个分布式锁服务来保证强一致性,数据写入先写内存和redo log,然后定期compat归并到磁盘上,将随机写优化为顺序写,提高写入性能。

4.Schema free,auto-sharding等。比如目前常见的一些文档数据库都是支持schema-free的,直接存储json格式数据,并且支持auto-sharding等功能,比如mongodb。

面对这些不同类型的NoSQL产品,我们需要根据我们的业务场景选择最合适的产品。

Redis适用场景,如何正确的使用

前面已经分析过,Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-
backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用
Memcached,何时使用Redis呢?

如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:

1 Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

2 Redis支持数据的备份,即master-slave模式的数据备份。

3 Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

抛开这些,可以深入到Redis内部构造去观察更加本质的区别,理解Redis的设计。


Redis中,并不是所有的数据都一直存储在内存中的。这是和Memcached相比一个最大的区别。Redis只会缓存所有的
key的信息,如果Redis发现内存的使用量超过了某一个阀值,将触发swap的操作,Redis根据“swappability =
age*log(size_in_memory)”计
算出哪些key对应的value需要swap到磁盘。然后再将这些key对应的value持久化到磁盘中,同时在内存中清除。这种特性使得Redis可以

保持超过其机器本身内存大小的数据。当然,机器本身的内存必须要能够保持所有的key,毕竟这些数据是不会进行swap操作的。同时由于Redis将内存

中的数据swap到磁盘中的时候,提供服务的主线程和进行swap操作的子线程会共享这部分内存,所以如果更新需要swap的数据,Redis将阻塞这个
操作,直到子线程完成swap操作后才可以进行修改。

使用Redis特有内存模型前后的情况对比:
VM off: 300k keys, 4096 bytes values: 1.3G used
VM on: 300k keys, 4096 bytes values: 73M used
VM off: 1 million keys, 256 bytes values: 430.12M used
VM on: 1 million keys, 256 bytes values: 160.09M used
VM on: 1 million keys, values as large as you want, still: 160.09M used



从Redis中读取数据的时候,如果读取的key对应的value不在内存中,那么Redis就需要从swap文件中加载相应数据,然后再返回给请求方。

这里就存在一个I/O线程池的问题。在默认的情况下,Redis会出现阻塞,即完成所有的swap文件加载后才会相应。这种策略在客户端的数量较小,进行

批量操作的时候比较合适。但是如果将Redis应用在一个大型的网站应用程序中,这显然是无法满足大并发的情况的。所以Redis运行我们设置I/O线程
池的大小,对需要从swap文件中加载相应数据的读取请求进行并发操作,减少阻塞的时间。

如果希望在海量数据的环境中使用好Redis,我相信理解Redis的内存设计和阻塞的情况是不可缺少的。

补充的知识点:

memcached和redis的比较

1 网络IO模型

Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述
字pipe 传递给worker线程,进行读写IO, 网络层使用libevent封装的事件库,多线程模型可以发挥多核作用,但是引入了cache
coherency和锁的问题,比如,Memcached最常用的stats
命令,实际Memcached所有操作都要对这个全局变量加锁,进行计数等工作,带来了性能损耗。

(Memcached网络IO模型)

Redis使用单线程的IO复用模型,自己封装了一个简单的AeEvent事件处理框架,主要实现了epoll、kqueue和select,
对于单纯只有IO操作来说,单线程可以将速度优势发挥到最大,但是Redis也提供了一些简单的计算功能,比如排序、聚合等,对于这些操作,单线程模型实
际会严重影响整体吞吐量,CPU计算过程中,整个IO调度都是被阻塞住的。

2.内存管理方面

Memcached使用预分配的内存池的方式,使用slab和大小不同的chunk来管理内存,Item根据大小选择合适的chunk存储,内
存池的方式可以省去申请/释放内存的开销,并且能减小内存碎片产生,但这种方式也会带来一定程度上的空间浪费,并且在内存仍然有很大空间时,新的数据也可
能会被剔除,原因可以参考Timyang的文章:http://timyang.net/data/Memcached-lru-evictions/

Redis使用现场申请内存的方式来存储数据,并且很少使用free-list等方式来优化内存分配,会在一定程度上存在内存碎片,Redis
跟据存储命令参数,会把带过期时间的数据单独存放在一起,并把它们称为临时数据,非临时数据是永远不会被剔除的,即便物理内存不够,导致swap也不会剔
除任何非临时数据(但会尝试剔除部分临时数据),这点上Redis更适合作为存储而不是cache。

3.数据一致性问题

Memcached提供了cas命令,可以保证多个并发访问操作同一份数据的一致性问题。 Redis没有提供cas 命令,并不能保证这点,不过Redis提供了事务的功能,可以保证一串 命令的原子性,中间不会被任何操作打断。

4.存储方式及其它方面

Memcached基本只支持简单的key-value存储,不支持枚举,不支持持久化和复制等功能

Redis除key/value之外,还支持list,set,sorted set,hash等众多数据结构,提供了KEYS

进行枚举操作,但不能在线上使用,如果需要枚举线上数据,Redis提供了工具可以直接扫描其mp文件,枚举出所有数据,Redis还同时提供了持久化和复制等功能。

5.关于不同语言的客户端支持

在不同语言的客户端方面,Memcached和Redis都有丰富的第三方客户端可供选择,不过因为Memcached发展的时间更久一些,目
前看在客户端支持方面,Memcached的很多客户端更加成熟稳定,而Redis由于其协议本身就比Memcached复杂,加上作者不断增加新的功能
等,对应第三方客户端跟进速度可能会赶不上,有时可能需要自己在第三方客户端基础上做些修改才能更好的使用。

根据以上比较不难看出,当我们不希望数据被踢出,或者需要除key/value之外的更多数据类型时,或者需要落地功能时,使用Redis比使用Memcached更合适。

关于Redis的一些周边功能

Redis除了作为存储之外还提供了一些其它方面的功能,比如聚合计算、pubsub、scripting等,对于此类功能需要了解其实现原
理,清楚地了解到它的局限性后,才能正确的使用,比如pubsub功能,这个实际是没有任何持久化支持的,消费方连接闪断或重连之间过来的消息是会全部丢
失的,又比如聚合计算和scripting等功能受Redis单线程模型所限,是不可能达到很高的吞吐量的,需要谨慎使用。

总的来说Redis作者是一位非常勤奋的开发者,可以经常看到作者在尝试着各种不同的新鲜想法和思路,针对这些方面的功能就要求我们需要深入了解后再使用。

总结:

1.Redis使用最佳方式是全部数据in-memory。

2.Redis更多场景是作为Memcached的替代者来使用。

3.当需要除key/value之外的更多数据类型支持时,使用Redis更合适。

4.当存储的数据不能被剔除时,使用Redis更合适。

谈谈Memcached与Redis(一)

1. Memcached简介

Memcached是以LiveJurnal旗下Danga Interactive公司的Bard
Fitzpatric为首开发的高性能分布式内存缓存服务器。其本质上就是一个内存key-value数据库,但是不支持数据的持久化,服务器关闭之后数
据全部丢失。Memcached使用C语言开发,在大多数像Linux、BSD和Solaris等POSIX系统上,只要安装了libevent即可使
用。在Windows下,它也有一个可用的非官方版本(http://code.jellycan.com/memcached/)。Memcached
的客户端软件实现非常多,包括C/C++, PHP, Java, Python, Ruby, Perl, Erlang,
Lua等。当前Memcached使用广泛,除了LiveJournal以外还有Wikipedia、Flickr、Twitter、Youtube和
WordPress等。

在Window系统下,Memcached的安装非常方便,只需从以上给出的地址下载可执行软件然后运行memcached.exe –d
install即可完成安装。在Linux等系统下,我们首先需要安装libevent,然后从获取源码,make && make
install即可。默认情况下,Memcached的服务器启动程序会安装到/usr/local/bin目录下。在启动Memcached时,我们可
以为其配置不同的启动参数。

1.1 Memcache配置

Memcached服务器在启动时需要对关键的参数进行配置,下面我们就看一看Memcached在启动时需要设定哪些关键参数以及这些参数的作用。

1)-p <num> Memcached的TCP监听端口,缺省配置为11211;

2)-U <num> Memcached的UDP监听端口,缺省配置为11211,为0时表示关闭UDP监听;

3)-s <file> Memcached监听的UNIX套接字路径;

4)-a <mask> 访问UNIX套接字的八进制掩码,缺省配置为0700;

5)-l <addr> 监听的服务器IP地址,默认为所有网卡;

6)-d 为Memcached服务器启动守护进程;

7)-r 最大core文件大小;

8)-u <username> 运行Memcached的用户,如果当前为root的话需要使用此参数指定用户;

9)-m <num> 分配给Memcached使用的内存数量,单位是MB;

10)-M 指示Memcached在内存用光的时候返回错误而不是使用LRU算法移除数据记录;

11)-c <num> 最大并发连数,缺省配置为1024;

12)-v –vv –vvv 设定服务器端打印的消息的详细程度,其中-v仅打印错误和警告信息,-vv在-v的基础上还会打印客户端的命令和相应,-vvv在-vv的基础上还会打印内存状态转换信息;

13)-f <factor> 用于设置chunk大小的递增因子;

14)-n <bytes> 最小的chunk大小,缺省配置为48个字节;

15)-t <num> Memcached服务器使用的线程数,缺省配置为4个;

16)-L 尝试使用大内存页;

17)-R 每个事件的最大请求数,缺省配置为20个;

18)-C 禁用CAS,CAS模式会带来8个字节的冗余;

2. Redis简介

Redis是一个开源的key-value存储系统。与Memcached类似,Redis将大部分数据存储在内存中,支持的数据类型包括:字
符串、哈希表、链表、集合、有序集合以及基于这些数据类型的相关操作。Redis使用C语言开发,在大多数像Linux、BSD和Solaris等
POSIX系统上无需任何外部依赖就可以使用。Redis支持的客户端语言也非常丰富,常用的计算机语言如C、C#、C++、Object-C、PHP、
Python、Java、Perl、Lua、Erlang等均有可用的客户端来访问Redis服务器。当前Redis的应用已经非常广泛,国内像新浪、淘
宝,国外像Flickr、Github等均在使用Redis的缓存服务。

Redis的安装非常方便,只需从http://redis.io/download获取源码,然后make && make

install即可。默认情况下,Redis的服务器启动程序和客户端程序会安装到/usr/local/bin目录下。在启动Redis服务器时,我们
需要为其指定一个配置文件,缺省情况下配置文件在Redis的源码目录下,文件名为redis.conf。

‘玖’ 分布式锁用zookeeper还是redis好

1. 不能重入

2. 没有本地锁,并发性能会比较差,不使用用在并发争锁较多的场景下。本地锁非自旋
3. 未考虑锁等待排序. 这个是redis很难实现的.

可以通过redis的list实现,但缺点是list下每个子节点无超时时间. redis也无法进行模糊查询 key*.
故还是通过zookeeper实现比较好. 但zookeeper 会遇到性能瓶颈,我们线下的就出现了,经常注册不上的情况.
zookeeper原理是临时节点

‘拾’ 零基础应该选择学习 java、php、前端 还是 python

这三门当中,首推Java。真的,Python当然是好,但是对于一个新入门的人,最重要的是先找到工作不是吗?而找工作的话,Java无疑是最容易的。相比较PHP与Python而言,Java程序员的岗位需求要大的很多,对于跨行业的人而言,最困难的其实是第一步,那就是如何进入这个行业。如果你连进都进不来,第一份工作迟迟无法开始,那么好好努力,补上数据结构,设计模式,算法设计这些差距就根本无从说起,不是吗?
接着,我来谈谈具体的规划。
1.
了解Java的运行环境。搞清楚path和classpath是干什么的,怎么在命令行进行编译,执行。知道IDE的各个按钮后面真正发生了什么事情。
2.
掌握Java的语法。搞清楚包,接口,类,继承这些基本概念。掌握多态,overwrite,死背下IO的接口,包括InputStream/OutputStream和Writer/Reader,死背下网络编程和GUI编程的接口,背JDBC接口。这一步,推荐的书是《
疯狂Java讲义》。
3.
掌握多线程编程。弄明白ConcurrencyHashMap是怎么实现的,搞清楚synchronized是怎么回事,弄明白为什么要有Runnable接口。
在第二步和第三步掌握到80%的时候,你就可以考虑找工作了。
4. 在工作中体会一下设计模式。推荐《轻量级Java
EE企业应用实战》这本书。看完里面的Decorator,IO接口你再也不会去死记硬背了。用的时候,根据Adaptor和Decorator的命名规则,自己临时推都推得出来。
5. 恶补数据结构。 搞清楚 LinkedList和
ArrayList的实现机制,了解它们的每一个接口的时间复杂度。同样的还有其他容器,Map啊,Set啊,都是一样的。栈,队列,二叉树,图贯穿编程始终,如果这一步你迈不过去,那就只能在低阶程序员里打转。
6.
如果有可能,最好对一些算法设计也有所涉猎。比如动态规则的思路,贪心算法,诸如KMP这种奇妙的算法等。这一步没有数据结构那么重要,学得好当然好,学不好也不用太挫败。
到了这一步,你和科班程序员之间的差距就不大了。可以在工作中独立承担开发任务了。
疯狂软件教育中心专注于Java培训,疯狂软件Java培训可以有效的帮助你提升相关技能。名师讲解Java设计和编程、Web前端开发、JavaEE进阶、大数据核心知识等,让你在5个半月内快速获得理论和实践的双重提升。
7.
进阶,这时候就可以有自己的思考了。Java发展到现在,被用在各种各样的情景之中,说它是应用最广泛的编程语言并不过分。你在打好基础以后,就可以考虑应该向哪个方向发展了。比如服务端的架构,最好能学习一下JavaEE。JEE一直以来,都是让人觉得门槛太高。这个其实可以从Spring入手,搞清楚反射,控制反转,依赖注射都是什么鬼(这些神叨叨的名词其实都是为了解决Java本身不够动态这个缺陷而出现的,这里不展开,我只想提醒的是,这些概念没有什么大不了的东西,不要被爱装逼的家伙吓住了)。还有消息这个东西,还有ORM这个东西,都去搞搞清楚。想一下它们要解决什么问题,再猜一下他们是怎么实现的。我面试的时候发现,其实大多数优秀的开发者,即使以前没思考过这个问题,让他现场设计一下Hibernate,都能设计得差不多。这说明,这些框架性的东没有什么大不了的。有了基础,你也能设计出来。关键是要去动脑筋想。以上是以服务端开发举例,那么对于客户端,你就去思考事件响应机制是如何工作的(这个我不熟悉,就不再多说了)。还可以深入研究一下JVM的源代码,以及其实现机制,了解一下垃圾回收算法等等。
到了这一步,你就可以应聘Java高级开发了。如果运气好,年薪30万是有可能的。保底也要20万了。
8.
架构。到了这一步,你就算是登堂入室,真正迈入高级开发人员了。这一步,你要思考更多的东西,比如,如何处理高并发,如何应对分布式系统,如何提供更健壮的数据服务。到了这一步,那就没有什么可以参考的,现成的东西了。全靠自己的悟性了。那最后能达到什么高度,就不是我这个层次能点评的了。
编程的世界永远向所有热爱编程的人开放,这是一个自由,平等,共享的世界,我始终是这样坚信的。

阅读全文

与php分布式锁相关的资料

热点内容
陆上赛艇app怎么报名 浏览:110
app内页面的网址怎么提取 浏览:286
安卓升级包pkg文件如何打开 浏览:77
id3算法原理 浏览:602
骑手通app怎么输入不了保单号 浏览:988
82一56的筒便算法 浏览:404
数控机床fanuc编程 浏览:607
天刀mode不是内部或外部命令 浏览:854
长城c30压缩机价格 浏览:1000
java打开图片文件 浏览:409
跟程序员聊天聊到半夜 浏览:411
自己怎么做app代码 浏览:915
win7旗舰版进不去带命令符 浏览:799
单片机温度检测电路 浏览:802
拼图软件不压缩 浏览:656
红袖添香小说源码 浏览:624
erp加密工具在哪里买 浏览:516
怎么给qq群里的文件加密 浏览:762
androidsetbitmap 浏览:598
mt4反向编译 浏览:201