• 关于

    四地址问题怎么解决

    的搜索结果

问题

安全技术百问,老板再也不用担心病毒勒索了!

近期安全事件频发,从GitLab数据库被删除事件以及炉石传说数据库问题以及MongoDB黑客赎金事件,互联网以及云上安全又一次引发社会热议。互联网界有一句很流行的话,“没有什么应用是没有遭受过攻击的,只是因为你不知道”。所以说目前的互联网安...
yq传送门 2019-12-01 20:11:52 24648 浏览量 回答数 15

问题

百问百答 《文娱移动端技术》

阿里文娱移动端技术中定义一个客户端应有的标准化是什么? 阿里文娱移动端技术中提到优酷的标准化实践有哪些? 阿里文娱移动端技术中提到优酷一个应用通常是由什么组成? 阿里文娱移动端技术中提到数据模...
不语奈何 2021-03-25 13:32:35 25 浏览量 回答数 1

回答

Re“零基础”系列课程如何在ECS上快递搭建一个WordPress站点 要金币,否则下载不了 ------------------------- Re“零基础”系列课程如何在ECS上快递搭建一个WordPress站点 weile 金币,真不容易 ------------------------- 回 40楼larryli的帖子 不会改,不知道具体怎么改,可否在详细一些?谢谢,而且我的解压web之后的文件名都是乱码,咋回事?谢谢 ------------------------- Re“零基础”系列课程如何在ECS上快递搭建一个WordPress站点 为何到最后一步,我就不知道怎么弄了,是按回车,还是按哪里?按哪都没出现冒号“:”,然后可以输入wq,输入wq之后是按回车还是按什么?见下图,等大神帮忙解答,谢谢,电脑是macbook air,按照的win7系统,还有就是上传上去的文件名称全部是乱码,xshell和xftp的utf8已经修改了,但是还是不行,就是乱码。 第一张图看最后那个红色框里面的东西,如果按键盘fn+enter回车键就变成第二图下面红色框中的内容,就是怎么都无法看到视频中的那样,我是很菜的菜鸟,望一步步说的详细些,谢谢 ------------------------- 回 167楼training的帖子 2.1 将WEB根目录修改为“/alidata/www/wordpress” 这个基本会操作了 2.2 将phpmyadmin目录从“/alidata/www” move 到“/alidata/www/wordpress” 这个用xshell输入什么命令来实现? 具体要怎么操作,您如果一个没说,估计我都挂 mv空格/alidata/www/phpmyadmin空格/alidata/www/wordpress/ 已完成 谢谢 但是wordpress后台登陆地址变成什么了? 怎么登陆不了了? 不是403就是404 谢谢 ------------------------- 回 167楼training的帖子 将WEB根目录修改为“/alidata/www/wordpress” 2.2 将phpmyadmin目录从“/alidata/www” move 到“/alidata/www/wordpress” mv空格/alidata/www/phpmyadmin空格/alidata/www/wordpress/ 已完成 谢谢 ------------------------- 回 49楼soulsea的帖子 大神,看到信息加我好友背,QQ279235485,像您咨询和学习,因为打开网页后面都带wordpress,我已经改完了,也成功了,但是php可以登陆,怎么博客后台网址登陆不上去了?去掉wordpress之后,难道博客后台登陆网址也变了吗?谢谢,变成什么了? ------------------------- Re“零基础”系列课程如何在ECS上快递搭建一个WordPress站点 问题集锦:(慢慢完善和编辑更新) 问:文件解压后,文件名是中文,但是显示的是乱码,是和原因? 答:乱码没有关系,只是终端字符集问题,您可以将文档ftp下载到本地查看。 终端字符集,我也查了下,大概就是xshell和xftp的字符是utf8,而本地电脑的字符集与xshell和xftp的不一样,但是不影响建站,就犹如她母语英文,而你母语中文,但是完全不影响结婚生子,是否正确,待大神指点。乱码图片如下: 问:-Bash: Unzip: Command Not Found怎么解决?也就是web文件下载后上传上去了,但是执行unzip的时候无法解压缩,是啥子情况? 答:unzip: command not found的错误。 就是unzip——命令没有找到,其原因肯定是没有安装unzip。 利用一句命令就可以解决了。 命令是: yum install -y unzip zip 当然也可以是: yum  install unzip 注意事项:一定要注意单词中间有空格。 问:按照视频教程,把wordpress安装好了,但网页地址都是 www.域名/wordpress/......,域名后面多了一个wordpress,如何删掉wordpress? 答:操作方法如下: (在@training 指导下亲测) 第一步、修改nginx配置文件,将root 目录改为“/alidata/www/wordpress”,见下方第一个图中的第一个红色框内容; 第一步注意事项: 1、删除第一张图中的代码可以直接点键盘上的X键(这一点我最开始直接没重点听到); 2、如下第一张图中第一个红色框内的内容,修改完毕后,记得按视频讲解修改下面的access,然后先按键盘上的esc退出(注释:按esc退出后不管鼠标在哪里,直接输入冒号加wq即可,即:wq,不要去挪动鼠标或回车之类的画蛇添足哦),接着才可以输入冒号:wq,然后回车,搞定。(还有js调用也可以,但是对于菜鸟,就免了吧,想要学自己去查吧) 第二步、将phpmyadmin目录从“/alidata/www” move 到“/alidata/www/wordpress” 第二步的注意事项: 执行命令如下格式: mv /alidata/www/phpmyadmin /alidata/www/wordpress/ 如上命令解释如下: mv空格/alidata/www/phpmyadmin空格/alidata/www/wordpress/ 第三步:见楼下172楼 @training 的图文并茂执行 修改后最终效果: 1、 wordpress 可以直接通过 http://ip地址/ 来访问 2、 phpmyadmin的访问地址变为 http://ip地址/phpmyadmin/ 小结: 上面三步缺一不可,已经亲测。 注意事项: 1、如果你是MacBook Air电脑(也许苹果电脑都这样,具体我不知道,反正我的电脑MacBook Air会出现下面两张图中最下面红色框里面的内容问题,因为我用delete去删除代码了,而没用键盘上的X键导致的),那么看下面两张图各自最下面的红色框里面的内容,是不是不一样?就是,丫丫个呸的,原因我也不知道,只知道怎么解决,如果出现这样的情况,需要按键盘上的fn+enter键,将下面的变成INSERT而非REPLACE,那么就可以在里面删除字母并输入新的字母,修改后,按键盘上的esc退出,然后即可输入冒号wq,即:wq,然后回车,搞定。 2、把wordpress这个后缀的确干掉了,但是我需要很负责任的告诉您,博客后台登陆地址已经变了,变成什么样了?我想的很简单,因为去掉了wordpress这个后缀,那么博客原管理后台地址http://120.24.219.20/wordpress/wp-login.php 就应该变成了 http://120.24.219.20/wp-login.php(这个也难为了我好久,你说我有多菜?但是我是在努力学,即使一个代码都不懂,但是知道它的原理,代码的原理就犹如,你想找到C盘目录下的某个文件,你得双击进入C盘,然后找到文件夹,在找到文件,而这样的过程,只是用代码来解决了而已,这样理解,就有点融会贯通的感觉了,但现实往往是残酷了,请看下面第三章图,可以输入登陆信息了,但是输入之后,坑了,见下面第四章图,又跳回来了(补充:此问题已解决,见楼下172楼 @training 的图文并茂给力解答。) (上方为图一) (上方为图二) (上方为图三) (上方为图四) 问:为什么我的是这样。。 root@iZ28r23lg4jZ:~# cd/root -bash: cd/root: No such file or directory 答:其实重点你只要看上面语句中的cd/root就知道了,亲,空格呢? 正确输入应为cd /root,即cd空格/root。 再次引用举例: 命令之间需要有空格的,如下: “cd /root” ,即cd空格/root; “ls -l” ,即ls空格-l; ------------------------- 回 172楼training的帖子 第一、买的是阿里云linux,域名必须备案通过后才可以通过域名访问网页吗?还是备案,拿到备案号后,他人即可通过域名访问? 第二、云解析的步骤可否给图文并茂的讲解下或视频讲解; 第三、一个云ecs下可以挂几个域名网站?具体怎么挂?应该是只要ecs足够大,挂多少都可以吧?如果可以挂多个网站,那各个网站应该是独立的吧?不会所有域名都指向同一个网站了吧?那么需要怎么操作?据说,同一个空间内的网站相关性要高才可以挂到一起(百度看到的结果); 第四、关于备案,一次可以几个域名一起备案?备案后是否这几个网站都共用一个备案号?这样不算违规吧?(因为昨晚我去备案,看下面可以添加多个域名,据说一次备案,可以添加5个域名,不知道是否),谢谢 了解菜鸟,才是王道 因为百度也好,淘宝也罢,最初及现在,还是靠很多菜鸟炒起来的,最初有几个百万富翁或千万富翁参与进来呢?个人看法!
fengyunk83 2019-12-01 23:22:13 0 浏览量 回答数 0

回答

Re“零基础”系列课程如何在ECS上快递搭建一个WordPress站点 要金币,否则下载不了 ------------------------- Re“零基础”系列课程如何在ECS上快递搭建一个WordPress站点 weile 金币,真不容易 ------------------------- 回 40楼larryli的帖子 不会改,不知道具体怎么改,可否在详细一些?谢谢,而且我的解压web之后的文件名都是乱码,咋回事?谢谢 ------------------------- Re“零基础”系列课程如何在ECS上快递搭建一个WordPress站点 为何到最后一步,我就不知道怎么弄了,是按回车,还是按哪里?按哪都没出现冒号“:”,然后可以输入wq,输入wq之后是按回车还是按什么?见下图,等大神帮忙解答,谢谢,电脑是macbook air,按照的win7系统,还有就是上传上去的文件名称全部是乱码,xshell和xftp的utf8已经修改了,但是还是不行,就是乱码。 第一张图看最后那个红色框里面的东西,如果按键盘fn+enter回车键就变成第二图下面红色框中的内容,就是怎么都无法看到视频中的那样,我是很菜的菜鸟,望一步步说的详细些,谢谢 ------------------------- 回 167楼training的帖子 2.1 将WEB根目录修改为“/alidata/www/wordpress” 这个基本会操作了 2.2 将phpmyadmin目录从“/alidata/www” move 到“/alidata/www/wordpress” 这个用xshell输入什么命令来实现? 具体要怎么操作,您如果一个没说,估计我都挂 mv空格/alidata/www/phpmyadmin空格/alidata/www/wordpress/ 已完成 谢谢 但是wordpress后台登陆地址变成什么了? 怎么登陆不了了? 不是403就是404 谢谢 ------------------------- 回 167楼training的帖子 将WEB根目录修改为“/alidata/www/wordpress” 2.2 将phpmyadmin目录从“/alidata/www” move 到“/alidata/www/wordpress” mv空格/alidata/www/phpmyadmin空格/alidata/www/wordpress/ 已完成 谢谢 ------------------------- 回 49楼soulsea的帖子 大神,看到信息加我好友背,QQ279235485,像您咨询和学习,因为打开网页后面都带wordpress,我已经改完了,也成功了,但是php可以登陆,怎么博客后台网址登陆不上去了?去掉wordpress之后,难道博客后台登陆网址也变了吗?谢谢,变成什么了? ------------------------- Re“零基础”系列课程如何在ECS上快递搭建一个WordPress站点 问题集锦:(慢慢完善和编辑更新) 问:文件解压后,文件名是中文,但是显示的是乱码,是和原因? 答:乱码没有关系,只是终端字符集问题,您可以将文档ftp下载到本地查看。 终端字符集,我也查了下,大概就是xshell和xftp的字符是utf8,而本地电脑的字符集与xshell和xftp的不一样,但是不影响建站,就犹如她母语英文,而你母语中文,但是完全不影响结婚生子,是否正确,待大神指点。乱码图片如下: 问:-Bash: Unzip: Command Not Found怎么解决?也就是web文件下载后上传上去了,但是执行unzip的时候无法解压缩,是啥子情况? 答:unzip: command not found的错误。 就是unzip——命令没有找到,其原因肯定是没有安装unzip。 利用一句命令就可以解决了。 命令是: yum install -y unzip zip 当然也可以是: yum  install unzip 注意事项:一定要注意单词中间有空格。 问:按照视频教程,把wordpress安装好了,但网页地址都是 www.域名/wordpress/......,域名后面多了一个wordpress,如何删掉wordpress? 答:操作方法如下: (在@training 指导下亲测) 第一步、修改nginx配置文件,将root 目录改为“/alidata/www/wordpress”,见下方第一个图中的第一个红色框内容; 第一步注意事项: 1、删除第一张图中的代码可以直接点键盘上的X键(这一点我最开始直接没重点听到); 2、如下第一张图中第一个红色框内的内容,修改完毕后,记得按视频讲解修改下面的access,然后先按键盘上的esc退出(注释:按esc退出后不管鼠标在哪里,直接输入冒号加wq即可,即:wq,不要去挪动鼠标或回车之类的画蛇添足哦),接着才可以输入冒号:wq,然后回车,搞定。(还有js调用也可以,但是对于菜鸟,就免了吧,想要学自己去查吧) 第二步、将phpmyadmin目录从“/alidata/www” move 到“/alidata/www/wordpress” 第二步的注意事项: 执行命令如下格式: mv /alidata/www/phpmyadmin /alidata/www/wordpress/ 如上命令解释如下: mv空格/alidata/www/phpmyadmin空格/alidata/www/wordpress/ 第三步:见楼下172楼 @training 的图文并茂执行 修改后最终效果: 1、 wordpress 可以直接通过 http://ip地址/ 来访问 2、 phpmyadmin的访问地址变为 http://ip地址/phpmyadmin/ 小结: 上面三步缺一不可,已经亲测。 注意事项: 1、如果你是MacBook Air电脑(也许苹果电脑都这样,具体我不知道,反正我的电脑MacBook Air会出现下面两张图中最下面红色框里面的内容问题,因为我用delete去删除代码了,而没用键盘上的X键导致的),那么看下面两张图各自最下面的红色框里面的内容,是不是不一样?就是,丫丫个呸的,原因我也不知道,只知道怎么解决,如果出现这样的情况,需要按键盘上的fn+enter键,将下面的变成INSERT而非REPLACE,那么就可以在里面删除字母并输入新的字母,修改后,按键盘上的esc退出,然后即可输入冒号wq,即:wq,然后回车,搞定。 2、把wordpress这个后缀的确干掉了,但是我需要很负责任的告诉您,博客后台登陆地址已经变了,变成什么样了?我想的很简单,因为去掉了wordpress这个后缀,那么博客原管理后台地址http://120.24.219.20/wordpress/wp-login.php 就应该变成了 http://120.24.219.20/wp-login.php(这个也难为了我好久,你说我有多菜?但是我是在努力学,即使一个代码都不懂,但是知道它的原理,代码的原理就犹如,你想找到C盘目录下的某个文件,你得双击进入C盘,然后找到文件夹,在找到文件,而这样的过程,只是用代码来解决了而已,这样理解,就有点融会贯通的感觉了,但现实往往是残酷了,请看下面第三章图,可以输入登陆信息了,但是输入之后,坑了,见下面第四章图,又跳回来了(补充:此问题已解决,见楼下172楼 @training 的图文并茂给力解答。) (上方为图一) (上方为图二) (上方为图三) (上方为图四) 问:为什么我的是这样。。 root@iZ28r23lg4jZ:~# cd/root -bash: cd/root: No such file or directory 答:其实重点你只要看上面语句中的cd/root就知道了,亲,空格呢? 正确输入应为cd /root,即cd空格/root。 再次引用举例: 命令之间需要有空格的,如下: “cd /root” ,即cd空格/root; “ls -l” ,即ls空格-l; ------------------------- 回 172楼training的帖子 第一、买的是阿里云linux,域名必须备案通过后才可以通过域名访问网页吗?还是备案,拿到备案号后,他人即可通过域名访问? 第二、云解析的步骤可否给图文并茂的讲解下或视频讲解; 第三、一个云ecs下可以挂几个域名网站?具体怎么挂?应该是只要ecs足够大,挂多少都可以吧?如果可以挂多个网站,那各个网站应该是独立的吧?不会所有域名都指向同一个网站了吧?那么需要怎么操作?据说,同一个空间内的网站相关性要高才可以挂到一起(百度看到的结果); 第四、关于备案,一次可以几个域名一起备案?备案后是否这几个网站都共用一个备案号?这样不算违规吧?(因为昨晚我去备案,看下面可以添加多个域名,据说一次备案,可以添加5个域名,不知道是否),谢谢 了解菜鸟,才是王道 因为百度也好,淘宝也罢,最初及现在,还是靠很多菜鸟炒起来的,最初有几个百万富翁或千万富翁参与进来呢?个人看法!
fengyunk83 2019-12-02 01:10:54 0 浏览量 回答数 0

回答

这个可能性比较多,你可以试试以下几步,还不行的话我也没办法了。 一、如果你是静态IP,那么你可以跳过这步。如果你是通过DHCP获得地址,先查看一下自己的IP地址以及IP在哪个网段,(查看本机地址的方法开始--运行--CMD--ipconfig /all,此时你可以看到自己的IP地址是多少,这里假设本机IP是192.168.1.100,掩码是255.255.255.0,网关是 192.168.1.254,首选DNS是192.168.1.11,备用DNS是192.168.1.12)。知道IP地址后,你可以通过网上邻居--属性--本地连接--属性--Internet协议(TCP/IP)--选择使用下面的IP地址,IP地址:输入 192.168.1.2-192.168.1.253中的任意一个即可(只要不和其他IP冲突),掩码填上255.255.255.0,网关填上 192.168.1.254,首选DNS填上192.168.1.11,备用DNS填上192.168.1.12,然后点确定如果不行,下一步。。。。。 二:检查一下你的网线有没有插好了,把网线水晶头两端拔出重新插紧,此时,如果你是静态IP,则打开浏览器看能不能上网,如果不能,请跳过此步看“三”;如果你是通过DHCP获得IP,你可以通过第一步里面的方法先查看自己的IP,或者等待几秒钟,看右下角本地连接小图标还有没有出现叹号并显示本地连接受限制,如果没有,恭喜你,你又可以继续网上冲浪了;如果还是不行。。。。 三:这时你可以把路由器或者交换机(视网络环境而定,家庭或者一般的只有几台电脑的小公司一般都是路由器,有10台以上电脑的公司一般都是交换机+路由器)的电源断掉,隔一,两分钟后再插上,此时再看右下角本地连接小图标还有没有出现叹号并显示本地连接受限制,如果没有,恭喜你,如果还是出现,不要灰心哟,请继续往下看。 四:到了这时,你应该考虑下是不是你的网线出了问题,水晶头接触不好,线的质量出现问题等等因素都会导致你的线路传输出现丢包或者收不到包的情况等等,如果有工具的可以使用工具把网线测一下,看线路是否通畅,如果线路是通畅正常的,那么请跳过此招;如果不通畅,可以用剥线钳把两端水晶头夹紧一下,或者重新做一下水晶头,这时再插好线,问题应该得到解决。 五:IP是正确的,路由器交换机也断电重插了,网线也是好的,怎么就是不能上网呢?急死人也!!呵呵,别急,这种情况你可以看看你周围的人他们能不能上网,或者看别的机器能不能上网,如果他们能上,这时,你不能上网的原因就有两个可能性,一是你电脑中毒了(可能性很小),二是你网卡出故障了(可能性很大),没办法,换块网卡试试吧! “答案来源于网络,供您参考” 希望以上信息可以帮到您!
牧明 2019-12-02 02:16:11 0 浏览量 回答数 0

问题

两个问题,一是免费系统搭建,一是频繁掉线

   刚买了一个星期,这几天还算稳定,继续体验!看来月付还是比较保险!    一开始看有免费搭建坏境,我就申请了,用了三四天弄完的   这个过程最初不告诉我...
z7624397 2019-12-01 20:28:13 8021 浏览量 回答数 2

回答

在开始谈我对架构本质的理解之前,先谈谈对今天技术沙龙主题的个人见解,千万级规模的网站感觉数量级是非常大的,对这个数量级我们战略上 要重 视 它 , 战术上又 要 藐 视 它。先举个例子感受一下千万级到底是什么数量级?现在很流行的优步(Uber),从媒体公布的信息看,它每天接单量平均在百万左右, 假如每天有10个小时的服务时间,平均QPS只有30左右。对于一个后台服务器,单机的平均QPS可以到达800-1000,单独看写的业务量很简单 。为什么我们又不能说轻视它?第一,我们看它的数据存储,每天一百万的话,一年数据量的规模是多少?其次,刚才说的订单量,每一个订单要推送给附近的司机、司机要并发抢单,后面业务场景的访问量往往是前者的上百倍,轻松就超过上亿级别了。 今天我想从架构的本质谈起之后,希望大家理解在做一些建构设计的时候,它的出发点以及它解决的问题是什么。 架构,刚开始的解释是我从知乎上看到的。什么是架构?有人讲, 说架构并不是一 个很 悬 乎的 东西 , 实际 上就是一个架子 , 放一些 业务 和算法,跟我们的生活中的晾衣架很像。更抽象一点,说架构其 实 是 对 我 们 重复性业务 的抽象和我 们 未来 业务 拓展的前瞻,强调过去的经验和你对整个行业的预见。 我们要想做一个架构的话需要哪些能力?我觉得最重要的是架构师一个最重要的能力就是你要有 战 略分解能力。这个怎么来看呢: 第一,你必须要有抽象的能力,抽象的能力最基本就是去重,去重在整个架构中体现在方方面面,从定义一个函数,到定义一个类,到提供的一个服务,以及模板,背后都是要去重提高可复用率。 第二, 分类能力。做软件需要做对象的解耦,要定义对象的属性和方法,做分布式系统的时候要做服务的拆分和模块化,要定义服务的接口和规范。 第三, 算法(性能),它的价值体现在提升系统的性能,所有性能的提升,最终都会落到CPU,内存,IO和网络这4大块上。 这一页PPT举了一些例子来更深入的理解常见技术背后的架构理念。 第一个例子,在分布式系统我们会做 MySQL分 库 分表,我们要从不同的库和表中读取数据,这样的抽象最直观就是使用模板,因为绝大多数SQL语义是相同的,除了路由到哪个库哪个表,如果不使用Proxy中间件,模板就是性价比最高的方法。 第二看一下加速网络的CDN,它是做速度方面的性能提升,刚才我们也提到从CPU、内存、IO、网络四个方面来考虑,CDN本质上一个是做网络智能调度优化,另一个是多级缓存优化。 第三个看一下服务化,刚才已经提到了,各个大网站转型过程中一定会做服务化,其实它就是做抽象和做服务的拆分。第四个看一下消息队列,本质上还是做分类,只不过不是两个边际清晰的类,而是把两个边际不清晰的子系统通过队列解构并且异步化。新浪微博整体架构是什么样的 接下我们看一下微博整体架构,到一定量级的系统整个架构都会变成三层,客户端包括WEB、安卓和IOS,这里就不说了。接着还都会有一个接口层, 有三个主要作用: 第一个作用,要做 安全隔离,因为前端节点都是直接和用户交互,需要防范各种恶意攻击; 第二个还充当着一个 流量控制的作用,大家知道,在2014年春节的时候,微信红包,每分钟8亿多次的请求,其实真正到它后台的请求量,只有十万左右的数量级(这里的数据可能不准),剩余的流量在接口层就被挡住了; 第三,我们看对 PC 端和移 动 端的需求不一样的,所以我们可以进行拆分。接口层之后是后台,可以看到微博后台有三大块: 一个是 平台服 务, 第二, 搜索, 第三, 大数据。到了后台的各种服务其实都是处理的数据。 像平台的业务部门,做的就是 数据存储和读 取,对搜索来说做的是 数据的 检 索,对大数据来说是做的数据的 挖掘。微博其实和淘宝是很类似 微博其实和淘宝是很类似的。一般来说,第一代架构,基本上能支撑到用户到 百万 级别,到第二代架构基本能支撑到 千万 级别都没什么问题,当业务规模到 亿级别时,需要第三代的架构。 从 LAMP 的架构到面向服 务 的架构,有几个地方是非常难的,首先不可能在第一代基础上通过简单的修修补补满足用户量快速增长的,同时线上业务又不能停, 这是我们常说的 在 飞 机上 换 引擎的 问题。前两天我有一个朋友问我,说他在内部推行服务化的时候,把一个模块服务化做完了,其他部门就是不接。我建议在做服务化的时候,首先更多是偏向业务的梳理,同时要找准一个很好的切入点,既有架构和服务化上的提升,业务方也要有收益,比如提升性能或者降低维护成本同时升级过程要平滑,建议开始从原子化服务切入,比如基础的用户服务, 基础的短消息服务,基础的推送服务。 第二,就是可 以做无状 态 服 务,后面会详细讲,还有数据量大了后需要做数据Sharding,后面会将。 第三代 架构 要解决的 问题,就是用户量和业务趋于稳步增加(相对爆发期的指数级增长),更多考虑技术框架的稳定性, 提升系统整体的性能,降低成本,还有对整个系统监控的完善和升级。 大型网站的系统架构是如何演变的 我们通过通过数据看一下它的挑战,PV是在10亿级别,QPS在百万,数据量在千亿级别。我们可用性,就是SLA要求4个9,接口响应最多不能超过150毫秒,线上所有的故障必须得在5分钟内解决完。如果说5分钟没处理呢?那会影响你年终的绩效考核。2015年微博DAU已经过亿。我们系统有上百个微服务,每周会有两次的常规上线和不限次数的紧急上线。我们的挑战都一样,就是数据量,bigger and bigger,用户体验是faster and faster,业务是more and more。互联网业务更多是产品体验驱动, 技 术 在 产 品 体验上最有效的贡献 , 就是你的性能 越来越好 。 每次降低加载一个页面的时间,都可以间接的降低这个页面上用户的流失率。微博的技术挑战和正交分解法解析架构 下面看一下 第三代的 架构 图 以及 我 们 怎么用正交分解法 阐 述。 我们可以看到我们从两个维度,横轴和纵轴可以看到。 一个 维 度 是 水平的 分层 拆分,第二从垂直的维度会做拆分。水平的维度从接口层、到服务层到数据存储层。垂直怎么拆分,会用业务架构、技术架构、监控平台、服务治理等等来处理。我相信到第二代的时候很多架构已经有了业务架构和技术架构的拆分。我们看一下, 接口层有feed、用户关系、通讯接口;服务层,SOA里有基层服务、原子服务和组合服务,在微博我们只有原子服务和组合服务。原子服务不依赖于任何其他服务,组合服务由几个原子服务和自己的业务逻辑构建而成 ,资源层负责海量数据的存储(后面例子会详细讲)。技 术框架解决 独立于 业务 的海量高并发场景下的技术难题,由众多的技术组件共同构建而成 。在接口层,微博使用JERSY框架,帮助你做参数的解析,参数的验证,序列化和反序列化;资源层,主要是缓存、DB相关的各类组件,比如Cache组件和对象库组件。监 控平台和服 务 治理 , 完成系统服务的像素级监控,对分布式系统做提前诊断、预警以及治理。包含了SLA规则的制定、服务监控、服务调用链监控、流量监控、错误异常监控、线上灰度发布上线系统、线上扩容缩容调度系统等。 下面我们讲一下常见的设计原则。 第一个,首先是系统架构三个利器: 一个, 我 们 RPC 服 务组 件 (这里不讲了), 第二个,我们 消息中 间 件 。消息中间件起的作用:可以把两个模块之间的交互异步化,其次可以把不均匀请求流量输出为匀速的输出流量,所以说消息中间件 异步化 解耦 和流量削峰的利器。 第三个是配置管理,它是 代码级灰度发布以及 保障系统降级的利器。 第二个 , 无状态 , 接口 层 最重要的就是无状 态。我们在电商网站购物,在这个过程中很多情况下是有状态的,比如我浏览了哪些商品,为什么大家又常说接口层是无状态的,其实我们把状态从接口层剥离到了数据层。像用户在电商网站购物,选了几件商品,到了哪一步,接口无状态后,状态要么放在缓存中,要么放在数据库中, 其 实 它并不是没有状 态 , 只是在 这 个 过 程中我 们 要把一些有状 态 的 东 西抽离出来 到了数据层。 第三个, 数据 层 比服 务层 更需要 设计,这是一条非常重要的经验。对于服务层来说,可以拿PHP写,明天你可以拿JAVA来写,但是如果你的数据结构开始设计不合理,将来数据结构的改变会花费你数倍的代价,老的数据格式向新的数据格式迁移会让你痛不欲生,既有工作量上的,又有数据迁移跨越的时间周期,有一些甚至需要半年以上。 第四,物理结构与逻辑结构的映射,上一张图看到两个维度切成十二个区间,每个区间代表一个技术领域,这个可以看做我们的逻辑结构。另外,不论后台还是应用层的开发团队,一般都会分几个垂直的业务组加上一个基础技术架构组,这就是从物理组织架构到逻辑的技术架构的完美的映射,精细化团队分工,有利于提高沟通协作的效率 。 第五, www .sanhao.com 的访问过程,我们这个架构图里没有涉及到的,举个例子,比如当你在浏览器输入www.sanhao网址的时候,这个请求在接口层之前发生了什么?首先会查看你本机DNS以及DNS服务,查找域名对应的IP地址,然后发送HTTP请求过去。这个请求首先会到前端的VIP地址(公网服务IP地址),VIP之后还要经过负载均衡器(Nginx服务器),之后才到你的应用接口层。在接口层之前发生了这么多事,可能有用户报一个问题的时候,你通过在接口层查日志根本发现不了问题,原因就是问题可能发生在到达接口层之前了。 第六,我们说分布式系统,它最终的瓶颈会落在哪里呢?前端时间有一个网友跟我讨论的时候,说他们的系统遇到了一个瓶颈, 查遍了CPU,内存,网络,存储,都没有问题。我说你再查一遍,因为最终你不论用上千台服务器还是上万台服务器,最终系统出瓶颈的一定会落在某一台机(可能是叶子节点也可能是核心的节点),一定落在CPU、内存、存储和网络上,最后查出来问题出在一台服务器的网卡带宽上。微博多级双机房缓存架构 接下来我们看一下微博的Feed多级缓存。我们做业务的时候,经常很少做业务分析,技术大会上的分享又都偏向技术架构。其实大家更多的日常工作是需要花费更多时间在业务优化上。这张图是统计微博的信息流前几页的访问比例,像前三页占了97%,在做缓存设计的时候,我们最多只存最近的M条数据。 这里强调的就是做系统设计 要基于用 户 的 场 景 , 越细致越好 。举了一个例子,大家都会用电商,电商在双十一会做全国范围内的活动,他们做设计的时候也会考虑场景的,一个就是购物车,我曾经跟相关开发讨论过,购物车是在双十一之前用户的访问量非常大,就是不停地往里加商品。在真正到双十一那天他不会往购物车加东西了,但是他会频繁的浏览购物车。针对这个场景,活动之前重点设计优化购物车的写场景, 活动开始后优化购物车的读场景。 你看到的微博是由哪些部分聚合而成的呢?最右边的是Feed,就是微博所有关注的人,他们的微博所组成的。微博我们会按照时间顺序把所有关注人的顺序做一个排序。随着业务的发展,除了跟时间序相关的微博还有非时间序的微博,就是会有广告的要求,增加一些广告,还有粉丝头条,就是拿钱买的,热门微博,都会插在其中。分发控制,就是说和一些推荐相关的,我推荐一些相关的好友的微博,我推荐一些你可能没有读过的微博,我推荐一些其他类型的微博。 当然对非时序的微博和分发控制微博,实际会起多个并行的程序来读取,最后同步做统一的聚合。这里稍微分享一下, 从SNS社交领域来看,国内现在做的比较好的三个信息流: 微博 是 基于弱关系的媒体信息流 ; 朋友圈是基于 强 关系的信息流 ; 另外一个做的比 较 好的就是今日 头 条 , 它并不是基于关系来构建信息流 , 而是基于 兴趣和相关性的个性化推荐 信息流 。 信息流的聚合,体现在很多很多的产品之中,除了SNS,电商里也有信息流的聚合的影子。比如搜索一个商品后出来的列表页,它的信息流基本由几部分组成:第一,打广告的;第二个,做一些推荐,热门的商品,其次,才是关键字相关的搜索结果。 信息流 开始的时候 很 简单 , 但是到后期会 发现 , 你的 这 个流 如何做控制分发 , 非常复杂, 微博在最近一两年一直在做 这样 的工作。刚才我们是从业务上分析,那么技术上怎么解决高并发,高性能的问题?微博访问量很大的时候,底层存储是用MySQL数据库,当然也会有其他的。对于查询请求量大的时候,大家知道一定有缓存,可以复用可重用的计算结果。可以看到,发一条微博,我有很多粉丝,他们都会来看我发的内容,所以 微博是最适合使用 缓 存 的系统,微博的读写比例基本在几十比一。微博使用了 双 层缓 存,上面是L1,每个L1上都是一组(包含4-6台机器),左边的框相当于一个机房,右边又是一个机房。在这个系统中L1缓存所起的作用是什么? 首先,L1 缓 存增加整个系 统 的 QPS, 其次 以低成本灵活扩容的方式 增加 系统 的 带宽 。想象一个极端场景,只有一篇博文,但是它的访问量无限增长,其实我们不需要影响L2缓存,因为它的内容存储的量小,但它就是访问量大。这种场景下,你就需要使用L1来扩容提升QPS和带宽瓶颈。另外一个场景,就是L2级缓存发生作用,比如我有一千万个用户,去访问的是一百万个用户的微博 ,这个时候,他不只是说你的吞吐量和访问带宽,就是你要缓存的博文的内容也很多了,这个时候你要考虑缓存的容量, 第二 级缓 存更多的是从容量上来 规划,保证请求以较小的比例 穿透到 后端的 数据 库 中 ,根据你的用户模型你可以估出来,到底有百分之多少的请求不能穿透到DB, 评估这个容量之后,才能更好的评估DB需要多少库,需要承担多大的访问的压力。另外,我们看双机房的话,左边一个,右边一个。 两个机房是互 为 主 备 , 或者互 为热备 。如果两个用户在不同地域,他们访问两个不同机房的时候,假设用户从IDC1过来,因为就近原理,他会访问L1,没有的话才会跑到Master,当在IDC1没找到的时候才会跑到IDC2来找。同时有用户从IDC2访问,也会有请求从L1和Master返回或者到IDC1去查找。 IDC1 和 IDC2 ,两个机房都有全量的用户数据,同时在线提供服务,但是缓存查询又遵循最近访问原理。还有哪些多级缓存的例子呢?CDN是典型的多级缓存。CDN在国内各个地区做了很多节点,比如在杭州市部署一个节点时,在机房里肯定不止一台机器,那么对于一个地区来说,只有几台服务器到源站回源,其他节点都到这几台服务器回源即可,这么看CDN至少也有两级。Local Cache+ 分布式 缓 存,这也是常见的一种策略。有一种场景,分布式缓存并不适用, 比如 单 点 资 源 的爆发性峰值流量,这个时候使用Local Cache + 分布式缓存,Local Cache 在 应用 服 务 器 上用很小的 内存资源 挡住少量的 极端峰值流量,长尾的流量仍然访问分布式缓存,这样的Hybrid缓存架构通过复用众多的应用服务器节点,降低了系统的整体成本。 我们来看一下 Feed 的存 储 架构,微博的博文主要存在MySQL中。首先来看内容表,这个比较简单,每条内容一个索引,每天建一张表,其次看索引表,一共建了两级索引。首先想象一下用户场景,大部分用户刷微博的时候,看的是他关注所有人的微博,然后按时间来排序。仔细分析发现在这个场景下, 跟一个用户的自己的相关性很小了。所以在一级索引的时候会先根据关注的用户,取他们的前条微博ID,然后聚合排序。我们在做哈希(分库分表)的时候,同时考虑了按照UID哈希和按照时间维度。很业务和时间相关性很高的,今天的热点新闻,明天就没热度了,数据的冷热非常明显,这种场景就需要按照时间维度做分表,首先冷热数据做了分离(可以对冷热数据采用不同的存储方案来降低成本),其次, 很容止控制我数据库表的爆炸。像微博如果只按照用户维度区分,那么这个用户所有数据都在一张表里,这张表就是无限增长的,时间长了查询会越来越慢。二级索引,是我们里面一个比较特殊的场景,就是我要快速找到这个人所要发布的某一时段的微博时,通过二级索引快速定位。 分布式服务追踪系统 分布式追踪服务系统,当系统到千万级以后的时候,越来越庞杂,所解决的问题更偏向稳定性,性能和监控。刚才说用户只要有一个请求过来,你可以依赖你的服务RPC1、RPC2,你会发现RPC2又依赖RPC3、RPC4。分布式服务的时候一个痛点,就是说一个请求从用户过来之后,在后台不同的机器之间不停的调用并返回。 当你发现一个问题的时候,这些日志落在不同的机器上,你也不知道问题到底出在哪儿,各个服务之间互相隔离,互相之间没有建立关联。所以导致排查问题基本没有任何手段,就是出了问题没法儿解决。 我们要解决的问题,我们刚才说日志互相隔离,我们就要把它建立联系。建立联系我们就有一个请求ID,然后结合RPC框架, 服务治理功能。假设请求从客户端过来,其中包含一个ID 101,到服务A时仍然带有ID 101,然后调用RPC1的时候也会标识这是101 ,所以需要 一个唯一的 请求 ID 标识 递归迭代的传递到每一个 相关 节点。第二个,你做的时候,你不能说每个地方都加,对业务系统来说需要一个框架来完成这个工作, 这 个框架要 对业务 系 统 是最低侵入原 则 , 用 JAVA 的 话 就可以用 AOP,要做到零侵入的原则,就是对所有相关的中间件打点,从接口层组件(HTTP Client、HTTP Server)至到服务层组件(RPC Client、RPC Server),还有数据访问中间件的,这样业务系统只需要少量的配置信息就可以实现全链路监控 。为什么要用日志?服务化以后,每个服务可以用不同的开发语言, 考虑多种开发语言的兼容性 , 内部定 义标 准化的日志 是唯一且有效的办法。最后,如何构建基于GPS导航的路况监控?我们刚才讲分布式服务追踪。分布式服务追踪能解决的问题, 如果 单一用 户发现问题 后 , 可以通 过请 求 ID 快速找到 发 生 问题 的 节 点在什么,但是并没有解决如何发现问题。我们看现实中比较容易理解的道路监控,每辆车有GPS定位,我想看北京哪儿拥堵的时候,怎么做? 第一个 , 你肯定要知道每个 车 在什么位置,它走到哪儿了。其实可以说每个车上只要有一个标识,加上每一次流动的信息,就可以看到每个车流的位置和方向。 其次如何做 监 控和 报 警,我们怎么能了解道路的流量状况和负载,并及时报警。我们要定义这条街道多宽多高,单位时间可以通行多少辆车,这就是道路的容量。有了道路容量,再有道路的实时流量,我们就可以基于实习路况做预警? 对应于 分布式系 统 的话如何构建? 第一 , 你要 定义 每个服 务节 点它的 SLA A 是多少 ?SLA可以从系统的CPU占用率、内存占用率、磁盘占用率、QPS请求数等来定义,相当于定义系统的容量。 第二个 , 统计 线 上 动态 的流量,你要知道服务的平均QPS、最低QPS和最大QPS,有了流量和容量,就可以对系统做全面的监控和报警。 刚才讲的是理论,实际情况肯定比这个复杂。微博在春节的时候做许多活动,必须保障系统稳定,理论上你只要定义容量和流量就可以。但实际远远不行,为什么?有技术的因素,有人为的因素,因为不同的开发定义的流量和容量指标有主观性,很难全局量化标准,所以真正流量来了以后,你预先评估的系统瓶颈往往不正确。实际中我们在春节前主要采取了三个措施:第一,最简单的就是有降 级 的 预 案,流量超过系统容量后,先把哪些功能砍掉,需要有明确的优先级 。第二个, 线上全链路压测,就是把现在的流量放大到我们平常流量的五倍甚至十倍(比如下线一半的服务器,缩容而不是扩容),看看系统瓶颈最先发生在哪里。我们之前有一些例子,推测系统数据库会先出现瓶颈,但是实测发现是前端的程序先遇到瓶颈。第三,搭建在线 Docker 集群 , 所有业务共享备用的 Docker集群资源,这样可以极大的避免每个业务都预留资源,但是实际上流量没有增长造成的浪费。 总结 接下来说的是如何不停的学习和提升,这里以Java语言为例,首先, 一定要 理解 JAVA;第二步,JAVA完了以后,一定要 理 解 JVM;其次,还要 理解 操作系统;再次还是要了解一下 Design Pattern,这将告诉你怎么把过去的经验抽象沉淀供将来借鉴;还要学习 TCP/IP、 分布式系 统、数据结构和算法。
hiekay 2019-12-02 01:39:25 0 浏览量 回答数 0

