邢栋博客

邢栋博客,Action博客,记录工作和生活中的点点滴滴

[docker-es]-None of the configured nodes are available

问题:

springboot连接我用docker启动的es服务时报错,None of the configured nodes are available


解决方案:

1、先通过http://localhost:9200/查看参数cluster_name 和 springboot里配置的参数cluster_name是否一致,如果不一致,要修改成一致

2、如果通过修改cluster_name参数仍然无法解决,这时候就要看下Spring Data Elasticsearch 依赖 和 Elasticsearch的版本对应关系了

Spring Data Elasticsearch 
Elasticsearch
3.2.x
6.7.2
3.1.x 
6.2.2
3.0.x 
5.5.0
2.1.x
2.4.0
2.0.x 
2.2.0
1.3.x 
1.5.2



SpingBoot修改启动文字图标


1、进入 src/main/resources 目录下,新建banner.txt 文件

2、进入字母转字符串,字母转字符串 ,制作一个你想要的,然后复制到banner.txt文件中即可,再次启动就可以看到了


WX20210420-212031.png

SpringBoot启动失败(Reason: Failed to determine a suitable driver class)


原因:启动时不需要数据源加载,但加载了数据源,数据源获取失败,异常报错,启动失败。


在启动类的@SpringBootApplication加上以下代码


@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class SpringbootEsApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootEsApplication.class, args);
    }

}


PHP 两个有序数组合并成一个有序数组
<?php

    $a = [1,3,5,7,9,11];

    $b = [2,4,6,8,10];

    function test_sort($a,$b){

        $c = [];
        $aCount = count($a);
        $bCount = count($b);
        $i = $j = 0;

        while($i < $aCount && $j < $bCount){
            if($a[$i] > $b[$j]){
                $c[] = $b[$j];
                $j++;
            }elseif($a[$i] < $b[$j]){
                $c[] = $a[$i];
                $i++;
            }else{
                $c[] = $a[$i];
                $c[] = $b[$j];
                $i++;
                $j++;
            }
        }

        while($i < $aCount){
            $c[] = $a[$i];
            $i++;
        }

        while($j < $bCount){
            $c[] = $a[$j];
            $j++;
        }

        return $c;
    }


    function test_sort2($a,$b){

        $c = [];
        $aCount = count($a);
        $bCount = count($b);
        $i = $j = 0;


        while($i < $aCount || $j < $bCount){

            if($i < $aCount && $j < $bCount){
                if($a[$i] > $b[$j]){
                    $c[] = $b[$j];
                    $j++;
                }elseif($a[$i] < $b[$j]){
                    $c[] = $a[$i];
                    $i++;
                }else{
                    $c[] = $a[$i];
                    $c[] = $b[$j];
                    $i++;
                    $j++;
                }
            }elseif($i < $aCount && $j >= $bCount){
                $c[] = $a[$i];
                $i++;
            }elseif($i >= $aCount && $j < $bCount){
                $c[] = $b[$j];
                $j++;
            }

        }

        return $c;

    }

    $res = test_sort2($a,$b);

    print_r($res);

php下正则匹配大字符串失败问题
问题描述:

在使用php函数preg_match匹配大字符串的时候匹配失败,而删除一半数据,则匹配成功,

解决过程:

于是在匹配结束后,调用preg_last_error()函数,查看失败原因,返回的是6,6对应的错误原因是PREG_JIT_STACKLIMIT_ERROR,

原来当字符串太大的时候,栈空间满了,直接就出错了,于是在匹配前加一下代码

ini_set('pcre.jit', 0);


解决查找的资料

