mongodb复本集配置

副本集具有故 障自动切换和自动修复成员节点,各个DB之间数据完全一
致等特点。与主从复制相比,最为显著的区别在于,副本集没有固定的主节点,它是 整个集群选举出得一个主节点,当其不工作时变更其他节点

部署Replica Sets

正常情况下,mongodb是应该部署在多台服务器上的,我这里只是测试,就部署一台服务器上了,下面启动了三个实例进行实验

– 阅读剩余部分 –

mongodb主从复制配置

MongoDB 支持在多个机器中通过异步复制达到故障转
移和实现冗余。多机器中同一时刻只有一台是用于写操作。
正是由于这个情况,为 MongoDB 提供了数据一致性的保
障。

MongoDB 的主从集群分为两种:
Master-Slave 复制 (主从)
Replica Sets 复制 (副本集)

– 阅读剩余部分 –

redis实现访问频率限制

使用redis实现访问频率限制,如每IP每分钟请求不能超过20次。

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', '6379');

$conf['count'] = 10;
$conf['time_range'] = 60;
$ip = "acl:127.0.0.1";

function aclByIp($key, $conf) {
    global $redis;
    extract($conf);
    $now = time();
    $listLength = $redis->lLen($key);

    if ($listLength < $count){
        $redis->lPush($key, $now);
        $flag = true;
    } else {
        $first_time = $redis->lIndex($key, -1);
        $last_time = $redis->lIndex($key, 0);
        if($now - $first_time < 60){
            echo "ERROR:访问频率超过限制\n";
            echo "你的动作确实快了点,请耐心等待".($time_range-($now-$last_time))."秒后再试。\n";
            $flag = false;
        }else{
            $redis->lPush($key,$now);
            $redis->lTrim($key,0,$count-1);
            $flag = true;
        }
    }
    return $flag;
}

if (aclByIp($ip, $conf)) {
    echo "OK. \n";
} else {

}
echo "<pre>";
print_r($redis->lRange($ip, 0, -1));

memcache实现访问频率限制

使用memcache实现访问频率限制,如每IP每分钟请求不能超过20次。

<?php
$limit = 20;
$seconds = 60;
$block_for_seconds = 300;//超过限制等待时间
$status = 'OK';

$memcache = new Memcache;
$memcache->connect('localhost', 11211);
$ip = $_SERVER['REMOTE_ADDR'];
$r = $memcache->get($ip, array('c', 't')); 
$c = 1; // 访问次数
$init_time = time();

if ($r) {
    $s = $r[3]; // status
    $c = $r[0] + 1;
    $init_time = $r[1];
    if ($s == 'TOO_MANY_REQUESTS') {
        $d = time() - $r[1]; // time since block
        if ($block_for_seconds - $d > 0) { // still blocked
            die('Flood detected!! You are going to wait ' . ($block_for_seconds - $d) . ' and try again.');
        } else { // block is over
            $status = 'OK';
            $init_time = time();
            $c = 0;
        }
    }
    $new_time = time();
    if ($c > $limit) { // check if happened within a minute
        $time_elapsed = $new_time - $init_time;
        if ($time_elapsed < $seconds) {
            $status = 'TOO_MANY_REQUESTS';
        }
        print "time elapsed: $time_elapsed, count:$c";
        $c = 0;
        $init_time = time();
    }
}

$memcache->set($ip, array(
    $c,
    $init_time,
    $new_time,
    $status
));