问题

【精品问答】python技术1000问(1)

为了方便python开发者快速找到相关技术问题和答案,开发者社区策划了python技术1000问内容,包含最基础的如何学python、实践中遇到的技术问题、python面试等维度内容。 我们会以每天至少50条的...
问问小秘 2019-12-01 21:57:48 456417 浏览量 回答数 22

问题

常见问题排查步骤应该怎么做?

一、FeedBack接入后提示allowBackup相关错误排查步骤 1.遇到问题可以先通过 常见问题页进行关键字搜索,或者使用 云博士检索,一般都能命中相关的疑问。 2.检查AndroidManifest中...
猫饭先生 2019-12-01 22:06:23 994 浏览量 回答数 0

回答

父进程路径:/usr/sbin/crond URL 链接:http://185.181.10.234/e5db0e07c3d7be80v520... 与该 URL 有关联的漏洞:Drupal CVE-2018-7600 ,ElasticSearch Groovy 脚本远程代码执行漏洞 CVE-2015-1427 ,Hadoop Yarn REST API 未授权漏洞 ,WebLogic CVE-2017-10271 (PS:这个点我觉得并没很大用处,可能阿里云考虑的比较仔细) 所以我当时就很诧异,因为这个服务器是我司一个测试服务器,所以很多漏洞没更新,我也不怎么处理,被攻击也可能是常有的事,也无伤大雅。 然后第一反应就是,这不就是定时任务 crontab 跑了个东西,可能是访问了某个链接被阿里云检测到不合法了。 然后我就开始一顿查询定时任务,然后开始清理。 查询crontab执行命令:tail -f /var/log/cron 上面这个记录看着出了一些 nobody 的用户组进行了一个未知的定时任务执行记录。 然后 crontab -l 除了自己的业务定时任务并没看到这个所谓的 curl 了某个链接的定时脚本。然后我直接采取非常暴力的 rm 方法,把所有定时任务全部清除。 (第二天发现并没什么用。。。) 接着我就开始百度了(我搜了这个 :185.181.10.234/e5db0e07c3d7be80v520/init.sh),这个东西会不会有人遇到过,果然还是度娘靠谱,光一个链接就能捕捉到我要啥。然后我就看到了这篇文章: 《一个有趣的利用 redis 未授权访问漏洞进行挖矿的分析及防范》 https://www.freebuf.com/column/211777.html 简直是救命稻草,恍然大悟的我想起来测试服当时 redis 安装完确实没有怎么处理过,密码也没设置。 然后我开始设置 redis 的登陆密码和权限,怎么设置参考 https://www.cnblogs.com/tenny-peng/p/11543440.html 顺带一起清空且重置了一下 redis。 我就觉得这下应该万事大吉了。然后第三天老板依旧收到了来自阿里的警告信息。我郁闷了,啥玩意,为啥还可以,我不都设置密码了么。咋还执行呢? 想起前一天大佬提醒我要注意 ssh key 是否被人添加了免密登录的权限。其实我真的看了, 打开 vi authorized_keys 并没有任何东西。然后我顺带把其它 /root/.ssh/ 下的四个文件都翻了一遍。 才发现 known_hosts 文件中多了两个 IP 地址为新加坡的 ssh key , 我才明白为啥上面做了那一堆都没用了。 所以我解决上述问题的方法就是: 清空 crontab 未知的计划任务。 设置 redis 端口权限和账号密码(敲重点!) 清空未知的 ssh key
游客2q7uranxketok 2021-02-07 20:06:16 0 浏览量 回答数 0

问题

程序员必须掌握的核心算法有哪些?

程序员必须掌握的核心算法有哪些? 一、算法最最基础 1、时间复杂度 2、空间复杂度 一般最先接触的就是时间复杂度和空间复杂度的学习了,这两个概念以及如何计算,是必须学的,也是必...
问问小秘 2020-02-19 16:57:02 744 浏览量 回答数 4

问题

dubbo 的工作原理?注册中心挂了的问题?说说一次 rpc 请求的流程?【Java问答】47期

面试题 说一下的 dubbo 的工作原理?注册中心挂了可以继续通信吗?说说一次 rpc 请求的流程? 面试官心理分析 MQ、ES、Redis、Dubbo,上来先问你一些思考性的问...
剑曼红尘 2020-06-30 09:02:47 8 浏览量 回答数 1

回答

也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。 比如说,A服务器想调用B服务器上的一个方法: User getUserByName(String userName) 1、建立通信 首先要解决通讯的问题:即A机器想要调用B机器,首先得建立起通信连接。 主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。 通常这个连接可以是按需连接(需要调用的时候就先建立连接,调用结束后就立马断掉),也可以是长连接(客户端和服务器建立起连接之后保持长期持有,不管此时有无数据包的发送,可以配合心跳检测机制定期检测建立的连接是否存活有效),多个远程过程调用共享同一个连接。 2、服务寻址 要解决寻址的问题,也就是说,A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么。 通常情况下我们需要提供B机器(主机名或IP地址)以及特定的端口,然后指定调用的方法或者函数的名称以及入参出参等信息,这样才能完成服务的一个调用。 可靠的寻址方式(主要是提供服务的发现)是RPC的实现基石,比如可以采用Redis或者Zookeeper来注册服务等等。 2.1、从服务提供者的角度看: 当服务提供者启动的时候,需要将自己提供的服务注册到指定的注册中心,以便服务消费者能够通过服务注册中心进行查找; 当服务提供者由于各种原因致使提供的服务停止时,需要向注册中心注销停止的服务; 服务的提供者需要定期向服务注册中心发送心跳检测,服务注册中心如果一段时间未收到来自服务提供者的心跳后,认为该服务提供者已经停止服务,则将该服务从注册中心上去掉。 2.2、从调用者的角度看: 服务的调用者启动的时候根据自己订阅的服务向服务注册中心查找服务提供者的地址等信息; 当服务调用者消费的服务上线或者下线的时候,注册中心会告知该服务的调用者; 服务调用者下线的时候,则取消订阅。 3、网络传输 3.1、序列化 当A机器上的应用发起一个RPC调用时,调用方法和其入参等信息需要通过底层的网络协议如TCP传输到B机器,由于网络协议是基于二进制的,所有我们传输的参数数据都需要先进行序列化(Serialize)或者编组(marshal)成二进制的形式才能在网络中进行传输。然后通过寻址操作和网络传输将序列化或者编组之后的二进制数据发送给B机器。 **3.2、反序列化 ** 当B机器接收到A机器的应用发来的请求之后,又需要对接收到的参数等信息进行反序列化操作(序列化的逆操作),即将二进制信息恢复为内存中的表达方式,然后再找到对应的方法(寻址的一部分)进行本地调用(一般是通过生成代理Proxy去调用, 通常会有JDK动态代理、CGLIB动态代理、Javassist生成字节码技术等),之后得到调用的返回值。 4、服务调用 B机器进行本地调用(通过代理Proxy和反射调用)之后得到了返回值,此时还需要再把返回值发送回A机器,同样也需要经过序列化操作,然后再经过网络传输将二进制数据发送回A机器,而当A机器接收到这些返回值之后,则再次进行反序列化操作,恢复为内存中的表达方式,最后再交给A机器上的应用进行相关处理(一般是业务逻辑处理操作)。 通常,经过以上四个步骤之后,一次完整的RPC调用算是完成了,另外可能因为网络抖动等原因需要重试等。
剑曼红尘 2020-03-15 15:40:38 0 浏览量 回答数 0

回答

Rewin2003r2如何开放1433端口 如何打开1433端口 打开网络连接属性--高级--设置--例外--添加端口(输入端口号) windows203+sql   server   2000无法打开1433端口   1.如果你是win2003,那么一定要安装sql的补丁sp3a   检查你的SQL有没有打补丁,没有的话要打上补丁,检查的方法是在查询分析器中运行:   select   @@version   如果出来的版本号是8.00.760以下,则表明你未安装sp3的补丁,要装上.   SQL补丁下载:   全部补丁的位置   http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=9032f608-160a-4537-a2b6-4cb265b80766   注意下载后,执行的时候是解压,要在解压后的目录中执行setup.bat才是真正的安装   2.SQL   Server连接中的四个最常见错误:   一. "SQL   Server   不存在或访问被拒绝 "   这个是最复杂的,错误发生的原因比较多,需要检查的方面也比较多.   一般说来,有以下几种可能性:   1,SQL   Server名称或IP地址拼写有误   2,服务器端网络配置有误   3,客户端网络配置有误   要解决这个问题,我们一般要遵循以下的步骤来一步步找出导致错误的原因.   =============   首先,检查网络物理连接   =============   ping   <服务器IP地址/服务器名称>   如果   ping   <服务器IP地址>   不成功,说明物理连接有问题,这时候要检查硬件设备,如网卡,HUB,路由器等.   还有一种可能是由于客户端和服务器之间安装有防火墙软件造成的,比如   ISA   Server.防火墙软件可能会屏蔽对   ping,telnet   等的响应   因此在检查连接问题的时候,我们要先把防火墙软件暂时关闭,或者打开所有被封闭的端口.   如果ping   <服务器IP地址>   成功而,ping   <服务器名称>   失败   则说明名字解析有问题,这时候要检查   DNS   服务是否正常.   有时候客户端和服务器不在同一个局域网里面,这时候很可能无法直接使用服务器名称来标识该服务器,这时候我们可以使用HOSTS文件来进行名字解析,   具体的方法是:   1.使用记事本打开HOSTS文件(一般情况下位于C:\WINNT\system32\drivers\etc).   添加一条IP地址与服务器名称的对应记录,如:   172.168.10.24   myserver   2.或在   SQL   Server   的客户端网络实用工具里面进行配置,后面会有详细说明.   =============   其次,使用   telnet   命令检查SQL   Server服务器工作状态   =============   telnet   <服务器IP地址>   1433   如果命令执行成功,可以看到屏幕一闪之后光标在左上角不停闪动,这说明   SQL   Server   服务器工作正常,并且正在监听1433端口的   TCP/IP   连接   如果命令返回 "无法打开连接 "的错误信息,则说明服务器端没有启动   SQL   Server   服务,   也可能服务器端没启用   TCP/IP   协议,或者服务器端没有在   SQL   Server   默认的端口1433上监听.   =============接着,我们要到服务器上检查服务器端的网络配置,检查是否启用了命名管道.是否启用了   TCP/IP   协议等等   =============   可以利用   SQL   Server   自带的服务器网络使用工具来进行检查.   点击:程序   --   Microsoft   SQL   Server   --   服务器网络使用工具   打开该工具后,在 "常规 "中可以看到服务器启用了哪些协议.   一般而言,我们启用命名管道以及   TCP/IP   协议.   点中   TCP/IP   协议,选择 "属性 ",我们可以来检查   SQK   Server   服务默认端口的设置   一般而言,我们使用   SQL   Server   默认的1433端口.如果选中 "隐藏服务器 ",则意味着客户端无法通过枚举服务器来看到这台服务器,起到了保护的作用,但不影响连接.   =============   接下来我们要到客户端检查客户端的网络配置   =============   我们同样可以利用   SQL   Server   自带的客户端网络使用工具来进行检查,   所不同的是这次是在客户端来运行这个工具.   点击:程序   --   Microsoft   SQL   Server   --   客户端网络使用工具   打开该工具后,在 "常规 "项中,可以看到客户端启用了哪些协议.   一般而言,我们同样需要启用命名管道以及   TCP/IP   协议.   点击   TCP/IP   协议,选择 "属性 ",可以检查客户端默认连接端口的设置,该端口必须与服务器一致.   单击 "别名 "选项卡,还可以为服务器配置别名.服务器的别名是用来连接的名称,   连接参数中的服务器是真正的服务器名称,两者可以相同或不同.别名的设置与使用HOSTS文件有相似之处.   通过以上几个方面的检查,基本上可以排除第一种错误.   -----------------------------------------------------------------------------   二. "无法连接到服务器,用户xxx登陆失败 "   该错误产生的原因是由于SQL   Server使用了 "仅   Windows "的身份验证方式,   因此用户无法使用SQL   Server的登录帐户(如   sa   )进行连接.解决方法如下所示:   1.在服务器端使用企业管理器,并且选择 "使用   Windows   身份验证 "连接上   SQL   Server   在企业管理器中   --右键你的服务器实例(就是那个有绿色图标的)   --编辑SQL   Server注册属性   --选择 "使用windows身份验证 "   2.展开 "SQL   Server组 ",鼠标右键点击SQL   Server服务器的名称,选择 "属性 ",再选择 "安全性 "选项卡   3.在 "身份验证 "下,选择 "SQL   Server和   Windows   ".   4.重新启动SQL   Server服务.   在以上解决方法中,如果在第   1   步中使用 "使用   Windows   身份验证 "连接   SQL   Server   失败,   那就通过修改注册表来解决此问题:   1.点击 "开始 "- "运行 ",输入regedit,回车进入注册表编辑器   2.依次展开注册表项,浏览到以下注册表键:   [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer]   3.在屏幕右方找到名称 "LoginMode ",双击编辑双字节值   4.将原值从1改为2,点击 "确定 "   5.关闭注册表编辑器   6.重新启动SQL   Server服务.   此时,用户可以成功地使用sa在企业管理器中新建SQL   Server注册,   但是仍然无法使用Windows身份验证模式来连接SQL   Server.   这是因为在   SQL   Server   中有两个缺省的登录帐户:   BUILTIN\Administrators   <机器名> \Administrator   被删除.   要恢复这两个帐户,可以使用以下的方法:   1.打开企业管理器,展开服务器组,然后展开服务器   2.展开 "安全性 ",右击 "登录 ",然后单击 "新建登录 "   3.在 "名称 "框中,输入   BUILTIN\Administrators   4.在 "服务器角色 "选项卡中,选择 "System   Administrators "   5.点击 "确定 "退出   6.使用同样方法添加   <机器名> \Administrator   登录.   说明:   以下注册表键:   HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\LoginMode   的值决定了SQL   Server将采取何种身份验证模式.   1.表示使用 "Windows   身份验证 "模式   2.表示使用混合模式(Windows   身份验证和   SQL   Server   身份验证).   -----------------------------------------------------------------------------   三.提示连接超时   如果遇到第三个错误,一般而言表示客户端已经找到了这台服务器,并且可以进行连接,   不过是由于连接的时间大于允许的时间而导致出错.   这种情况一般会发生在当用户在Internet上运行企业管理器来注册另外一台同样在Internet上的服务器,   并且是慢速连接时,有可能会导致以上的超时错误.有些情况下,由于局域网的网络问题,也会导致这样的错误.   要解决这样的错误,可以修改客户端的连接超时设置.   默认情况下,通过企业管理器注册另外一台SQL   Server的超时设置是   4   秒,   而查询分析器是   15   秒(这也是为什么在企业管理器里发生错误的可能性比较大的原因).   具体步骤为:   企业管理器中的设置:   1.在企业管理器中,选择菜单上的 "工具 ",再选择 "选项 "   2.在弹出的 "SQL   Server企业管理器属性 "窗口中,点击 "高级 "选项卡   3.在 "连接设置 "下的 "登录超时(秒) "右边的框中输入一个比较大的数字,如   20.   查询分析器中的设置:   工具   --   选项   --   连接   --   将登录超时设置为一个较大的数字   ---------------------------------------------------------------------------------   四.大部分机都用Tcp/ip才能成功,有次我发现用Named   Pipes才可以?   回复人:   leimin(黄山光明顶)   这是因为在WINDOWS   2000以后的操作系统中,MS为解决SQL   SERVER的安全问题将TCP/IP配置   为SQLSERVER的默认连接协议,你可以在CLIENT   NETWORK   UTILITY中看到TCP/IP和NAME   PIPE   的顺序。   你也可以在:   [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SuperSocketNetLib]   "ProtocolOrder "=hex(7):74,00,63,00,70,00,00,00,00,00   看到默认的协议。   2.怎么在程序中更改Named   Pipes   ,   Tcp/ip   ,其sql语句怎么写?   你可以在上面提到的注册表的位置修改:   CLIENT端:   [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SuperSocketNetLib]   "ProtocolOrder "=hex(7):74,00,63,00,70,00,00,00,00,00   SERVER端:   [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\SuperSocketNetLib]   "ProtocolOrder "=hex(7):74,00,63,00,70,00,00,00,00,00   SQL中,连接的配置就这两个方面   SQL   Server服务器--开始--程序--Microsoft   SQL   Server   --服务器网络实用工具   --启用   WinSock代理   --代理地址:(sqlserver服务器IP)   --代理端口--1433   ---确定   客户端   开始--程序--Microsoft   SQL   Server--客户端网络实用工具   --别名--添加   --网络库选择 "tcp/ip "--服务器别名输入SQL服务器名   --连接参数--服务器名称中输入SQL服务器ip地址   --如果你修改了SQL的端口,取消选择 "动态决定端口 ",并输入对应的端口号   也有人说:打SQL   的sp3补丁后就自动打开了
superwoman 2019-12-01 23:46:04 0 浏览量 回答数 0

