在laravel中使用redis的分布式锁
例一
代码语言:javascript
复制<?php
$lockKey = 'lockKey';
$redis = IlluminateSupportFacadesRedis::connection();
$redis->setnx($lockKey, 1);
$redis->expire($lockKey, 10);
?>
这样有一个问题,setNX设置过期时间并不是原子的操作,如果在设置执行完 $redis->setnx($lockKey, 1);时服务器宕机了,这时候未设置成功过期时间,则其他用户获取不到锁
例二
代码语言:javascript
复制<?php
$lockKey = 'lockKey';
$redis = IlluminateSupportFacadesRedis::connection();
$lock = $redis->set($lockKey, 1, 'ex', 10,'nx');
?>
例二相对于例一而言,实现了原子操作设置过期时间(从2.6.12版本开始才有的
)
下面我重点说一下laravel中set命令的几个参数含义,在网上未曾找到详细的解释,特此记录下来。
代码语言:javascript
复制//参数一: $key 缓存键
//参数二: $value 缓存值
//参数三: $expireResolution EX/PX
// EX 设置键key的过期时间,单位时秒(seconds)
// PX 设置键key的过期时间,单位时毫秒(milliseconds)
// 参数四: $expireTTL 缓存键过期时间,单位由参数三决定
// 参数五: $flag NX/XX
// NX 只有键key不存在的时候才会设置key的值
// XX 只有键key存在的时候才会设置key的值
set($key, $value, $expireResolution = null, $expireTTL = null, $flag = null)
在Laravel中框架查询运行的 SQL 语句
方法一:
代码语言:javascript
复制 DB::connection()->enableQueryLog(); // 开启查询日志
......
dd(DB::getQueryLog());
方法二:
代码语言:javascript
复制 composer require guanguans/laravel-dump-sql -v
php artisan vendor:publish --provider="Guanguans\LaravelDumpSql\ServiceProvider"
代码语言:javascript
复制 // Get sql statement.
User::where('id', 1)->toRawSql();
DB::table('user')->where('id', 1)->toRawSql();
// Print SQL statements.
User::where('id', 1)->dumpSql();
DB::table('user')->where('id', 1)->dumpSql();
// Print SQL statements and exit.
User::where('id', 1)->ddSql();
DB::table('user')->where('id', 1)->ddSql();
使用2
- 生成config/dumpsql.php文件
- 自定义别名
代码语言:javascript
复制php artisan vendor:publish --tag="laravel-dump-sql"
代码语言:javascript
复制return [
/*
* Get sql statement.
*/
'to_raw_sql' => 'Your favorite method name',
/*
* Print SQL statements.
*/
'dump_sql' => 'Your favorite method name',
/*
* Print SQL statements and exit.
*/
'dd_sql' => 'Your favorite method name',
];
方法三: