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]);