在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
如果觉得我的文章对你有用,请随意赞赏