一、持久化
在首先保证数据正确的前提下加快数据操作的执行速度
将内存数据存储到硬盘一个主要原因是为了在之后重用数据,或为了防止系统故障而将数据备份到一个远程位置
1)快照 (将存于某一时刻的所有数据都写入硬盘)
2)AOF (append-only file 只追加文件)
执行写命令时,将被执行的写命令复制到硬盘里
即使一个命令只需要花费10ms完成,单个redis实例1s也只能处理100个命令
二、复制
在需要扩展读请求或需写入临时数据的时候,可设置额外的redis从服务器来保存数据集的副本。在接收到主服务器发送的数据初始副本后,客户端每次向主服务器进行写入,从服务器都会实时得到更新。部署好主从服务器后,客户端就可向任意一个从服务器发送请求,而不必总把每个读请求都发送给主服务器,从而将负载平均分配到各从服务器
三、redis事务
实例 游戏中商品买卖市场
Frank有43金币,打算卖掉自己包裹里其中一件商品
1)用一个hash记录用户信息(用户姓名、金币数量)使用一个集合记录用户包裹,记录包裹里每件商品唯一编号
一个用户可将自己商品按给定价格放到市场进行销售,当另一个用户购买这个商品,卖家就会收到钱。
将商品ID和卖家ID存储到市场有序集合里,而商品的售价用作成员的分值
2)开始将商品放到市场进行销售
/**
* 记录用户信息 姓名 金币数
*/
public function setInfo($id, $info)
{
$this->conn->hSet('users:'.$id,'name',$info['name']);
$this->conn->hSet('users:'.$id,'money',$info['money']);
}
/**
* 记录用户包裹信息
*/
public function setBundle($id, $option)
{
$this->conn->sAdd('inventory:'.$id,$option);
}
/**
* 将商品加入购物市场进行出售
*/
public function joinMarket($id, $item, $price)
{
//检测包裹里是否有该商品
$res = $this->conn->sIsMember('inventory:'.$id,$item);
if($res){
//将商品加入市场有序集合,删除用户包裹记录
$this->rcon->multi()->zAdd('market:',$price,$item)
->sRem('inventory:'.$id,$item)
->exec();
return true;
}
return false;
}
/**
* 购买商品
*/
public function buy($buyid,$sellerid,$item,$price)
{
//购买某一商品时首先检测购买人金币是否足够
$res = $this->conn->hGet('users:'.$buyid,'money');
if($res>=$price){
//将该商品加入买家包裹 删除市场集合里商品信息 买家金币减少 卖家金币增加
$this->rcon->multi()->sAdd('inventory:'.$buyid,$item)
->zRem('market:',$item)
->hIncrBy('users:'.$sellerid,'money',$price)
->hIncrBy('users:'.$buyid,'money',-$price)
->exec();
return true;
}
return false;
}