Redis哈希槽和一致性哈希 我们想提升系统的容量、性能和可靠性,就会将数据分散到多个节点来存储或备份,也就是集群部署。那么,一个存储数据应该到哪个或哪些节点上来获得,应该是确定的。如果通过简单的取模算法将数据请求分散到了不同的服务器节点上,会有一个很致命的问题,如果节点数量发生了变化,也就是在对系统做扩容或者缩容时,必须迁移改变了映射关系的数据,否则会出现查询不到数据的问题。
【MAVEN】Maven配置过程及“‘mvn‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件”问题处理 网上有多种解决方案,但我试了都没成功,一个是检查自己下载、解压的文件有没有bin目录,另一个我把path那里写了Maven的绝对路径,问题得到解决。我windows环境下载的是第二行bin.zip,src.zip的文件解压后并没有bin目录。查看高级系统配置,找到环境变量,在系统变量加上。记录配置Maven过程及遇到的一点问题。按理就已经成功了,但有可能出现如下问题。在系统变量的path再添加一行。
【MySQL】分库分表问题 比如数据库拆分后,订单和库存在两个库中,一个下单减库存的操作,就涉及跨库事务。分库分表以后,数据分散存储到不同的数据库和表中,如果查询指定数据列表,或者需要对数据列表进行排序时,就变得异常复杂,则需要在内存中进行处理,整体性能会比较差,一般来说,会限制这类型的操作。将原本存储于单个数据库上的数据拆分到多个数据库,把原来存储在单张数据表的数据拆分到多张数据表中,实现数据切分,从而提升数据库操作性能。数据库主键:实现简单,单调递增,具有一定的业务可读性,强依赖db、存在性能瓶颈,存在暴露业务信息的风险。
【Java多线程】Future类使用 Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果等操作。它代表是异步执行的结果,意思是当异步执行结束之后,返回的结果将会保存在Future中。当我们提交一个Callable任务后,我们会同时获得一个Future对象,然后,我们在主线程某个时刻调用Future对象的get()方法,就可以获得异步执行的结果。在调用get()时,如果异步任务已经完成,我们就直接获得结果。如果异步任务还没有完成,那么get()会阻塞,直到任务完成后才返回结果。
【Java多线程】volatile与内存屏障详解 volatile读的内存语义:读一个volatile变量时,JMM会把线程对应的工作内存中共享变量数据设置为无效的,然后会从主内存中去读取共享变量最新的数据。禁止上面的volatile写和下面的volatile读/写或普通写操作重排序,前面所有的volatile写的操作,数据都已经刷新到主内存。volatile写:针对的是volatile的变量,在写的时候,是把volatile变量的值,从工作内存刷新到主内存。是一种屏障指令,它使得CPU或编译器对屏障指令的前和后所发出的内存操作,执行一个排序的约束。
【Java多线程】线程池探究 线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。本文学习记录的线程池是JDK中提供的ThreadPoolExecutor类。
【Java多线程】Synchronized和lock底层剖析 Compare and Swap,翻译成比较并交换。执行函数CAS(V,E,N),3个操作数,内存值V,旧的预期值E,要修改的新值N。当且仅当预期值E和内存值V相同时,将内存值V修改为N,否则什么都不做。AQS核心思想是,如果被请求的共享资源空闲,那么就将当前请求资源的线程设置为有效的工作线程,将共享资源设置为锁定状态;如果共享资源被占用,就需要一定的阻塞等待唤醒机制来保证锁分配。这个机制主要用的是CLH队列的变体实现的,将暂时获取不到锁的线程加入到队列中。
【Redis持久化】RDB快照和AOF日志 Redis默认是把所有的数据都存在内存中的。但是当服务器重启或程序异常崩溃时,Redis的数据就会全部丢失。因此出现了持久化的概念。持久化就是将存在内存中的数据同步到磁盘来保证持久化。Redis 的一种持久化方式叫快照(snapshotting,RDB),另一种方式是只追加文件(append-only file, AOF)。
【JVM】垃圾回收器 串行回收器:Serial,Serial old;并行回收器:ParNew,Parallel scavenge,Parallel old;并发回收器:CMS、G1;新生代收集器:Serial,ParNew,Parallel scavenge;老年代收集器:Serial old,Parallel old, CMS;整堆收集器:G1;
【数据库/MySQL】MySQL三大日志提要 主体主要参考自Javaguide对应章节Javaguide中的总结:MySQL InnoDB 引擎使用redo log(重做日志)保证事务的持久性,使用undo log(回滚日志)来保证事务的原子性。MySQL数据库的数据备份、主备、主主、主从都离不开binlog,需要依靠binlog来同步数据,保证数据一致性。
【消息队列】关于消息队列的一些面试问题 生产者投递消息的速率>消费者消费的速率,导致我们消息会堆积在我们 mq 服务器端中,没有及时的被消费者消费,所以就会产生消息堆积的问题。1.多线程方式实现异步可能会消耗到我们的 cpu 资源,可能会影响到我们业务线程执行会发生 cpu 竞争的问题;背景:mq服务器集群或者mq采用分区模型架构存放消息,每个分区对于一个消费者消费消息。消费者获取消息,如果消费消息失败, mq 服务器则会间隔的形式 实现重试策略;rabbitmq 消费者我们的消息消费如果成功,消息会被立即删除。A.提高消费者消费的速率;
CentOS搭建dns服务 BIND(Berkeley InternetName Daemon)是现今互联网上最常使用的DNS服务器软件,使用BIND作为服务器软件的DNS服务器约占所有DNS服务器的九成。BIND现在由互联网系统协会(Internet Systems Consortium)负责开发与维护。此组织还维护一个很有名的软件DHCP。我们使用时安装软件名为bind,而进程名和用户名为named。修改dns服务器ip,ping www.test.com进行测试。,原文中内网实验成功,我在公网服务器实验失败。
【Java基础】String & StringBuffer & StringBuilder 方法时,实际传递的是引用的一个拷贝。其实,每当把 String 对象作为方法的参数时,都会复制一份引用,而该引用所指向的对象其实一直待在单一的物理位置上,从未动过。Java 语言本身并不支持运算符重载,“+”和“+=”是专门为 String 类重载过的运算符,也是 Java 中仅有的两个重载过的运算符。的返回值,其实是最终结果的引用。是 Java SE5 引入的,在这之前用的是。值的方法,实际上都是创建了一个全新的。返回的引用已经指向了一个新的对象,而。的定义,传入其中的引用有了名字。
【网络安全】ICMP隐蔽隧道通信与检测 在一些网络环境中,如果攻击者使用各类上层隧道(例如HTTP隧道,DNS隧道,正反向端口转发等)进行操作均失败。那么可以尝试使用ICMP建立隧道,ICMP协议不需要端口的开放,因为其基于IP工作的,所以我们将其归结到网络层,ICMP消息最为常见的就是ping命令的回复,将TCP/UDP数据包封装到ICMP的ping数据包中,从而穿过防火墙**(通常防火墙是不会屏蔽ping数据包的)**
【MySQL】事务与MVCC 在计算机术语中事务是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。数据库事务可以保证多个对数据库的操作(也就是 SQL 语句)构成一个逻辑上的整体。