1、深悉正则(pcre)最大回溯/递归限制(https://www.laruence.com/2010/06/08/1579.html)
php-bc数据函数

=====bcadd — 2个任意精度数字的加法计算=====
<?php
$a = '1.234';
$b = '5';
echo bcadd($a, $b);     // 6
echo bcadd($a, $b, 4);  // 6.2340
?>
=====bccomp — 比较两个任意精度的数字=====
<?php
echo bccomp('1', '2') . "\n";   // -1
echo bccomp('1.00001', '1', 3); // 0
echo bccomp('1.00001', '1', 5); // 1
?>
=====bcdiv — 2个任意精度的数字除法计算=====
<?php
echo bcdiv('105', '6.55957', 3);  // 16.007
?>
=====bcmod — 对一个任意精度数字取模=====
<?php
echo bcmod('4', '2'); // 0
echo bcmod('2', '4'); // 2
?>
=====bcmul — 2个任意精度数字乘法计算=====
<?php
echo bcmul('1.34747474747', '35', 3); // 47.161
echo bcmul('2', '4'); // 8
?>
=====bcpow — 任意精度数字的乘方=====
<?php
echo bcpow('4.2', '3', 2); // 74.08
?>
=====bcpowmod — Raise an arbitrary precision number to another, reduced by a specified modulus=====
<?php
$a = bcpowmod($x, $y, $mod);
$b = bcmod(bcpow($x, $y), $mod);
// $a and $b are equal to each other.
?>
=====bcscale — 设置所有bc数学函数的默认小数点保留位数=====
<?php
// default scale : 3
bcscale(3);
echo bcdiv('105', '6.55957'); // 16.007
// this is the same without bcscale()
echo bcdiv('105', '6.55957', 3); // 16.007
?>
=====bcsqrt — 任意精度数字的二次方根=====
<?php
echo bcsqrt('2', 3); // 1.414
?>
=====bcsub — 2个任意精度数字的减法=====
<?php
$a = '1.234';
$b = '5';
echo bcsub($a, $b);     // -3
echo bcsub($a, $b, 4);  // -3.7660
?>


解决京东联盟广告在网页内显示不全的问题
问题描述

网站内引入了京东广告,但是内容一直显示不全,如图

jd-1.png

加入代码后
<script type="text/javascript">$('iframe').each(function(){if($(this).attr('src').indexOf('jd.com') != -1){$(this).attr('height','250px');}})</script>
显示如下(250px根据自己的情况而定)
jd-2.png

关于redis pipeline
=====为什么需要 pipeline ?=====
Redis 的工作过程是基于 请求/响应 模式的。正常情况下,客户端发送一个命令,等待 Redis 应答;Redis 接收到命令,处理后应答。请求发出到响应的时间叫做往返时间,即 RTT(Round Time Trip)。在这种情况下,如果需要执行大量的命令,就需要等待上一条命令应答后再执行。这中间不仅仅多了许多次 RTT,而且还频繁的调用系统 IO,发送网络请求。为了提升效率,pipeline 出现了,它允许客户端可以一次发送多条命令,而不等待上一条命令执行的结果。

=====实现思路=====
客户端首先将执行的命令写入到缓冲区中,最后再一次性发送 Redis。但是有一种情况就是,缓冲区的大小是有限制的:如果命令数据太大,可能会有多次发送的过程,但是仍不会处理 Redis 的应答。

=====实现原理=====
要支持 pipeline,既要服务端的支持,也要客户端支持。对于服务端来说,所需要的是能够处理一个客户端通过同一个 TCP 连接发来的多个命令。可以理解为,这里将多个命令切分,和处理单个命令一样。对于客户端,则是要将多个命令缓存起来,缓冲区满了就发送,然后再写缓冲,最后才处理 Redis 的应答。

=====Redis pipeline 的参考资料=====
https://redis.io/topics/pipelining

=====在php中使用Redis pipeline=====
<?php
 //实例化redis
$redis = new Redis();
//连接
$redis->connect('127.0.0.1', 6379);
$redis->pipeline();//开启管道
if(!$redis){
    throw new Exception('redis连接失败!',1);
}
$key = "pipeline_test";
$len = 200000;
$succ = 0;
for($i=0;$i<$len;$i++){
    $res = $redis->hset($key,"test_".$i,1);
    if($res){
        $succ ++;
    }
}
$redis->exec();

=====总结:Redis pipeline 的特性以及使用时需要注意的地方=====
pipeline 减少了 RTT,也减少了IO调用次数(IO 调用涉及到用户态到内核态之间的切换)
如果某一次需要执行大量的命令,不能放到一个 pipeline 中执行。数据量过多,网络传输延迟会增加,且会消耗 Redis 大量的内存。应该将大量的命令切分为多个 pipeline 分别执行。


优惠券
最新微语