练习
二进制数转字符串
二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。
示例1:
输入:0.625
输出:"0.101"
示例2:
输入:0.1
输出:"ERROR"
提示:0.1无法被二进制准确表示
提示:
32位包括输出中的 "0." 这两位。
题目保证输入用例的小数位数最多只有 6 位
class Solution {
public String printBin(double num) {
StringBuffer item=new StringBuffer("0.");
while (item.length()<=32&&num!=0) {
num = num*2;
if (num <1) {
item.append("0");
}else {
num--;
item.append("1");
}
}
if (num==0){
return item.toString();
}
return "ERROR";
}
}
解释
如果0.625乘以2 是1.25 就是1+1/2^2 对应的二进制是1.01
而 0.101对应二倍就是1.01 所以 得出结论
在二进制表示中,将一个数乘以 2 的效果是将小数点向右移动一位。
因此 只要每次将实数乘2 整数添加到字符串中 然后让整数变成0
重复乘2的操作直到num变成0或者循环结束(超出32位)
循环结束
总结
自己写这题第一反应就是让他们除,然后从后往前取余数,后来写了一会发现,是小数......
本题的目标是小数 这时候就想起来
小数跟整数部分不太一样 整数部分是除2取余 小数部分是乘2取整
随后又改了....
本来很简单的题,却让我用时接近1小时了
一是马虎没读好题 二是基础差 三是见的题还是少了 希望下次能二十分钟解决
八股
哪些集合类是线程安全的?
vector 比arraylist多了线程安全
hashtable 比hashmap多了线程安全
statck 堆栈先出后出
迭代器 Iterator 是什么?
是一种设计模式,是一个对象,可以编列并选择序列的对象
Iterator 怎么使用?有什么特点?
是java迭代器最简单方便的实现,next获得下一个元素
remove删除元素 hastnext查看是否还有元素
Iterator 和 ListIterator 有什么区别
listiterator实现了lterator接口,并增加了不同与lierator的功能
例如增加元素和替换元素 同时可以双向获取元素 不仅限于一个方向遍历
RabbitMQ第六天大结局
幂等性
简单说就是消息重复消费,也就是发了两条
解决思路
加一个判断 写一个全局唯一id
唯一ID加指纹码
指纹码:我们的一些规则或者时间戳加别的服务给到的唯一信息码,它并不一定是我们系统生成的,基
本都是由我们的业务规则拼接而来,但是一定要保证唯一性,然后就利用查询语句进行判断这个 id 是否存在数据库中,优势就是实现简单就一个拼接,然后查询判断是否重复;劣势就是在高并发时,如果是单个数据库就会有写入性能瓶颈当然也可以采用分库分表提升性能,但也不是我们最推荐的方式。
redis原子性
利用 redis 执行 setnx 命令,天然具有幂等性。从而实现不重复消费
优先级队列
![](https://i-blog.csdnimg.cn/blog_migrate/1287f289c79634213d3eb6f42cadd33d.png)
例如大客户顶点 大客户优先处理
默认先进先出
而优先级队列0-255 越大越优先执行
![](https://i-blog.csdnimg.cn/blog_migrate/09dbc0518afb4a63b15f3454c1d22560.png)
生产者 设置x-max-priority
HashMap<String, Object> arguments = new HashMap<>();
arguments.put("x-max-priority",10);//官方允许0-255 此处10 就允许优先级范围是0-10
//不要设置过大 浪费cpu与内存
channel.queueDeclare(QUEUE_NAME,true,false,false,arguments);
for (int i = 0; i < 11; i++) {
String message="info "+i;//发消息 初次使用不考虑交换机
if(i==5){
AMQP.BasicProperties properties
=new AMQP.BasicProperties().builder().priority(5).build();
channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
}
}
结果
info5排在最前面
惰性队列
正常情况消息保存在内存中
惰性队列消息保存在磁盘中
当消费者由于各种各样的原因(比如消费者下线、宕机亦或者是由于维护而关闭等)而致
使长时间内不能消费消息造成堆积时,惰性队列就很有必要了。
队列具备两种模式:default 和 lazy。默认的为 default 模式
在队列声明的时候可以通过“x-queue-mode”参数来设置队列的模式,取值为“default”和“lazy”。下面示
例中演示了一个惰性队列的声明细节:
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-queue-mode", "lazy");
channel.queueDeclare("myqueue", false, false, false, args);
在发送 1 百万条消息,每条消息大概占 1KB 的情况下,普通队列占用内存是 1.2GB,而惰性队列仅仅
占用 1.5MB(其实就是只剩下索引)
集群
最开始我们介绍了如何安装及运行 RabbitMQ 服务,不过这些是单机版的,无法满足目前真实应用的
要求。如果 RabbitMQ 服务器遇到内存崩溃、机器掉电或者主板故障等情况,该怎么办?单台 RabbitMQ
服务器可以满足每秒 1000 条消息的吞吐量,那么如果应用需要 RabbitMQ 服务满足每秒 10 万条消息的吞吐量呢?购买昂贵的服务器来增强单机 RabbitMQ 务的性能显得捉襟见肘,搭建一个 RabbitMQ 集群才是
解决实际问题的关键
docker使用 创建集群教程
镜像队列
为了集群 例如1号机的创建了队列 2号机3号机是没有队列的 只是共用
为了备份
![](https://i-blog.csdnimg.cn/blog_migrate/bf0e6fabb8bbb74ea07c7db5ab0a90cd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e3b471d74061751cf0faaeb1bbaae29d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b7c7abf22f698d1fa75d34adc8571543.png)
Haproxy+Keepalive 实现高可用负载均衡
。。。。
Federation Exchange联合交换机
(broker 北京),(broker 深圳)彼此之间相距甚远,网络延迟是一个不得不面对的问题。有一个在北京
的业务(Client 北京) 需要连接(broker 北京),向其中的交换器 exchangeA 发送消息,此时的网络延迟很小,
(Client 北京)可以迅速将消息发送至 exchangeA 中,就算在开启了 publisherconfirm 机制或者事务机制的
情况下,也可以迅速收到确认信息。此时又有个在深圳的业务(Client 深圳)需要向 exchangeA 发送消息,
那么(Client 深圳) (broker 北京)之间有很大的网络延迟,(Client 深圳) 将发送消息至 exchangeA 会经历一
定的延迟,尤其是在开启了 publisherconfirm 机制或者事务机制的情况下,(Client 深圳) 会等待很长的延
迟时间来接收(broker 北京)的确认信息,进而必然造成这条发送线程的性能降低,甚至造成一定程度上的
阻塞。
将业务(Client 深圳)部署到北京的机房可以解决这个问题,但是如果(Client 深圳)调用的另些服务都部
署在深圳,那么又会引发新的时延问题,总不见得将所有业务全部部署在一个机房,那么容灾又何以实现?
这里使用 Federation 插件就可以很好地解决这个问题
Federation Queue
联邦队列可以在多个 Broker 节点(或者集群)之间为单个队列提供均衡负载的功能。一个联邦队列可以
连接一个或者多个上游队列(upstream queue),并从这些上游队列中获取消息以满足本地消费者消费消息
的需求。
Shovel
Federation 具备的数据转发功能类似,Shovel 够可靠、持续地从一个 Broker 中的队列(作为源端,即
source)拉取数据并转发至另一个 Broker 中的交换器(作为目的端,即 destination)。作为源端的队列和作
为目的端的交换器可以同时位于同一个 Broker,也可以位于不同的 Broker 上。Shovel 可以翻译为"铲子",
是一种比较形象的比喻,这个"铲子"可以将消息从一方"铲子"另一方。Shovel 行为就像优秀的客户端应用
程序能够负责连接源和目的地、负责消息的读写及负责连接失败问题的处理。
总结下 后面四个东西 去看课吧 或者看搭建步骤,感觉一般程序员也用不上,或者到用上了也到该重学了
nginx安装
安装vm 然后centos ....
....
说实话,照着尚硅谷大佬的课看了会
发现没有用docker
我不是docker吹,而是我感觉,配一下午或者一天环境那种滋味是人能受得了的吗
配环境也得看教程 而且我记得我一开始学java在机房学会了,等回宿舍后自己配那就是另一回事了
b站弹幕战争挺严重的 一方面要docker一方面要严格按照课走
看着有点头疼
不过我还是想用docker安装学习,即使未来进个公司没用docker安装,我再看原始教程再说
至于安装 网上太多了 明天继续