在laravel中使用redis的分布式锁

例一

<?php $lockKey = 'lockKey'; $redis = Illuminate\Support\Facades\Redis::connection(); $redis->setnx($lockKey, 1); $redis->expire($lockKey, 10); ?>
这样有一个问题,setNX设置过期时间并不是原子的操作,如果在设置执行完 $redis->setnx($lockKey, 1);时服务器宕机了,这时候未设置成功过期时间,则其他用户获取不到锁

例二

<?php $lockKey = 'lockKey'; $redis = Illuminate\Support\Facades\Redis::connection(); $lock = $redis->set($lockKey, 1, 'ex', 10,'nx'); ?>
例二相对于例一而言,实现了原子操作设置过期时间(从2.6.12版本开始才有的)
下面我重点说一下laravel中set命令的几个参数含义,在网上未曾找到详细的解释,特此记录下来。
//参数一: $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 语句

方法一:

DB::connection()->enableQueryLog(); // 开启查询日志 ...... dd(DB::getQueryLog());

方法二:

  • 安装
composer require guanguans/laravel-dump-sql -v php artisan vendor:publish --provider="Guanguans\\LaravelDumpSql\\ServiceProvider"
  • 使用1
// 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文件
    • 自定义别名
php artisan vendor:publish --tag="laravel-dump-sql"
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', ];

方法三:

  • select语句可以直接使用->tosql();
Last modification:June 19, 2023
如果觉得我的文章对你有用,请随意赞赏