原因:
出现这种错误的应用程序使用的架构基本都是php-fpm+phpredis。并发较大的情况下,处于TIME-WAIT状态下的TCP连接较多,客户端无法分配出新的端口,报错Address not available
解决思路:
用长连接替代短连接,减少TCP连接,同时可以避免每次请求建连,减少延时。
解决方案:
使用长连接替换短连接,也就是使用pconnect替换connect;
具体操作:
1,针对原生redis操作,我们可以直接更改:
$redis->connect('inst-name.redis.rds.aliyuncs.com', 6379);
$redis->auth('inst-password');
改为:
$redis->pconnect('inst-name.redis.rds.aliyuncs.com', 6379);
$redis->auth('inst-password');
2,针对laravel的Redis操作
我们知道laravel本身已经封装了Redis的facade,所以日常使用redis或者使用redis版本的cache,都是直接使用的Redis门面,所以这里直接更改laravel的配置参数即可,database.php里面有redis配置参数
'default' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_DB', '0'),
],
'cache' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_CACHE_DB', '1'),
],
//增加persistent是否持久化参数后
'default' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_DB', '0'),
'persistent' => true, //在这
],
'cache' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_CACHE_DB', '1'),
'persistent' => true, //在这
],
注意事项:
使用哪个连接配置就改哪个,没必要全部改
参考链接:短连接访问Redis报错Cannot assign requested address解决方案-阿里云开发者社区
|