书接上文,java代码和系统调用有一定的关系,Java是解释型语言(Java并不值钱,值钱的是jvm),我们所写的java代码最终都编译成字节码,然后去进行系统调用,本文我们还是从一个简单的服务端程序学习理解下io。
java程序运行时发生的系统调用
程序无法直接访问数据(硬件:磁盘、网卡),程序需要通过内核访问,内核提供syscall,syscall的方法不能直接调用(保护模式),所以就有了软中断,中断作用在cpu中,cpu收到中断后,cpu会根据中断号去内核中找对应的callback…
java的IO与NIO
Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。
redis内存空间效率问题
在使用redis时,我们会遇到一个问题,数据删除后,数据量已经不大了,但是使用top命令查看,还会发现redis占用了很对内存。实际上,因为数据删除后,redis释放内存由内存分配器管理,不会立刻返回给操作系统。所以,操作系统仍然记录着给redis分配了大量的内存
redis哨兵集群,主从库切换
redis主从模式的集群,如果从库发生故障,客户端可以继续向主库或其他从库发送请求,但是如果主库发生故障了,那就直接会影响到从库的同步,因为从库没有相应的主库可以进行数据复制操作了
为什么单线redis可以那么快
redis的单线程主要是指redis的网路IO和键值对读写是由一个线程完成的,这也是redis对外提供键值存储服务的主要流程,但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。
zookeeper伪分布式集群环境搭建
伪分布式集群就是在一台机器部署多个zk应用,部署之前服务器需要有jdk环境 java -version可以显示相关java信息才可以进行zookeeper搭建,本文是基于macOs搭建