回答

以前上网很快,最近1周网速突然很慢,我是3个人共用一个路由器的,以前3个人用时也是很快。现在是我看视频很卡,用了优化大师优化,c盘文件及桌面文件都清理了,用360也清理了垃圾文件,用小红伞杀毒也没杀出病毒,就是老样子。现在两个人用一个,也是很慢,到半夜了在搜狐视频或是酷六什么那看电影,只剩我一个人在用,还是卡。 请问高手能帮我诊断下怎么回事,或是怎么设置下改变下状况。另一个人也是发现网速慢了,我们都是一个样子,可能是被盗了吗? 我用360查看网络连接,system id process 的连接很多,显示是没有连接上,状态是等待,都是端口80,目标归属地什么北京联通,大连联通,深圳联通的,有7个左右,我qq也没开啊,想结束也结束不了,只是在迅雷看看里看电影,没有装他的插件。把它关了还是有。向高手请教?插件只有搜狗输入法,迅雷,360,迅雷看看没有其他的 " 网速变慢的原因有很多可能,比如网络本身的问题、网卡硬件问题,有或者是系统问题等等。可以通过其他联网设备确认下是否有网速变慢的情况;如果网络本身没有问题(其他设备可以正常连接),问题就出现电脑本身: 1,、疑难解答 可以先试试更新网卡驱动,若无效,我们可以利用系统自身提供的【疑难解答】功能来寻求解决。直接搜索进入【疑难解答】然后点击右侧的对应项目,选择【运行疑难解答】,按照向导提示进行操作即可,看是否能够解决网络连接问题。 <img src=""https://gss0.baidu.com/-fo3dSag_xI4khGko9WTAnF6hhy/zhidao/wh%3D600%2C800/sign=f415cd6cda3f8794d3aa4028e22b22cc/a6efce1b9d16fdfac901e83aba8f8c5495ee7bf0.jpg""> <img src=""https://gss0.baidu.com/-Po3dSag_xI4khGko9WTAnF6hhy/zhidao/wh%3D600%2C800/sign=1695c9ff00f41bd5da06e0f261eaadf3/f2deb48f8c5494ee9b9421cd23f5e0fe98257eab.jpg""> 2、网络重置 上述均不能解决的话,最后可通过进行网络重置来彻底解决。路径:【开始】—【设置】—【网络和Internet】—【状态】,在右侧列表中找到【网络重置】并点击,按提示完成操作即可。 <img src=""https://gss0.baidu.com/-Po3dSag_xI4khGko9WTAnF6hhy/zhidao/wh%3D600%2C800/sign=e6034daa9c58d109c4b6a1b4e168e087/11385343fbf2b211a844ab9ac48065380dd78eff.jpg""> 另外,在有限的硬件条件下,想让现有的网速能够快一些,具体可以参考以下步骤: 步骤1. Win+R组合键后输入gpedit.msc进入组策略编辑器,依次进入“计算机配置-Windows设置”后,再右侧找到“基于策略的Qos”的这个选项。 <img src=""https://gss0.baidu.com/-Po3dSag_xI4khGko9WTAnF6hhy/zhidao/wh%3D600%2C800/sign=c08ee009a564034f0f98ca009ff35509/a71ea8d3fd1f41341c7f2baa2b1f95cad0c85e9d.jpg""> 步骤2. 在“基于策略的Qos”上点击鼠标右键,选择“高级QoS设置”,在入站TCP流量选项卡中,勾选”制定入站TCP吞吐量级别“,选择最后那个”级别3“。 <img src=""https://gss0.baidu.com/9fo3dSag_xI4khGko9WTAnF6hhy/zhidao/wh%3D600%2C800/sign=f340223fb8fd5266a77e34129b28bb13/e1fe9925bc315c604623453b83b1cb13485477ab.jpg""> 注意的:如果在更改完设置后发现上网时系统出现假死、卡顿等问题,可以把上面的“制定入站TCP吞吐量级别“设置调整到“级别2”,减少数据处理对系统硬件的压力(内存小于4GB,则建议使用默认最小吞吐量)。 “高级QoS设置“是什么呢? 通过高级服务质量 (QoS) 设置,您可以管理带宽使用以及计算机处理应用程序和服务设置的 DSCP 标记(而不是组策略设置的标记)的方式。高级 QoS 设置仅可在计算机级别应用,而 QoS 策略在计算机级别和用户级别均可应用。 若要更改吞吐量级别,选中“指定入站 TCP 吞吐量级别”复选框,然后根据下表选择吞吐量级别。吞吐量级别可以等于或小于最大值,具体取决于网络条件。 <img src=""https://gss0.baidu.com/9vo3dSag_xI4khGko9WTAnF6hhy/zhidao/wh%3D600%2C800/sign=eea0cfe33bfae6cd0ce1a3673f83231c/ca1349540923dd542fc589bcdf09b3de9d8248ab.jpg"">" 一、网络自身问题 您想要连接的目标网站所在的服务器带宽不足或负载过大。处理办法很简单,请换个时间段再上或者换个目标网站。 二、网线问题导致网速变慢 我们知道,双绞线是由四对线按严格的规定紧密地绞和在一起的,用来减少串扰和背景噪音的影响。同时,在T568A标准和T568B标准中仅使用了双绞线的 1、2和3、6四条线,其中,1、2用于发送,3、6用于接收,而且1、2必须来自一个绕对,3、6必须来自一个绕对。只有这样,才能最大限度地避免串扰,保证数据传输。本人在实践中发现不按正确标准(T586A、T586B)制作的网线,存在很大的隐患。表现为:一种情况是刚开始使用时网速就很慢;另一种情况则是开始网速正常,但过了一段时间后,网速变慢。后一种情况在台式电脑上表现非常明显,但用笔记本电脑检查时网速却表现为正常。对于这一问题本人经多年实践发现,因不按正确标准制作的网线引起的网速变慢还同时与网卡的质量有关。一般台式计算机的网卡的性能不如笔记本电脑的,因此,在用交换法排除故障时,使用笔记本电脑检测网速正常并不能排除网线不按标准制作这一问题的存在。我们现在要求一律按T586A、T586B标准来压制网线,在检测故障时不能一律用笔记本电脑来代替台式电脑。 三、网络中存在回路导致网速变慢 当网络涉及的节点数不是很多、结构不是很复杂时,这种现象一般很少发生。但在一些比较复杂的网络中,经常有多余的备用线路,如无意间连上时会构成回路。比如网线从网络中心接到计算机一室,再从计算机一室接到计算机二室。同时从网络中心又有一条备用线路直接连到计算机二室,若这几条线同时接通,则构成回路,数据包会不断发送和校验数据,从而影响整体网速。这种情况查找比较困难。为避免这种情况发生,要求我们在铺设网线时一定养成良好的习惯:网线打上明显的标签,有备用线路的地方要做好记载。当怀疑有此类故障发生时,一般采用分区分段逐步排除的方法。 四、网络设备硬件故障引起的广播风暴而导致网速变慢 作为发现未知设备的主要手段,广播在网络中起着非常重要的作用。然而,随着网络中计算机数量的增多,广播包的数量会急剧增加。当广播包的数量达到30%时,网络的传输效率将会明显下降。当网卡或网络设备损坏后,会不停地发送广播包,从而导致广播风暴,使网络通信陷于瘫痪。因此,当网络设备硬件有故障时也会引起网速变慢。当怀疑有此类故障时,首先可采用置换法替换集线器或交换机来排除集线设备故障。如果这些设备没有故障,关掉集线器或交换机的电源后,DOS下用 “Ping”命令对所涉及计算机逐一测试,找到有故障网卡的计算机,更换新的网卡即可恢复网速正常。网卡、集线器以及交换机是最容易出现故障引起网速变慢的设备。 五、网络中某个端口形成了瓶颈导致网速变慢 实际上,路由器广域网端口和局域网端口、交换机端口、集线器端口和服务器网卡等都可能成为网络瓶颈。当网速变慢时,我们可在网络使用高峰时段,利用网管软件查看路由器、交换机、服务器端口的数据流量;也可用 Netstat命令统计各个端口的数据流量。据此确认网络数据流通瓶颈的位置,设法增加其带宽。具体方法很多,如更换服务器网卡为100M或1000M、安装多个网卡、划分多个VLAN、改变路由器配置来增加带宽等,都可以有效地缓解网络瓶颈,可以最大限度地提高数据传输速度。 六、蠕虫病毒的影响导致网速变慢 通过E-mail散发的蠕虫病毒对网络速度的影响越来越严重,危害性极大。这种病毒导致被感染的用户只要一上网就不停地往外发邮件,病毒选择用户个人电脑中的随机文档附加在用户机子的通讯簿的随机地址上进行邮件发送。成百上千的这种垃圾邮件有的排着队往外发送,有的又成批成批地被退回来堆在服务器上。造成个别骨干互联网出现明显拥塞,网速明显变慢,使局域网近于瘫痪。因此,我们必须及时升级所用杀毒软件;计算机也要及时升级、安装系统补丁程序,同时卸载不必要的服务、关闭不必要的端口,以提高系统的安全性和可靠性。 七、防火墙的过多使用 防火墙的过多使用也可导致网速变慢,处理办法不必多说,卸载下不必要的防火墙只保留一个功能强大的足以。 八、系统资源不足 您可能加载了太多的运用程序在后台运行,请合理的加载软件或删除无用的程序及文件,将资源空出,以达到提高网速的目的。 您好,如您的宽带出现故障,可关注“中国联通”微信公众号,点击“客户服务>宽带报障>常见故障指引”,查看对应故障的处理方式。 如仍无法解决,可通过以下方式自助报障: 【方式一】关注“中国联通”微信公众号,点击“客户服务>宽带报障>在线报障”; 【方式二】登录中国联通手机营业厅APP,点击“服务>宽带>宽带办理服务>宽带报障”。 1...用360安全卫士查一下启动项,可能是垃圾插件太多了。现在P2P插件很吸血的。优化一下。 2...把3台电脑恢复系统,还有问题就是线路的问题了。 你把路由器 关掉重启 或者 重装 网卡驱动 试试吧。 最好还是重装。 重装还不好使 就是 宽带问题。
保持可爱mmm 2019-12-02 02:14:41 0 浏览量 回答数 0

回答

