redis常用操作+分布式锁+monitor操作监控日志

1、分布式锁

项目:laravel + predis

// 获取key值
public static function getCount($name, $timeout = 2, $lockSecond = 2, $sleep = 100000)
{
		$config  = config('database.redis.default');
        $env     = env('APP_ENV', 'product');
        $key     = $config['prefix'] . ':' . $env . ':' . $name;
        $lockKey = $config['prefix'] . ':' . $env . ':' . 'lock_key:' . $name;
        $client  = new Client($config);

        $start = self::getMicroTime();
        $valid = false;

        // 分布式锁
        while (self::getMicroTime() < $start + $timeout * 1000000) {

            if ($valid = $client->set($lockKey, 1, 'EX', $lockSecond, 'NX')) {

                $index = $client->get($key);
                if (!$index) {
                    $client->set($key, 2);
                    $index = 1;
                } else {
                    $client->set($key,$index + 1);
                }

                // 删除分布式锁
                $client->del($lockKey);
                common::log('index_counter',$name.'_index1',['index'=>$index]);
                break;
            }
            usleep($sleep);
        }

        return $valid ? $index : 0;
}		

protected static function getMicroTime()
{
   return bcmul(microtime(true), 1000000);
}

2、redis monitor生成监控日志

redis-cli -a password monitor | grep --line-buffer 'key【被监控的key】' | egrep --line-buffer --color=auto 'SET|DEL【被监控的行为】' > /my/log/path/monitor.log 

3、pipeline管道操作

基于laravel +predis

$config = config('database.redis.default');
$redis = new Client($config);

 $pipeline = $redis->pipeline(['atomic'=>1]); // 原子操作,内部实现了事务
 $pipeline->set('name','zhangsan','EX',1,'NX');
 $pipeline->set('age',18,'EX',1,'NX');
 $pipeline->exec();
 $name = $redis->get('name');

4、transaction事务

基于laravel +predis

// 事务,如果事务执行出现并发,可能会失败
$config = config('database.redis.default');
$redis = new Client($config);

 $transaction = $redis->transaction(); // 事务
$transaction->set('age',16);
 $result = $transaction->exec();
 echo $redis->get('age');


 // watch如果失败,则循环执行,保证事务100%成功
$config = config('database.redis.default');
 $redis = new Client($config);
 $redis->watch('name'); // 监听name

 do{
     $transaction = $redis->transaction(); // 事务
     $transaction->set('age',16);
     $result = $transaction->exec();

     echo $redis->get('age');
 }while(!$result[0]);
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值