回 2楼(kideny) 的帖子 ------------------------- 回 1楼(辉煌01) 的帖子 ------------------------- 回 8楼(dns2008) 的帖子 谢谢 ------------------------- 连载二之自定义镜像和快照使用篇             目前很多云服务器的名字不知道什么意思,实例啊,云服务器啊,可用区啊,快照啊,需要学习下阿里云服务器的名词,可以参考阿里云服务器名词解释(参考http://bbs.aliyun.com/read/166198.html?spm=0.0.0.0.rh1gTy)           在买了一台云服务器后配置好环境后,希望能否使用这台云服务器配置好环境开通多开通2台云服务器,可以参考同一帐号地域下老实例数据复制到新开实例的方法,使用自定义镜像和快照来实现(参考http://bbs.aliyun.com/read/166662.html?spm=0.0.0.0.rh1gTy) ------------------------- 连载三之0M带宽实例使用篇     真不凑巧,买了一台0M带宽机器,发现没有公网IP地址,只有内网IP地址,不能外网远程,不知道怎么使用,可以参考0M带宽实例管理方法http://bbs.aliyun.com/read/164224.html?spm=0.0.0.0.rh1gTy;如果需要公网IP地址的话,可以通过升级公网带宽来解决,升级到非0M带宽后,需要控制台重启云服务器才能获取一个公网IP地址,0M带宽升级教程:http://bbs.aliyun.com/read/163900.html ------------------------- Re:小白用户的ECS使用分享【持续连载中】 连载四之独立云磁盘篇      买了2台同一地域的实例后,需要将1台实例A数据盘的数据转移到另一台实例B,可是普通云磁盘卸载不了,怎么办?可以购买独立云磁盘,利用独立云磁盘同一个地域可用区内可以自由卸载和挂载的特性,首先将独立云磁盘挂载到实例A,然后将数据存放到独立云磁盘,从实例A卸载独立云磁盘,然后将独立云磁盘挂载到实例B,完成数据转移。 参考我为什么要购买独立云磁盘?--谈独立云磁盘的使用场景(http://bbs.aliyun.com/read/169945.html?spm=0.0.0.0.EzouGX)       今天突然收到了一条阿里云服务器宕机迁移的短信,不知道什么是宕机迁移,宕机迁移了该怎么办? 可以参考神马是宕机迁移??---宕机迁移解惑(http://bbs.aliyun.com/read/170413.html?spm=0.0.0.0.EzouGX) ------------------------- 连载五之 ECS API操作篇        最近听说ECS API操作云服务器比较方便,不知道ECS API怎么用?ECS API文档下载(下载参考http://help.aliyun.com/view/11108189_13730407.html?spm=5176.7376125.1997918129.6.2ca2P3 )        而且我们提供了ECS SDK 开发包(下载参考http://help.aliyun.com/view/11108189_13730435.html?spm=5176.7376125.1997918129.5.2ca2P3 ),目前ECS API是有一些产品业务限制(参考http://help.aliyun.com/view/11108189_13730408.html?spm=5176.7376125.1997918129.4.2ca2P3 )        看完了这些,怎么操作API呢? 我们提供更加简单的工具教程,漫游ECS API,玩转ECS API (参考http://bbs.aliyun.com/read/156002.html?spm=0.0.0.0.rB2OVV) ------------------------- 回 21楼(trcher) 的帖子 大家一起多分享 ------------------------- 连载六之 图形化界面篇   使用Linux云服务器,不喜欢黑乎乎的命令行,还是习惯图形化管理界面怎么办?自助安装vnc-server图形化管理界面参考http://help.aliyun.com/view/11108189_13438669.html?spm=5176.7224913.1997283765.4.4QxOak  ,有时候发现Linux服务器时间莫名跑快,怎么办?可以参考如下脚本进行校准Linux云服务器时间跑的快问题http://help.aliyun.com/view/11108189_13438686.html?spm=5176.7224913.1997283765.7.tIwgVt ------------------------- 连载七之ftp配置篇     刚买了服务器,需要配置ftp工具传输本地数据到云服务器上,小白用户不会配置怎么办?手把手教你怎么配置。       Widdows 2003 安装FTP参考http://help.aliyun.com/view/11108189_13435492.html?spm=5176.7224457.1997282817.7.uslTnc        Widows2008安装ftp参考http://help.aliyun.com/view/11108189_13435495.html?spm=5176.7224457.1997282817.5.uslTnc        Linux服务器安装ftp参考http://help.aliyun.com/view/11108189_13435411.html?spm=5176.7224473.1997282753.4.TNfWAA
qilu 2019-12-01 23:24:51 0 浏览量 回答数 0

问题

OSS如何实现静态网站托管?

用户可以基于OSS搭建一个静态网站。本文介绍了如何从申请域名开始,基于OSS搭建一个简单的静态网站。主要的步骤是: 申请一个域名。开通OSS并创建Bucket。开通OSS的静态网站托管功能。使用自定义域名访问OS...
青衫无名 2019-12-01 21:38:57 9056 浏览量 回答数 4

问题

【算法】五分钟算法小知识:学习数据结构和算法的框架思维

这是好久之前的一篇文章「学习数据结构和算法的框架思维」的修订版。之前那篇文章收到广泛好评,没看过也没关系,这篇文章会涵盖之前的所有内容,并且会举很多代码的实例,教你如何使用框架思维。 ...
游客ih62co2qqq5ww 2020-04-17 09:56:03 10 浏览量 回答数 1

回答

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 [编辑本段]基本概念 * 若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数(Hash function),按这个思想建立的表为散列表。 * 对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称冲突。具有相同函数值的关键字对该散列函数来说称做同义词。综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象” 作为记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。 * 若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数(Uniform Hash function),这就是使关键字经过散列函数得到一个“随机的地址”,从而减少冲突。 [编辑本段]常用的构造散列函数的方法 散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位ǐ 1. 直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a•key + b,其中a和b为常数(这种散列函数叫做自身函数) 2. 数字分析法 3. 平方取中法 4. 折叠法 5. 随机数法 6. 除留余数法:取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。即 H(key) = key MOD p, p<=m。不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。对p的选择很重要,一般取素数或m,若p选的不好,容易产生同义词。 [编辑本段]处理冲突的方法 1. 开放寻址法:Hi=(H(key) + di) MOD m, i=1,2,…, k(k<=m-1),其中H(key)为散列函数,m为散列表长,di为增量序列,可有下列三种取法: 1. di=1,2,3,…, m-1,称线性探测再散列; 2. di=1^2, (-1)^2, 2^2,(-2)^2, (3)^2, …, ±(k)^2,(k<=m/2)称二次探测再散列; 3. di=伪随机数序列,称伪随机探测再散列。 == 2. 再散列法:Hi=RHi(key), i=1,2,…,k RHi均是不同的散列函数,即在同义词产生地址冲突时计算另一个散列函数地址,直到冲突不再发生,这种方法不易产生“聚集”,但增加了计算时间。 3. 链地址法(拉链法) 4. 建立一个公共溢出区 [编辑本段]查找的性能分析 散列表的查找过程基本上和造表过程相同。一些关键码可通过散列函数转换的地址直接找到,另一些关键码在散列函数得到的地址上产生了冲突,需要按处理冲突的方法进行查找。在介绍的三种处理冲突的方法中,产生冲突后的查找仍然是给定值与关键码进行比较的过程。所以,对散列表查找效率的量度,依然用平均查找长度来衡量。 查找过程中,关键码的比较次数,取决于产生冲突的多少,产生的冲突少,查找效率就高,产生的冲突多,查找效率就低。因此,影响产生冲突多少的因素,也就是影响查找效率的因素。影响产生冲突多少有以下三个因素: 1. 散列函数是否均匀; 2. 处理冲突的方法; 3. 散列表的装填因子。 散列表的装填因子定义为:α= 填入表中的元素个数 / 散列表的长度 α是散列表装满程度的标志因子。由于表长是定值,α与“填入表中的元素个数”成正比,所以,α越大,填入表中的元素较多,产生冲突的可能性就越大;α越小,填入表中的元素较少,产生冲突的可能性就越小。 实际上,散列表的平均查找长度是装填因子α的函数,只是不同处理冲突的方法有不同的函数。 了解了hash基本定义,就不能不提到一些著名的hash算法,MD5 和 SHA-1 可以说是目前应用最广泛的Hash算法,而它们都是以 MD4 为基础设计的。那么他们都是什么意思呢? 这里简单说一下: (1) MD4 MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年设计的,MD 是 Message Digest 的缩写。它适用在32位字长的处理器上用高速软件实现--它是基于 32 位操作数的位操作来实现的。 (2) MD5 MD5(RFC 1321)是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4 相同。MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好 (3) SHA-1 及其他 SHA1是由NIST NSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1 设计时基于和MD4相同原理,并且模仿了该算法。 那么这些Hash算法到底有什么用呢? Hash算法在信息安全方面的应用主要体现在以下的3个方面: (1) 文件校验 我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。 MD5 Hash算法的"数字指纹"特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。 (2) 数字签名 Hash 算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。 对 Hash 值,又称"数字摘要"进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点。 (3) 鉴权协议 如下的鉴权协议又被称作挑战--认证模式:在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法。 MD5、SHA1的破解 2004年8月17日,在美国加州圣芭芭拉召开的国际密码大会上,山东大学王小云教授在国际会议上首次宣布了她及她的研究小组近年来的研究成果——对MD5、HAVAL-128、MD4和RIPEMD等四个著名密码算法的破译结果。 次年二月宣布破解SHA-1密码。 [编辑本段]实际应用 以上就是一些关于hash以及其相关的一些基本预备知识。那么在emule里面他具体起到什么作用呢? 大家都知道emule是基于P2P (Peer-to-peer的缩写,指的是点对点的意思的软件), 它采用了"多源文件传输协议”(MFTP,the Multisource FileTransfer Protocol)。在协议中,定义了一系列传输、压缩和打包还有积分的标准,emule 对于每个文件都有md5-hash的算法设置,这使得该文件独一无二,并且在整个网络上都可以追踪得到。 什么是文件的hash值呢? MD5-Hash-文件的数字文摘通过Hash函数计算得到。不管文件长度如何,它的Hash函数计算结果是一个固定长度的数字。与加密算法不同,这一个Hash算法是一个不可逆的单向函数。采用安全性高的Hash算法,如MD5、SHA时,两个不同的文件几乎不可能得到相同的Hash结果。因此,一旦文件被修改,就可检测出来。 当我们的文件放到emule里面进行共享发布的时候,emule会根据hash算法自动生成这个文件的hash值,他就是这个文件唯一的身份标志,它包含了这个文件的基本信息,然后把它提交到所连接的服务器。当有他人想对这个文件提出下载请求的时候, 这个hash值可以让他人知道他正在下载的文件是不是就是他所想要的。尤其是在文件的其他属性被更改之后(如名称等)这个值就更显得重要。而且服务器还提供了,这个文件当前所在的用户的地址,端口等信息,这样emule就知道到哪里去下载了。 一般来讲我们要搜索一个文件,emule在得到了这个信息后,会向被添加的服务器发出请求,要求得到有相同hash值的文件。而服务器则返回持有这个文件的用户信息。这样我们的客户端就可以直接的和拥有那个文件的用户沟通,看看是不是可以从他那里下载所需的文件。 对于emule中文件的hash值是固定的,也是唯一的,它就相当于这个文件的信息摘要,无论这个文件在谁的机器上,他的hash值都是不变的,无论过了多长时间,这个值始终如一,当我们在进行文件的下载上传过程中,emule都是通过这个值来确定文件。 那么什么是userhash呢? 道理同上,当我们在第一次使用emule的时候,emule会自动生成一个值,这个值也是唯一的,它是我们在emule世界里面的标志,只要你不卸载,不删除config,你的userhash值也就永远不变,积分制度就是通过这个值在起作用,emule里面的积分保存,身份识别,都是使用这个值,而和你的id和你的用户名无关,你随便怎么改这些东西,你的userhash值都是不变的,这也充分保证了公平性。其实他也是一个信息摘要,只不过保存的不是文件信息,而是我们每个人的信息。 那么什么是hash文件呢? 我们经常在emule日志里面看到,emule正在hash文件,这里就是利用了hash算法的文件校验性这个功能了,文章前面已经说了一些这些功能,其实这部分是一个非常复杂的过程,目前在ftp,bt等软件里面都是用的这个基本原理,emule里面是采用文件分块传输,这样传输的每一块都要进行对比校验,如果错误则要进行重新下载,这期间这些相关信息写入met文件,直到整个任务完成,这个时候part文件进行重新命名,然后使用move命令,把它传送到incoming文件里面,然后met文件自动删除,所以我们有的时候会遇到hash文件失败,就是指的是met里面的信息出了错误不能够和part文件匹配,另外有的时候开机也要疯狂hash,有两种情况一种是你在第一次使用,这个时候要hash提取所有文件信息,还有一种情况就是上一次你非法关机,那么这个时候就是要进行排错校验了。 关于hash的算法研究,一直是信息科学里面的一个前沿,尤其在网络技术普及的今天,他的重要性越来越突出,其实我们每天在网上进行的信息交流安全验证,我们在使用的操作系统密钥原理,里面都有它的身影,特别对于那些研究信息安全有兴趣的朋友,这更是一个打开信息世界的钥匙,他在hack世界里面也是一个研究的焦点。 一般的线性表、树中,记录在结构中的相对位置是随机的即和记录的关键字之间不存在确定的关系,在结构中查找记录时需进行一系列和关键字的比较。这一类查找方法建立在“比较”的基础上,查找的效率与比较次数密切相关。理想的情况是能直接找到需要的记录,因此必须在记录的存储位置和它的关键字之间建立一确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应。因而查找时,只需根据这个对应关系f找到给定值K的像f(K)。若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上,由此不需要进行比较便可直接取得所查记录。在此,称这个对应关系f为哈希函数,按这个思想建立的表为哈希表(又称为杂凑法或散列表)。 哈希表不可避免冲突(collision)现象:对不同的关键字可能得到同一哈希地址 即key1≠key2,而hash(key1)=hash(key2)。具有相同函数值的关键字对该哈希函数来说称为同义词(synonym)。 因此,在建造哈希表时不仅要设定一个好的哈希函数,而且要设定一种处理冲突的方法。可如下描述哈希表:根据设定的哈希函数H(key)和所选中的处理冲突的方法,将一组关键字映象到一个有限的、地址连续的地址集(区间)上并以关键字在地址集中的“象”作为相应记录在表中的存储位置,这种表被称为哈希表。 对于动态查找表而言,1) 表长不确定;2)在设计查找表时,只知道关键字所属范围,而不知道确切的关键字。因此,一般情况需建立一个函数关系,以f(key)作为关键字为key的录在表中的位置,通常称这个函数f(key)为哈希函数。(注意:这个函数并不一定是数学函数) 哈希函数是一个映象,即:将关键字的集合映射到某个地址集合上,它的设置很灵活,只要这个地址集合的大小不超出允许范围即可。 现实中哈希函数是需要构造的,并且构造的好才能使用的好。 用途:加密,解决冲突问题。。。。 用途很广,比特精灵中就使用了哈希函数,你可 以自己看看。 具体可以学习一下数据结构和算法的书。 [编辑本段]字符串哈希函数 (著名的ELFhash算法) int ELFhash(char *key) return h%MOD; }
晚来风急 2019-12-02 01:22:24 0 浏览量 回答数 0

问题

【archsummit 回顾】阿里云章文嵩:构建大型云计算平台分布式技术的实践

演讲人:章文嵩博士,阿里集团的高级研究员与副总裁,主要负责基础核心软件研发和云计算产品研发、推进网络软硬件方面的性能优化、搭建下一代高可扩展低碳低成本电子商务基础设施。他也是开放源码及 Linux内...
云课堂 2019-12-01 21:03:36 14448 浏览量 回答数 9

回答

感觉你根本没理解什么是maven。。。我使用中根本没遇到你提到的疑问 jsp编译class是什么鬼。。没看懂,JSP不需要什么编译,这是容器的事情。。就算是你编译好了,你也脱离不了servlet容器,没多大意义。 至于你说的,发布前要把js minify,请问用mvn怎么做? 这根本就不叫事儿。maven搭配NPM和最热的vue前端框架整合在一起搞事,也不算啥事。Java开发的系统和工具,如果连这点扩展性都不到,还配叫Java么,Java还配稳坐编程语言老大的位置么。。你说的东西maven当然支持啦!,看示例配置: <!-- yuicompressor --> <plugin> <groupId>net.alchim31.maven</groupId> <artifactId>yuicompressor-maven-plugin</artifactId> <version>1.3.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>compress</goal> </goals> <configuration> <includes> <include>js/*.js</include> <include>css/*.css</include> <include>activity/**/*.css</include> </includes> <excludes> <exclude>**/*.min.js</exclude> <exclude>**/*-min.js</exclude> </excludes> <encoding>utf8</encoding> <failOnWarning>false</failOnWarning> <nosuffix>true</nosuffix> <force>true</force> <removeIncluded>true</removeIncluded> <linebreakpos>-1</linebreakpos> </configuration> </execution> </executions> </plugin> ant转maven不是分分钟的事情么,这种事情我干的不少,传统的没有任何包管理的全扔lib下的项目,200多个jar,我一天时间就能搞定。maven和某个号称最好的语言的包管理不同,maven对代码没有任何侵入性,代码一行改动都不需要,唯一需要的就是目录结构做轻微调整(甚至不调整也可以)。不存在你说的什么“重写”,真正的0侵入,反正就是不涉及任何代码修改,只需要配置下maven的POM而已。 maven本来就支持自定义目录结构啥的,只不过约定在先,你要不按你约定来也可以啊。 <build> <sourceDirectory>${basedir}/src/main/java</sourceDirectory> <scriptSourceDirectory>${basedir}/src/main/scripts</scriptSourceDirectory> <testSourceDirectory>${basedir}/src/test/java</testSourceDirectory> <outputDirectory>${basedir}/target/classes</outputDirectory> <testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory> ... </build> 如果系统中有很多jar已经招不到maven坐标了,自己给它安一个坐标,上传到私服就能搞定。我在12年之前写的Java代码都是传统方式,没有任何依赖管理。12年后,老项目转maven,轻轻松松毫无障碍。######无论js minify还是jsp编译成class,我都是举例子而已,真正想问的是mvn对编译流程的支持,除了写插件还有哪些?当然你说mvn可以嵌入ant,那我现在ant一套流程都下来了,只是没有mvn那么多功能,感觉没必要换。######你刻意没谈jsp编译成class,证明你不熟,你熟悉js minify,所以给了个插件的例子。我可不可以理解成mvn自定义编译流程必须学怎么写mvn插件?没法像Ant一样把编译流程也可以xml脚本化?######先不看具体内容,补充一下,我说的重写是重写build不是项目,现在项目用ivy管理依赖,并非放到lib什么的###### 要使用Maven最好还是搭建一个Nexus   这样也是为了长远考虑 当然增加dependency的时候也容易些  jsp编译class 这个问题  我感觉你对于JSP 以及 Servlet的生命周期理解的有问题  Maven管理子模块什么的  还是很方便的吧  无非就是多加一些 ######回复 @ManderSY : 我只是拿jsp做个例子而已,而且你这样回答算是逃避问题。如果你改的不是jsp而是controller呢?重启项目发布这个问题我不太想发散开来讨论。总之就是有办法自动化实现平滑重启发布。如果你纠结jsp,那我说个别的方便你理解,发布前要把js minify,请问用mvn怎么做?######回复 @乌龟壳 : 可以接受完全重写的话 完全可以采取前后端分离来做 就没这些问题了######回复 @乌龟壳 : 我个人觉着差别还是很大的 重启服务的成本 以及风险明显比那个高很多######回复 @ManderSY : 而且我只是拿jsp举例方便理解而已。项目的模板引擎不是jsp,而且要打包js那些东西,要干的事情很多。######回复 @ManderSY : 对于一个上线要走流程的环境,预编译jsp只能说影响不大。###### maven的哲学是Convention over Configuration ,建议还是按照maven的标准来,不然还不如就继续用ant,这样的成本还低一些######它的标准要遵守可以,但始终问题要解决,预编译jsp只是我抽象出来方便大家理解的场景而已,实际要做的是真正不预编译跑不起来的功能。###### @南湖船老大 ###### @南湖船老大 我想再明确地说一下场景,不是具体的jsp编译成class什么的,比如我手头上有一个自己开发的模板引擎,我需要 第一步把模板引擎编译出来 第二步用这个编译出来的模板引擎编译*.tmpl文件成java 第三步把java编译成class打包成jar 第四部把jar放到最终的目录 我想咨询的是,类似这些需要自定义化的逻辑,mvn大概是怎样支持的,我只需要一些关键字就好了。比如mvn是否支持直接调用jar,是否可以像ant一样配置一些简单的逻辑等。###### 引用来自“乌龟壳”的评论 @南湖船老大 我想再明确地说一下场景,不是具体的jsp编译成class什么的,比如我手头上有一个自己开发的模板引擎,我需要 第一步把模板引擎编译出来 第二步用这个编译出来的模板引擎编译*.tmpl文件成java 第三步把java编译成class打包成jar 第四部把jar放到最终的目录 我想咨询的是,类似这些需要自定义化的逻辑,mvn大概是怎样支持的,我只需要一些关键字就好了。比如mvn是否支持直接调用jar,是否可以像ant一样配置一些简单的逻辑等。 当然不是问题啦,maven是Java写的,当然有插件机制啦。写个maven插件又不复杂,套路都在那了###### @南湖船老大 通过你的举例,我特意看了mvn的plugin开发的文档,发现maven对自己的定义是 "Maven" is really just a core framework for a collection of Maven Plugins. 所以我想难怪各种自定义逻辑的工具在mvn文档里找不到,原来本来就是要开发的。 看来要考虑下是否值得把Ant那套编译逻辑用mvn插件的方式重构出来,这样就能用上mvn了。 说真的Ant和Ivy太老了,很多东西实现得不好,不知道maven怎样。 谢谢。######回复 @南湖船老大 : 好的######回复 @乌龟壳 : nexus,jfrog都可以的,都有web界面,很方便管理(主要是配置权限和代理仓库地址)。一次配置后后面就不用再管了######回复 @南湖船老大 : 就是你说的私有repo啊,mvn私源,公司内项目间共享的源,不能开放出去的######回复 @乌龟壳 : 不太理解你这个需求是什么###### @南湖船老大 对了,你知不知道maven是否有只需要http/ftp和文件目录结构就能部署出来的repo,我不需要web界面去管理,手工即可。
montos 2020-06-01 09:50:12 0 浏览量 回答数 0

回答

感觉你根本没理解什么是maven。。。我使用中根本没遇到你提到的疑问 jsp编译class是什么鬼。。没看懂,JSP不需要什么编译,这是容器的事情。。就算是你编译好了,你也脱离不了servlet容器,没多大意义。 至于你说的,发布前要把js minify,请问用mvn怎么做? 这根本就不叫事儿。maven搭配NPM和最热的vue前端框架整合在一起搞事,也不算啥事。Java开发的系统和工具,如果连这点扩展性都不到,还配叫Java么,Java还配稳坐编程语言老大的位置么。。你说的东西maven当然支持啦!,看示例配置: <!-- yuicompressor --> <plugin> <groupId>net.alchim31.maven</groupId> <artifactId>yuicompressor-maven-plugin</artifactId> <version>1.3.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>compress</goal> </goals> <configuration> <includes> <include>js/*.js</include> <include>css/*.css</include> <include>activity/**/*.css</include> </includes> <excludes> <exclude>**/*.min.js</exclude> <exclude>**/*-min.js</exclude> </excludes> <encoding>utf8</encoding> <failOnWarning>false</failOnWarning> <nosuffix>true</nosuffix> <force>true</force> <removeIncluded>true</removeIncluded> <linebreakpos>-1</linebreakpos> </configuration> </execution> </executions> </plugin> ant转maven不是分分钟的事情么,这种事情我干的不少,传统的没有任何包管理的全扔lib下的项目,200多个jar,我一天时间就能搞定。maven和某个号称最好的语言的包管理不同,maven对代码没有任何侵入性,代码一行改动都不需要,唯一需要的就是目录结构做轻微调整(甚至不调整也可以)。不存在你说的什么“重写”,真正的0侵入,反正就是不涉及任何代码修改,只需要配置下maven的POM而已。 maven本来就支持自定义目录结构啥的,只不过约定在先,你要不按你约定来也可以啊。 <build> <sourceDirectory>${basedir}/src/main/java</sourceDirectory> <scriptSourceDirectory>${basedir}/src/main/scripts</scriptSourceDirectory> <testSourceDirectory>${basedir}/src/test/java</testSourceDirectory> <outputDirectory>${basedir}/target/classes</outputDirectory> <testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory> ... </build> 如果系统中有很多jar已经招不到maven坐标了,自己给它安一个坐标,上传到私服就能搞定。我在12年之前写的Java代码都是传统方式,没有任何依赖管理。12年后,老项目转maven,轻轻松松毫无障碍。######无论js minify还是jsp编译成class,我都是举例子而已,真正想问的是mvn对编译流程的支持,除了写插件还有哪些?当然你说mvn可以嵌入ant,那我现在ant一套流程都下来了,只是没有mvn那么多功能,感觉没必要换。######你刻意没谈jsp编译成class,证明你不熟,你熟悉js minify,所以给了个插件的例子。我可不可以理解成mvn自定义编译流程必须学怎么写mvn插件?没法像Ant一样把编译流程也可以xml脚本化?######先不看具体内容,补充一下,我说的重写是重写build不是项目,现在项目用ivy管理依赖,并非放到lib什么的###### 要使用Maven最好还是搭建一个Nexus   这样也是为了长远考虑 当然增加dependency的时候也容易些  jsp编译class 这个问题  我感觉你对于JSP 以及 Servlet的生命周期理解的有问题  Maven管理子模块什么的  还是很方便的吧  无非就是多加一些 ######回复 @ManderSY : 我只是拿jsp做个例子而已,而且你这样回答算是逃避问题。如果你改的不是jsp而是controller呢?重启项目发布这个问题我不太想发散开来讨论。总之就是有办法自动化实现平滑重启发布。如果你纠结jsp,那我说个别的方便你理解,发布前要把js minify,请问用mvn怎么做?######回复 @乌龟壳 : 可以接受完全重写的话 完全可以采取前后端分离来做 就没这些问题了######回复 @乌龟壳 : 我个人觉着差别还是很大的 重启服务的成本 以及风险明显比那个高很多######回复 @ManderSY : 而且我只是拿jsp举例方便理解而已。项目的模板引擎不是jsp,而且要打包js那些东西,要干的事情很多。######回复 @ManderSY : 对于一个上线要走流程的环境,预编译jsp只能说影响不大。###### maven的哲学是Convention over Configuration ,建议还是按照maven的标准来,不然还不如就继续用ant,这样的成本还低一些######它的标准要遵守可以,但始终问题要解决,预编译jsp只是我抽象出来方便大家理解的场景而已,实际要做的是真正不预编译跑不起来的功能。###### @南湖船老大 ###### @南湖船老大 我想再明确地说一下场景,不是具体的jsp编译成class什么的,比如我手头上有一个自己开发的模板引擎,我需要 第一步把模板引擎编译出来 第二步用这个编译出来的模板引擎编译*.tmpl文件成java 第三步把java编译成class打包成jar 第四部把jar放到最终的目录 我想咨询的是,类似这些需要自定义化的逻辑,mvn大概是怎样支持的,我只需要一些关键字就好了。比如mvn是否支持直接调用jar,是否可以像ant一样配置一些简单的逻辑等。###### 引用来自“乌龟壳”的评论 @南湖船老大 我想再明确地说一下场景,不是具体的jsp编译成class什么的,比如我手头上有一个自己开发的模板引擎,我需要 第一步把模板引擎编译出来 第二步用这个编译出来的模板引擎编译*.tmpl文件成java 第三步把java编译成class打包成jar 第四部把jar放到最终的目录 我想咨询的是,类似这些需要自定义化的逻辑,mvn大概是怎样支持的,我只需要一些关键字就好了。比如mvn是否支持直接调用jar,是否可以像ant一样配置一些简单的逻辑等。 当然不是问题啦,maven是Java写的,当然有插件机制啦。写个maven插件又不复杂,套路都在那了###### @南湖船老大 通过你的举例,我特意看了mvn的plugin开发的文档,发现maven对自己的定义是 "Maven" is really just a core framework for a collection of Maven Plugins. 所以我想难怪各种自定义逻辑的工具在mvn文档里找不到,原来本来就是要开发的。 看来要考虑下是否值得把Ant那套编译逻辑用mvn插件的方式重构出来,这样就能用上mvn了。 说真的Ant和Ivy太老了,很多东西实现得不好,不知道maven怎样。 谢谢。######回复 @南湖船老大 : 好的######回复 @乌龟壳 : nexus,jfrog都可以的,都有web界面,很方便管理(主要是配置权限和代理仓库地址)。一次配置后后面就不用再管了######回复 @南湖船老大 : 就是你说的私有repo啊,mvn私源,公司内项目间共享的源,不能开放出去的######回复 @乌龟壳 : 不太理解你这个需求是什么###### @南湖船老大 对了,你知不知道maven是否有只需要http/ftp和文件目录结构就能部署出来的repo,我不需要web界面去管理,手工即可。
kun坤 2020-06-08 11:18:06 0 浏览量 回答数 0

问题

一个老码农的技术理想

小时候,老师问我,你的理想是什么? 我不假思索说是工程师,于是长大之后果然成了工程师。 工作这么多年,一直在思考工程师这三个字的意义,终于有一天恍然大...
技术小菜鸟 2019-12-01 21:17:10 3067 浏览量 回答数 1

问题

干货分享:DBA专家门诊一期:索引与sql优化问题汇总

各位亲爱的云友,               非常感谢大家踊跃参加DBA专家门诊一期:索引与sql优化,很多云友都提出了自己的问题,门诊主任医师玄惭对大家提的问题一一作了解答。现已整...
xiaofanqie 2019-12-01 21:24:21 74007 浏览量 回答数 38

回答

二楼:选购篇 个人经验,说说新用户买主机的那些困惑 假如网站流量2万然后图片和WEB分离用什么样的配置就够 租用阿里云主机我想建30个站点请问购买哪种配置合适 1m带宽能做图片站吗? 请教一下数据量有100万条左右要什么配置 网站流量IP在10006000之间如何选择带宽 6m的带宽能承受多少ip的并发 想问下,网站同时在线最高500IP,要多大的带宽,什么配置? 2万pv、2千ip的论坛该选择什么样的阿里云产品? 1000IP,50008000pv手机软件下载站,大约50g附件,用oss划算吗? 网站最高100IP同时在线,1M够用吗? phpwind的论坛每天2万IP需要买什么样的配置? 单个html网页,每天几万IP访问量,需要怎样的服务器配置? 日IP8000的论坛大概要用什么类型阿里云产品? 1g 的内存能不能支持DZ5000个IP 3M的带宽1.5WIP就扛不住了? 512M的经济型能支持几个站点?(pw论坛)IPpv多少?数据库有送么 ------------------------- 四楼:配置篇 阿里云官方帮助中心(推荐)windows篇Windows最简单的PHP MYSQL配置方法(菜鸟必备)面板管理 mysql安装教程梦丫头版 云服务器管理指南windows2008r2php阿里云主机配置视频教程云主机win2008可以更改远程桌面端口3389 Windows使用手册Windows Server 2012上PHP运行环境搭建的简易教程(Win08适用) Windows 视频教程IIS6.0新建站点及绑定域名图文教程 linux篇nginx系统,301地址重定向在CentOS 5.x中使用ext4文件系统 WDCP系统如何禁止别人用IP访问你的网站 阿里云主机如何添加SWAP分区 用wdcp面板安装wordpress博客 老牌wdcpweb控制和管理面板 阿里云Centos主机Mysql设置配置php.ini问题——Error404.me阿里云centos主机配置nginx 阿里云centos下挂载和扩展多块硬盘解决方案阿里云主机之挂载硬盘lnmpnginxmysqlphp安装使用开源的amh搭建nginx/php/mysql环境和管理面板 Nginx配置及Rewrite规则 阿里云主机linux下安装系统zijidelu管理系统图文教程分享一个阿里云linux系统装wdcp的教程 分享下 LINUX 挂载数据盘并安装WDCP的教程 新手安装控制面板 挂载硬盘 3条命令 直接搞定 阿里云主机Linux系统运用LuManager(LUM)配置环境教程 Redhat/CentOS一键安装web环境全攻略阿里云linux最简单的环境配置方法(有面板) 如何添加网站for linux(绑定域名) linux使用手册 Linux视频教程 ------------------------- 五楼:备案篇实战演示:阿里云网站备案视频教程备案期间IP访问网站 域名调试网站方法大全 阿里云官方备案专题 首次备案指南 修改备案指南 有主体新增网站指南 联系客服 ------------------------- 六楼:安全篇 云盾1.30版本介绍 讨论阿里云服务器被DDos和CC的防御方法! 关于“云监控”的使用及其他说明操作系统安全加固版镜像FAQ云盾FAQweb漏洞详解及修复建议网页挂马及暗链检测 ------------------------- 七楼:高级应用篇Linux和windows如何屏蔽访客IP[阿里云版主教程帖]NGINX(Tengine)从入门到精通怎样对网站进行gzip压缩 Mysql 主、从同步/主、从双向同步 巧用linux云服务器下的的/dev/shm/,避开磁盘IO不给力 使用SLB合并阿里云带宽 - 【降低成本】 4K对齐,0成本IO优化,大家都来看吧! 迁入阿里云后的两个心得1M的主机搭建的网站如何秒开使用gzip来实现加速 负载均衡SLB具体怎么用手把手教你nginx下如何增加网站phpwind,discuz,wordpress需要开通系统邮件服务的看这里哈 ------------------------- 回 24楼(秋风明月) 的帖子 是的,有了云盾和快照,确实可以不用装防火墙了。如果你是linux系统,安全性更高一些。 ------------------------- Re:回7楼kideny的帖子 引用第30楼正典互联于2013-04-15 14:15发表的 回7楼kideny的帖子 : 请问阿里云服务器可以实现PHP跟ASP共存吗?我的几个网站分别是使用这两种不同环境的。谢谢解答 云服务器完全可以实现PHP和ASP共存。 ------------------------- 回 37楼(xixihaha) 的帖子 截图发上来看看吧,是密码错误还是怎么了。 ------------------------- 回 49楼(joker) 的帖子 是的,都是独立IP和独立带宽。
kideny 2019-12-01 23:35:01 0 浏览量 回答数 0

问题

【精品问答】Java必备核心知识1000+(附源码)

为了方便Java开发者快速找到相关技术问题和答案,开发者社区策划了Java技术1000问内容,包含最基础的如何学Java、实践中遇到的技术问题、RocketMQ面试、Java容器部署实践等维度内容。 我们会以每...
问问小秘 2019-12-01 22:00:28 870 浏览量 回答数 1

问题

支付宝的性能测试

       一、性能测试支付宝场景介绍   2013年双11过程当中,促销开启的第一分钟内支付宝的交易总额就突破了一亿元,短时间内大量用户涌入的情况下,如何保证用户的支付顺畅,...
云效平台 2019-12-01 21:47:13 5472 浏览量 回答数 1

问题

我们一起来游戏 (四)——(AS3零基础做AIR卡牌网游):报错

小伙伴们一定都在想,楼主你不要掉胃口了,赶快来写点更实在的吧,这都好几天了,连个登录都没看到。别急,别急,小伙伴们我们一起来登录啊! 配置...
kun坤 2020-06-08 11:10:24 2 浏览量 回答数 1

回答

Re阿里云的磁盘IO不是慢,而是太不稳定了!实在无法忍受 上午笔误,应该是近一年来,只有今年2月、3月稳定一些,没有出现这种情况。其余时候,都有这种磁盘IO不稳定的情况。 ------------------------- Re阿里云的磁盘IO不是慢,而是太不稳定了!实在无法忍受 阿里云这台服务器,IP地址头是 42.121.19.*,期间还迁移过两次,都是因为磁盘IO问题进行的迁移,迁移后还是差不多。 去年迁移一次,今年4月20日又迁移一次。 ------------------------- Re阿里云的磁盘IO不是慢,而是太不稳定了!实在无法忍受 官方?官方在忙着做促销呢,人家“小云有约”,忙着与未来的客户约会呢。 老客户反正已经诳进来了,一时半会儿也跑不掉。 技术问题解决起来多麻烦,还是忙着收钱来得爽。 真是给阿里云这个磁盘IO不稳定的情况给气死了! ------------------------- Re阿里云的磁盘IO不是慢,而是太不稳定了!实在无法忍受 谢谢vpsmm的建议,如果实在不行,就换台云主机试试吧。折腾啊~~ ------------------------- Re阿里云的磁盘IO不是慢,而是太不稳定了!实在无法忍受 上面大家的分析都挺有道理的,希望阿里云官方正视这个问题,早日解决。 ------------------------- Re阿里云的磁盘IO不是慢,而是太不稳定了!实在无法忍受 情况肯定属实的,博客园(cnblogs)影响比较大吧,我看博客园官网也说遇到阿里云好几次这样的问题,还是没有解决。这个与阿里云底层架构、用户数量有关。 只要google一下“阿里云 磁盘IO”,自然可发现大量的这方面的反馈。 另外,能否推荐一款比较好用的Windows平台下的磁盘IO监测软件?我现在是自己做的程序,IO异常时就发短信。 ------------------------- Re阿里云的磁盘IO不是慢,而是太不稳定了!实在无法忍受 刚才10:03的时候又遇到一次20秒磁盘IO不能访问的情况,很郁闷~ ------------------------- Re阿里云的磁盘IO不是慢,而是太不稳定了!实在无法忍受 10:35:42,又遇到连续20秒,磁盘IO无法访问的情况。 ------------------------- 回18楼gdliwt的帖子 这个比喻不太恰当,客户使用阿里云的云主机,磁盘IO的稳定性是最基本的。我前面都说过了,你说磁盘IO速度慢,2MB/s的蜗牛速度我都能接受,这种彻底连续20秒无法访问,就太不应该了。这样不稳定,你让客户怎么用? ------------------------- 回21楼云迷的帖子 是的,就如同你所说,一般这种几十秒没有响应的情况,多数客户都是忍了。这个情况太普遍了,阿里云应该正视及解决。 我实在是忍无可忍才在这里发帖。 ------------------------- Re阿里云的磁盘IO不是慢,而是太不稳定了!实在无法忍受 11:03:45,又出现连续20秒无法访问磁盘的情况,这是今天出现的第四次了。 今天的简单汇总,5月8日,连续20秒无法访问磁盘的时间点(截止目前,出现4次): 09:25:38 10:30:50 10:35:42 11:03:45 ------------------------- ReRe阿里云的磁盘IO不是慢,而是太不稳定了!实在无法忍受 引用第25楼temp2012于2013-05-08 11:08发表的 Re阿里云的磁盘IO不是慢,而是太不稳定了!实在无法忍受 : 11:03:45,又出现连续20秒无法访问磁盘的情况,这是今天出现的第四次了。 今天的简单汇总,5月8日,连续20秒无法访问磁盘的时间点(截止目前,出现4次): 09:25:38 10:30:50 10:35:42 ....... 上面的10:30:50,应该是10:03:50 ------------------------- Re阿里云的磁盘IO不是慢,而是太不稳定了!实在无法忍受 我这个是应用服务器,不是网站。整体磁盘读写低于1MB/s,网络带宽低于300KB/s 这个要求很低,但就这样,阿里云的磁盘IO如此不稳定,也达不到。 其实就如同上面 “云迷”的回复,网站一样存在这个问题,只不过一般网站主没有感觉到这种几十秒的“卡死”,但网站的最终客户其实会感觉网站不稳定,只不过一般会不反馈给网站主而已。 ------------------------- Re阿里云的磁盘IO不是慢,而是太不稳定了!实在无法忍受 没有使用数据库 ------------------------- 回30楼joycean.zhu的帖子 是的,以前出问题时,提交工单,但阿里云的技术支持根本就不承认有问题。因为提交工单时,没有出现“卡死”的现象(过一段时间偶尔又会出现)。 ------------------------- 回33楼gdliwt的帖子 已经迁移了两次了,没有用,迁移后还是有类似的问题。 这个需要阿里云从根本上来解决,如果迁移有效果,我也不再这里发帖了。 ------------------------- 回35楼水元素的帖子 没有什么特别的,程序正常跑着,偶尔就卡死了。 你可自己做个小程序监控磁盘IO,自然可发现这种现象,每天都要出现几次,很常见。只不过因为磁盘卡死时间一般在几十秒内(我是监控到20秒没有响应就报警),所以很多用户没有发现而已。 ------------------------- 回39楼gdliwt的帖子 这个是自己开发的,而且是专门针对我服务器中应用进行监控的。 ------------------------- 回39楼gdliwt的帖子 这个是针对自己的应用开发的。其实你可做个小程序,程序中设一个定时器,每秒向一个文件中写入例如1024字节(1KB),如果连续20秒都无法写入,则报警(例如发送邮件出去,或记录到内存,等IO正常时则可写入日志文件)。即可可发现阿里云磁盘卡死时,连续20秒都无法向一个文件写入哪怕是仅仅1KB的数据。 ------------------------- 回45楼放牛娃的帖子 谢谢你的建议,不过: 1、已经迁移过两次了,这种情况还是会出现,一样不稳定; 2、出现不稳定状况时,是彻底“卡死”,连续20秒内根本就无法读写磁盘,因此无论如何降低磁盘IO都无法解决。前面已说过,我都磁盘IO速度要求根本就不高,只是希望稳定。 3、这个服务器是应用服务器,涉及到的是直接的二进制文件读写,估计还不太适合采用RDS方式。 ------------------------- Re阿里云的磁盘IO不是慢,而是太不稳定了!实在无法忍受 今天又出现了两次,连续20秒磁盘无响应。 13:07:57一次; 14:54:13又出现一次。 ------------------------- 回49楼云迷的帖子 其实出现这种情况时,是整个硬盘IO短暂时间内(例如几秒,或20秒)根本无响应,所以特别让人恼火。 ------------------------- Re阿里云的磁盘IO不是慢,而是太不稳定了!实在无法忍受 磁盘又卡住了!15:09:54秒! ------------------------- Re阿里云的磁盘IO不是慢,而是太不稳定了!实在无法忍受 下面大家来看看40个字节(仅仅能是40个字节)的写入速度吧: 下面的0毫秒是正常的,因为毕竟只有40字节。但磁盘IO出现问题时,40字节需要将近3秒才能写入完毕,你说说,这个怎么用?? 2013-5-20 15:11:05    上一次写入耗时:    0    毫秒 2013-5-20 15:11:06    上一次写入耗时:    0    毫秒 2013-5-20 15:11:07    上一次写入耗时:    0    毫秒 2013-5-20 15:11:08    上一次写入耗时:    0    毫秒 2013-5-20 15:11:09    上一次写入耗时:    0    毫秒 2013-5-20 15:11:10    上一次写入耗时:    0    毫秒 2013-5-20 15:11:14    上一次写入耗时:    2781    毫秒 2013-5-20 15:11:15    上一次写入耗时:    0    毫秒 2013-5-20 15:11:16    上一次写入耗时:    0    毫秒 2013-5-20 15:11:17    上一次写入耗时:    0    毫秒 2013-5-20 15:11:18    上一次写入耗时:    0    毫秒 2013-5-20 15:11:19    上一次写入耗时:    0    毫秒 2013-5-20 15:11:20    上一次写入耗时:    0    毫秒 2013-5-20 15:11:23    上一次写入耗时:    1563    毫秒 2013-5-20 15:11:24    上一次写入耗时:    0    毫秒 2013-5-20 15:11:25    上一次写入耗时:    0    毫秒 2013-5-20 15:11:26    上一次写入耗时:    0    毫秒 2013-5-20 15:11:27    上一次写入耗时:    610    毫秒 2013-5-20 15:11:28    上一次写入耗时:    0    毫秒 2013-5-20 15:11:29    上一次写入耗时:    0    毫秒 2013-5-20 15:11:30    上一次写入耗时:    0    毫秒 2013-5-20 15:11:31    上一次写入耗时:    0    毫秒 2013-5-20 15:11:32    上一次写入耗时:    0    毫秒 2013-5-20 15:11:33    上一次写入耗时:    0    毫秒 2013-5-20 15:11:34    上一次写入耗时:    0    毫秒 2013-5-20 15:11:35    上一次写入耗时:    0    毫秒 2013-5-20 15:11:36    上一次写入耗时:    0    毫秒 ------------------------- Re阿里云的磁盘IO不是慢,而是太不稳定了!实在无法忍受 今天09:00,硬盘又卡住了。 40个字节,仅仅40个字节,写入速度慢到什么程度????40字节写入需要几秒钟,这个就是硬盘IO彻底卡住了,你说正常的程序哪怕只是需要写入1KB字节,那还不得几十秒,这几十秒就是彻底卡住了,根本无响应。 这个还怎么使用??? 2013-5-21 9:05:49    上一次写入耗时:    0    毫秒 2013-5-21 9:05:50    上一次写入耗时:    0    毫秒 2013-5-21 9:05:51    上一次写入耗时:    0    毫秒 2013-5-21 9:05:52    上一次写入耗时:    0    毫秒 2013-5-21 9:05:53    上一次写入耗时:    0    毫秒 2013-5-21 9:05:54    上一次写入耗时:    0    毫秒 2013-5-21 9:05:55    上一次写入耗时:    0    毫秒 2013-5-21 9:05:56    上一次写入耗时:    0    毫秒 2013-5-21 9:05:57    上一次写入耗时:    0    毫秒 2013-5-21 9:05:58    上一次写入耗时:    0    毫秒 2013-5-21 9:05:59    上一次写入耗时:    0    毫秒 2013-5-21 9:06:00    上一次写入耗时:    0    毫秒 2013-5-21 9:06:02    上一次写入耗时:    875    毫秒 2013-5-21 9:06:03    上一次写入耗时:    0    毫秒 2013-5-21 9:06:04    上一次写入耗时:    0    毫秒 2013-5-21 9:06:05    上一次写入耗时:    0    毫秒 2013-5-21 9:06:06    上一次写入耗时:    0    毫秒 2013-5-21 9:06:07    上一次写入耗时:    0    毫秒 2013-5-21 9:06:08    上一次写入耗时:    78    毫秒 2013-5-21 9:06:09    上一次写入耗时:    0    毫秒 2013-5-21 9:06:12    上一次写入耗时:    2109    毫秒 2013-5-21 9:06:13    上一次写入耗时:    0    毫秒 2013-5-21 9:06:19    上一次写入耗时:    4953    毫秒 2013-5-21 9:06:20    上一次写入耗时:    0    毫秒 2013-5-21 9:06:22    上一次写入耗时:    1125    毫秒 2013-5-21 9:06:24    上一次写入耗时:    219    毫秒 2013-5-21 9:06:25    上一次写入耗时:    234    毫秒 2013-5-21 9:06:26    上一次写入耗时:    0    毫秒 2013-5-21 9:06:29    上一次写入耗时:    1891    毫秒 2013-5-21 9:06:30    上一次写入耗时:    0    毫秒 2013-5-21 9:06:31    上一次写入耗时:    0    毫秒 2013-5-21 9:06:33    上一次写入耗时:    1141    毫秒 2013-5-21 9:06:34    上一次写入耗时:    0    毫秒 2013-5-21 9:06:35    上一次写入耗时:    0    毫秒 2013-5-21 9:06:36    上一次写入耗时:    0    毫秒 2013-5-21 9:06:37    上一次写入耗时:    0    毫秒 2013-5-21 9:06:39    上一次写入耗时:    937    毫秒 2013-5-21 9:06:41    上一次写入耗时:    1032    毫秒 2013-5-21 9:06:42    上一次写入耗时:    0    毫秒 2013-5-21 9:06:44    上一次写入耗时:    1422    毫秒 2013-5-21 9:06:45    上一次写入耗时:    0    毫秒 2013-5-21 9:06:46    上一次写入耗时:    0    毫秒 2013-5-21 9:06:47    上一次写入耗时:    0    毫秒 2013-5-21 9:06:48    上一次写入耗时:    0    毫秒 2013-5-21 9:06:49    上一次写入耗时:    0    毫秒 2013-5-21 9:06:50    上一次写入耗时:    0    毫秒 2013-5-21 9:06:51    上一次写入耗时:    0    毫秒 ------------------------- Re阿里云的磁盘IO不是慢,而是太不稳定了!实在无法忍受 看看截图,这就是阿里云的磁盘IO,不稳定的程度如此之严重。
temp2012 2019-12-02 01:11:59 0 浏览量 回答数 0

回答

遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么?Java 中 List 遍历的最佳实践是什么? 遍历方式有以下几种: for 循环遍历,基于计数器。在集合外部维护一个计数器,然后依次读取每一个位置的元素,当读取到最后一个元素后停止。 迭代器遍历,Iterator。Iterator 是面向对象的一个设计模式,目的是屏蔽不同数据集合的特点,统一遍历集合的接口。Java 在 Collections 中支持了 Iterator 模式。 foreach 循环遍历。foreach 内部也是采用了 Iterator 的方式实现,使用时不需要显式声明 Iterator 或计数器。优点是代码简洁,不易出错;缺点是只能做简单的遍历,不能在遍历过程中操作数据集合,例如删除、替换。 最佳实践:Java Collections 框架中提供了一个 RandomAccess 接口,用来标记 List 实现是否支持 Random Access。 如果一个数据集合实现了该接口,就意味着它支持 Random Access,按位置读取元素的平均时间复杂度为 O(1),如ArrayList。如果没有实现该接口,表示不支持 Random Access,如LinkedList。 推荐的做法就是,支持 Random Access 的列表可用 for 循环遍历,否则建议用 Iterator 或 foreach 遍历。 说一下 ArrayList 的优缺点 ArrayList的优点如下: ArrayList 底层以数组实现,是一种随机访问模式。ArrayList 实现了 RandomAccess 接口,因此查找的时候非常快。ArrayList 在顺序添加一个元素的时候非常方便。 ArrayList 的缺点如下: 删除元素的时候,需要做一次元素复制操作。如果要复制的元素很多,那么就会比较耗费性能。插入元素的时候,也需要做一次元素复制操作,缺点同上。 ArrayList 比较适合顺序添加、随机访问的场景。 如何实现数组和 List 之间的转换? 数组转 List:使用 Arrays. asList(array) 进行转换。List 转数组:使用 List 自带的 toArray() 方法。 代码示例: ArrayList 和 LinkedList 的区别是什么? 数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 增删操作要影响数组内的其他数据的下标。内存空间占用:LinkedList 比 ArrayList 更占内存,因为 LinkedList 的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。线程安全:ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全; 综合来说,在需要频繁读取集合中的元素时,更推荐使用 ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList。 补充:数据结构基础之双向链表 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。 ArrayList 和 Vector 的区别是什么? 这两个类都实现了 List 接口(List 接口继承了 Collection 接口),他们都是有序集合 线程安全:Vector 使用了 Synchronized 来实现线程同步,是线程安全的,而 ArrayList 是非线程安全的。性能:ArrayList 在性能方面要优于 Vector。扩容:ArrayList 和 Vector 都会根据实际的需要动态的调整容量,只不过在 Vector 扩容每次会增加 1 倍,而 ArrayList 只会增加 50%。 Vector类的所有方法都是同步的。可以由两个线程安全地访问一个Vector对象、但是一个线程访问Vector的话代码要在同步操作上耗费大量的时间。 Arraylist不是同步的,所以在不需要保证线程安全时时建议使用Arraylist。 插入数据时,ArrayList、LinkedList、Vector谁速度较快?阐述 ArrayList、Vector、LinkedList 的存储性能和特性? ArrayList、LinkedList、Vector 底层的实现都是使用数组方式存储数据。数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。 Vector 中的方法由于加了 synchronized 修饰,因此 Vector 是线程安全容器,但性能上较ArrayList差。 LinkedList 使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但插入数据时只需要记录当前项的前后项即可,所以 LinkedList 插入速度较快。 多线程场景下如何使用 ArrayList? ArrayList 不是线程安全的,如果遇到多线程场景,可以通过 Collections 的 synchronizedList 方法将其转换成线程安全的容器后再使用。例如像下面这样: 为什么 ArrayList 的 elementData 加上 transient 修饰? ArrayList 中的数组定义如下: private transient Object[] elementData; 再看一下 ArrayList 的定义: public class ArrayList extends AbstractList implements List<E>, RandomAccess, Cloneable, java.io.Serializable 可以看到 ArrayList 实现了 Serializable 接口,这意味着 ArrayList 支持序列化。transient 的作用是说不希望 elementData 数组被序列化,重写了 writeObject 实现: 每次序列化时,先调用 defaultWriteObject() 方法序列化 ArrayList 中的非 transient 元素,然后遍历 elementData,只序列化已存入的元素,这样既加快了序列化的速度,又减小了序列化之后的文件大小。 List 和 Set 的区别 List , Set 都是继承自Collection 接口 List 特点:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多个null元素,元素都有索引。常用的实现类有 ArrayList、LinkedList 和 Vector。 Set 特点:一个无序(存入和取出顺序有可能不一致)容器,不可以存储重复元素,只允许存入一个null元素,必须保证元素唯一性。Set 接口常用实现类是 HashSet、LinkedHashSet 以及 TreeSet。 另外 List 支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。 Set和List对比 Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。 List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变 Set接口 说一下 HashSet 的实现原理? HashSet 是基于 HashMap 实现的,HashSet的值存放于HashMap的key上,HashMap的value统一为PRESENT,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。 HashSet如何检查重复?HashSet是如何保证数据不可重复的? 向HashSet 中add ()元素时,判断元素是否存在的依据,不仅要比较hash值,同时还要结合equles 方法比较。 HashSet 中的add ()方法会使用HashMap 的put()方法。 HashMap 的 key 是唯一的,由源码可以看出 HashSet 添加进去的值就是作为HashMap 的key,并且在HashMap中如果K/V相同时,会用新的V覆盖掉旧的V,然后返回旧的V。所以不会重复( HashMap 比较key是否相等是先比较hashcode 再比较equals )。 以下是HashSet 部分源码: hashCode()与equals()的相关规定: 如果两个对象相等,则hashcode一定也是相同的 两个对象相等,对两个equals方法返回true 两个对象有相同的hashcode值,它们也不一定是相等的 综上,equals方法被覆盖过,则hashCode方法也必须被覆盖 hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该class的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)。 ** ==与equals的区别** ==是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不是相同 ==是指对内存地址进行比较 equals()是对字符串的内容进行比较3.==指引用是否相同 equals()指的是值是否相同 HashSet与HashMap的区别 Queue BlockingQueue是什么? Java.util.concurrent.BlockingQueue是一个队列,在进行检索或移除一个元素的时候,它会等待队列变为非空;当在添加一个元素时,它会等待队列中的可用空间。BlockingQueue接口是Java集合框架的一部分,主要用于实现生产者-消费者模式。我们不需要担心等待生产者有可用的空间,或消费者有可用的对象,因为它都在BlockingQueue的实现类中被处理了。Java提供了集中BlockingQueue的实现,比如ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue,、SynchronousQueue等。 在 Queue 中 poll()和 remove()有什么区别? 相同点:都是返回第一个元素,并在队列中删除返回的对象。 不同点:如果没有元素 poll()会返回 null,而 remove()会直接抛出 NoSuchElementException 异常。 代码示例: Queue queue = new LinkedList (); queue. offer("string"); // add System. out. println(queue. poll()); System. out. println(queue. remove()); System. out. println(queue. size()); Map接口 说一下 HashMap 的实现原理? HashMap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 HashMap的数据结构: 在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。 HashMap 基于 Hash 算法实现的 当我们往Hashmap中put元素时,利用key的hashCode重新hash计算出当前对象的元素在数组中的下标存储时,如果出现hash值相同的key,此时有两种情况。(1)如果key相同,则覆盖原始值;(2)如果key不同(出现冲突),则将当前的key-value放入链表中获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。理解了以上过程就不难明白HashMap是如何解决hash冲突的问题,核心就是使用了数组的存储方式,然后将冲突的key的对象放入链表中,一旦发现冲突就在链表中做进一步的对比。 需要注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn) HashMap在JDK1.7和JDK1.8中有哪些不同?HashMap的底层实现 在Java中,保存数据有两种比较简单的数据结构:数组和链表。数组的特点是:寻址容易,插入和删除困难;链表的特点是:寻址困难,但插入和删除容易;所以我们将数组和链表结合在一起,发挥两者各自的优势,使用一种叫做拉链法的方式可以解决哈希冲突。 JDK1.8之前 JDK1.8之前采用的是拉链法。拉链法:将链表和数组相结合。也就是说创建一个链表数组,数组中每一格就是一个链表。若遇到哈希冲突,则将冲突的值加到链表中即可。 JDK1.8之后 相比于之前的版本,jdk1.8在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。 JDK1.7 VS JDK1.8 比较 JDK1.8主要解决或优化了一下问题: resize 扩容优化引入了红黑树,目的是避免单条链表过长而影响查询效率,红黑树算法请参考解决了多线程死循环问题,但仍是非线程安全的,多线程时可能会造成数据丢失问题。 HashMap的put方法的具体流程? 当我们put的时候,首先计算 key的hash值,这里调用了 hash方法,hash方法实际是让key.hashCode()与key.hashCode()>>>16进行异或操作,高16bit补0,一个数和0异或不变,所以 hash 函数大概的作用就是:高16bit不变,低16bit和高16bit做了一个异或,目的是减少碰撞。按照函数注释,因为bucket数组大小是2的幂,计算下标index = (table.length - 1) & hash,如果不做 hash 处理,相当于散列生效的只有几个低 bit 位,为了减少散列的碰撞,设计者综合考虑了速度、作用、质量之后,使用高16bit和低16bit异或来简单处理减少碰撞,而且JDK8中用了复杂度 O(logn)的树结构来提升碰撞下的性能。 putVal方法执行流程图 ①.判断键值对数组table[i]是否为空或为null,否则执行resize()进行扩容; ②.根据键值key计算hash值得到插入的数组索引i,如果table[i]==null,直接新建节点添加,转向⑥,如果table[i]不为空,转向③; ③.判断table[i]的首个元素是否和key一样,如果相同直接覆盖value,否则转向④,这里的相同指的是hashCode以及equals; ④.判断table[i] 是否为treeNode,即table[i] 是否是红黑树,如果是红黑树,则直接在树中插入键值对,否则转向⑤; ⑤.遍历table[i],判断链表长度是否大于8,大于8的话把链表转换为红黑树,在红黑树中执行插入操作,否则进行链表的插入操作;遍历过程中若发现key已经存在直接覆盖value即可; ⑥.插入成功后,判断实际存在的键值对数量size是否超多了最大容量threshold,如果超过,进行扩容。 HashMap的扩容操作是怎么实现的? ①.在jdk1.8中,resize方法是在hashmap中的键值对大于阀值时或者初始化时,就调用resize方法进行扩容; ②.每次扩展的时候,都是扩展2倍; ③.扩展后Node对象的位置要么在原位置,要么移动到原偏移量两倍的位置。 在putVal()中,我们看到在这个函数里面使用到了2次resize()方法,resize()方法表示的在进行第一次初始化时会对其进行扩容,或者当该数组的实际大小大于其临界值值(第一次为12),这个时候在扩容的同时也会伴随的桶上面的元素进行重新分发,这也是JDK1.8版本的一个优化的地方,在1.7中,扩容之后需要重新去计算其Hash值,根据Hash值对其进行分发,但在1.8版本中,则是根据在同一个桶的位置中进行判断(e.hash & oldCap)是否为0,重新进行hash分配后,该元素的位置要么停留在原始位置,要么移动到原始位置+增加的数组大小这个位置上 HashMap是怎么解决哈希冲突的? 答:在解决这个问题之前,我们首先需要知道什么是哈希冲突,而在了解哈希冲突之前我们还要知道什么是哈希才行; 什么是哈希? Hash,一般翻译为“散列”,也有直接音译为“哈希”的,这就是把任意长度的输入通过散列算法,变换成固定长度的输出,该输出就是散列值(哈希值);这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 所有散列函数都有如下一个基本特性**:根据同一散列函数计算出的散列值如果不同,那么输入值肯定也不同。但是,根据同一散列函数计算出的散列值如果相同,输入值不一定相同**。 什么是哈希冲突? 当两个不同的输入值,根据同一散列函数计算出相同的散列值的现象,我们就把它叫做碰撞(哈希碰撞)。 HashMap的数据结构 在Java中,保存数据有两种比较简单的数据结构:数组和链表。数组的特点是:寻址容易,插入和删除困难;链表的特点是:寻址困难,但插入和删除容易;所以我们将数组和链表结合在一起,发挥两者各自的优势,使用一种叫做链地址法的方式可以解决哈希冲突: 这样我们就可以将拥有相同哈希值的对象组织成一个链表放在hash值所对应的bucket下,但相比于hashCode返回的int类型,我们HashMap初始的容量大小DEFAULT_INITIAL_CAPACITY = 1 << 4(即2的四次方16)要远小于int类型的范围,所以我们如果只是单纯的用hashCode取余来获取对应的bucket这将会大大增加哈希碰撞的概率,并且最坏情况下还会将HashMap变成一个单链表,所以我们还需要对hashCode作一定的优化 hash()函数 上面提到的问题,主要是因为如果使用hashCode取余,那么相当于参与运算的只有hashCode的低位,高位是没有起到任何作用的,所以我们的思路就是让hashCode取值出的高位也参与运算,进一步降低hash碰撞的概率,使得数据分布更平均,我们把这样的操作称为扰动,在JDK 1.8中的hash()函数如下: static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);// 与自己右移16位进行异或运算(高低位异或) } 这比在JDK 1.7中,更为简洁,相比在1.7中的4次位运算,5次异或运算(9次扰动),在1.8中,只进行了1次位运算和1次异或运算(2次扰动); JDK1.8新增红黑树 通过上面的链地址法(使用散列表)和扰动函数我们成功让我们的数据分布更平均,哈希碰撞减少,但是当我们的HashMap中存在大量数据时,加入我们某个bucket下对应的链表有n个元素,那么遍历时间复杂度就为O(n),为了针对这个问题,JDK1.8在HashMap中新增了红黑树的数据结构,进一步使得遍历复杂度降低至O(logn); 总结 简单总结一下HashMap是使用了哪些方法来有效解决哈希冲突的: 使用链地址法(使用散列表)来链接拥有相同hash值的数据;使用2次扰动函数(hash函数)来降低哈希冲突的概率,使得数据分布更平均;引入红黑树进一步降低遍历的时间复杂度,使得遍历更快; **能否使用任何类作为 Map 的 key? **可以使用任何类作为 Map 的 key,然而在使用之前,需要考虑以下几点: 如果类重写了 equals() 方法,也应该重写 hashCode() 方法。 类的所有实例需要遵循与 equals() 和 hashCode() 相关的规则。 如果一个类没有使用 equals(),不应该在 hashCode() 中使用它。 用户自定义 Key 类最佳实践是使之为不可变的,这样 hashCode() 值可以被缓存起来,拥有更好的性能。不可变的类也可以确保 hashCode() 和 equals() 在未来不会改变,这样就会解决与可变相关的问题了。 为什么HashMap中String、Integer这样的包装类适合作为K? 答:String、Integer等包装类的特性能够保证Hash值的不可更改性和计算准确性,能够有效的减少Hash碰撞的几率 都是final类型,即不可变性,保证key的不可更改性,不会存在获取hash值不同的情况 内部已重写了equals()、hashCode()等方法,遵守了HashMap内部的规范(不清楚可以去上面看看putValue的过程),不容易出现Hash值计算错误的情况; 如果使用Object作为HashMap的Key,应该怎么办呢? 答:重写hashCode()和equals()方法 重写hashCode()是因为需要计算存储数据的存储位置,需要注意不要试图从散列码计算中排除掉一个对象的关键部分来提高性能,这样虽然能更快但可能会导致更多的Hash碰撞; 重写equals()方法,需要遵守自反性、对称性、传递性、一致性以及对于任何非null的引用值x,x.equals(null)必须返回false的这几个特性,目的是为了保证key在哈希表中的唯一性; HashMap为什么不直接使用hashCode()处理后的哈希值直接作为table的下标 答:hashCode()方法返回的是int整数类型,其范围为-(2 ^ 31)~(2 ^ 31 - 1),约有40亿个映射空间,而HashMap的容量范围是在16(初始化默认值)~2 ^ 30,HashMap通常情况下是取不到最大值的,并且设备上也难以提供这么多的存储空间,从而导致通过hashCode()计算出的哈希值可能不在数组大小范围内,进而无法匹配存储位置; 那怎么解决呢? HashMap自己实现了自己的hash()方法,通过两次扰动使得它自己的哈希值高低位自行进行异或运算,降低哈希碰撞概率也使得数据分布更平均; 在保证数组长度为2的幂次方的时候,使用hash()运算之后的值与运算(&)(数组长度 - 1)来获取数组下标的方式进行存储,这样一来是比取余操作更加有效率,二来也是因为只有当数组长度为2的幂次方时,h&(length-1)才等价于h%length,三来解决了“哈希值与数组大小范围不匹配”的问题; HashMap 的长度为什么是2的幂次方 为了能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀,每个链表/红黑树长度大致相同。这个实现就是把数据存到哪个链表/红黑树中的算法。 这个算法应该如何设计呢? 我们首先可能会想到采用%取余的操作来实现。但是,重点来了:“取余(%)操作中如果除数是2的幂次则等价于与其除数减一的与(&)操作(也就是说 hash%length==hash&(length-1)的前提是 length 是2的 n 次方;)。” 并且 采用二进制位操作 &,相对于%能够提高运算效率,这就解释了 HashMap 的长度为什么是2的幂次方。 那为什么是两次扰动呢? 答:这样就是加大哈希值低位的随机性,使得分布更均匀,从而提高对应数组存储下标位置的随机性&均匀性,最终减少Hash冲突,两次就够了,已经达到了高位低位同时参与运算的目的; HashMap 与 HashTable 有什么区别? 线程安全: HashMap 是非线程安全的,HashTable 是线程安全的;HashTable 内部的方法基本都经过 synchronized 修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!); 效率: 因为线程安全的问题,HashMap 要比 HashTable 效率高一点。另外,HashTable 基本被淘汰,不要在代码中使用它; 对Null key 和Null value的支持: HashMap 中,null 可以作为键,这样的键只有一个,可以有一个或多个键所对应的值为 null。但是在 HashTable 中 put 进的键值只要有一个 null,直接抛NullPointerException。 **初始容量大小和每次扩充容量大小的不同 **: ①创建时如果不指定容量初始值,Hashtable 默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap 默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。②创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为2的幂次方大小。也就是说 HashMap 总是使用2的幂作为哈希表的大小,后面会介绍到为什么是2的幂次方。 底层数据结构: JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。 推荐使用:在 Hashtable 的类注释可以看到,Hashtable 是保留类不建议使用,推荐在单线程环境下使用 HashMap 替代,如果需要多线程使用则用 ConcurrentHashMap 替代。 如何决定使用 HashMap 还是 TreeMap? 对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。然而,假如你需要对一个有序的key集合进行遍历,TreeMap是更好的选择。基于你的collection的大小,也许向HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历。 HashMap 和 ConcurrentHashMap 的区别 ConcurrentHashMap对整个桶数组进行了分割分段(Segment),然后在每一个分段上都用lock锁进行保护,相对于HashTable的synchronized锁的粒度更精细了一些,并发性能更好,而HashMap没有锁机制,不是线程安全的。(JDK1.8之后ConcurrentHashMap启用了一种全新的方式实现,利用CAS算法。) HashMap的键值对允许有null,但是ConCurrentHashMap都不允许。 ConcurrentHashMap 和 Hashtable 的区别? ConcurrentHashMap 和 Hashtable 的区别主要体现在实现线程安全的方式上不同。 底层数据结构: JDK1.7的 ConcurrentHashMap 底层采用 分段的数组+链表 实现,JDK1.8 采用的数据结构跟HashMap1.8的结构一样,数组+链表/红黑二叉树。Hashtable 和 JDK1.8 之前的 HashMap 的底层数据结构类似都是采用 数组+链表 的形式,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的; 实现线程安全的方式(重要): ① 在JDK1.7的时候,ConcurrentHashMap(分段锁) 对整个桶数组进行了分割分段(Segment),每一把锁只锁容器其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。(默认分配16个Segment,比Hashtable效率提高16倍。) 到了 JDK1.8 的时候已经摒弃了Segment的概念,而是直接用 Node 数组+链表+红黑树的数据结构来实现,并发控制使用 synchronized 和 CAS 来操作。(JDK1.6以后 对 synchronized锁做了很多优化) 整个看起来就像是优化过且线程安全的 HashMap,虽然在JDK1.8中还能看到 Segment 的数据结构,但是已经简化了属性,只是为了兼容旧版本;② Hashtable(同一把锁) :使用 synchronized 来保证线程安全,效率非常低下。当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或轮询状态,如使用 put 添加元素,另一个线程不能使用 put 添加元素,也不能使用 get,竞争会越来越激烈效率越低。 两者的对比图: HashTable: JDK1.7的ConcurrentHashMap: JDK1.8的ConcurrentHashMap(TreeBin: 红黑二叉树节点 Node: 链表节点): 答:ConcurrentHashMap 结合了 HashMap 和 HashTable 二者的优势。HashMap 没有考虑同步,HashTable 考虑了同步的问题。但是 HashTable 在每次同步执行时都要锁住整个结构。 ConcurrentHashMap 锁的方式是稍微细粒度的。 ConcurrentHashMap 底层具体实现知道吗?实现原理是什么? JDK1.7 首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他线程访问。 在JDK1.7中,ConcurrentHashMap采用Segment + HashEntry的方式进行实现,结构如下: 一个 ConcurrentHashMap 里包含一个 Segment 数组。Segment 的结构和HashMap类似,是一种数组和链表结构,一个 Segment 包含一个 HashEntry 数组,每个 HashEntry 是一个链表结构的元素,每个 Segment 守护着一个HashEntry数组里的元素,当对 HashEntry 数组的数据进行修改时,必须首先获得对应的 Segment的锁。 该类包含两个静态内部类 HashEntry 和 Segment ;前者用来封装映射表的键值对,后者用来充当锁的角色;Segment 是一种可重入的锁 ReentrantLock,每个 Segment 守护一个HashEntry 数组里得元素,当对 HashEntry 数组的数据进行修改时,必须首先获得对应的 Segment 锁。 JDK1.8 在JDK1.8中,放弃了Segment臃肿的设计,取而代之的是采用Node + CAS + Synchronized来保证并发安全进行实现,synchronized只锁定当前链表或红黑二叉树的首节点,这样只要hash不冲突,就不会产生并发,效率又提升N倍。 结构如下: 如果该节点是TreeBin类型的节点,说明是红黑树结构,则通过putTreeVal方法往红黑树中插入节点;如果binCount不为0,说明put操作对数据产生了影响,如果当前链表的个数达到8个,则通过treeifyBin方法转化为红黑树,如果oldVal不为空,说明是一次更新操作,没有对元素个数产生影响,则直接返回旧值;如果插入的是一个新节点,则执行addCount()方法尝试更新元素个数baseCount; 辅助工具类 Array 和 ArrayList 有何区别? Array 可以存储基本数据类型和对象,ArrayList 只能存储对象。Array 是指定固定大小的,而 ArrayList 大小是自动扩展的。Array 内置方法没有 ArrayList 多,比如 addAll、removeAll、iteration 等方法只有 ArrayList 有。 对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。 如何实现 Array 和 List 之间的转换? Array 转 List: Arrays. asList(array) ;List 转 Array:List 的 toArray() 方法。 comparable 和 comparator的区别? comparable接口实际上是出自java.lang包,它有一个 compareTo(Object obj)方法用来排序comparator接口实际上是出自 java.util 包,它有一个compare(Object obj1, Object obj2)方法用来排序 一般我们需要对一个集合使用自定义排序时,我们就要重写compareTo方法或compare方法,当我们需要对某一个集合实现两种排序方式,比如一个song对象中的歌名和歌手名分别采用一种排序方法的话,我们可以重写compareTo方法和使用自制的Comparator方法或者以两个Comparator来实现歌名排序和歌星名排序,第二种代表我们只能使用两个参数版的Collections.sort(). 方法如何比较元素? TreeSet 要求存放的对象所属的类必须实现 Comparable 接口,该接口提供了比较元素的 compareTo()方法,当插入元素时会回调该方法比较元素的大小。TreeMap 要求存放的键值对映射的键必须实现 Comparable 接口从而根据键对元素进 行排 序。 Collections 工具类的 sort 方法有两种重载的形式, 第一种要求传入的待排序容器中存放的对象比较实现 Comparable 接口以实现元素的比较; 第二种不强制性的要求容器中的元素必须可比较,但是要求传入第二个参数,参数是Comparator 接口的子类型(需要重写 compare 方法实现元素的比较),相当于一个临时定义的排序规则,其实就是通过接口注入比较元素大小的算法,也是对回调模式的应用(Java 中对函数式编程的支持)。
剑曼红尘 2020-03-24 14:41:57 0 浏览量 回答数 0

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 阿里云AIoT