# 知识点
Memcached是一个自由开源的、高性能、分布式内存对象存储系统。本质上,它是一个简洁的key-value存储系统。
Libevent是一个用c语言编写的轻量级的开源高性能事件通知库。事件驱动。高性能轻量级。专注于网络。
Memcached本身不提供分布式解决方案。分步式是由客户端实现的。
Redis 与其他 key - value 缓存产品有以下三个特点:(持多备-吃多呗)
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。(Zset就是有序集合,除了集合的特性外还对每一个集合元素添加了一个顺序的属性。)
Redis支持数据的备份,即master-slave模式的数据备份。
Redis 优势(高多原富-搞多元富了)
性能极高 – Redis能读的速度是110k次/s,写的速度是81k次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Linux yum install ***
Ubuntu sudo apt-get install ***
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。因为有了对字符串长度定义len, 所以在处理字符串时候不会以零值字节(\0)为字符串结尾标志。二进制安全就是输入任何字节都能正确处理, 即使包含零值字节。Redis 在 2.8.9 版本添加了 HyperLogLog 结构。Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
减少上下文切换的方法,有无锁并发编程,CAS算法,使用最少线程,使用协程。
volatile:java语言允许线程访问共享变量,为了确保共享变量能够被准确和一致的更新,线程应该确保通过排他锁,单独获得这个变量。
java内存模型(JMM):JMM定义了线程和主内存之间的抽象关系,线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存中存储了该线程已读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在,它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。
从java源代码到最终实际执行的指令序列会经历编译器优化重排,指令级并行重排,内存系统重排。(编指内-编制内)
顺序一致性内存模型是一个理论参考模型,JMM和处理器内存模型在设计时,通常会以顺序一致性内存模型为参照。可以把常见处理器的内存模型划分为以下几种,TSO,PSO,RMO和Power PC。
java通过Executors提供四种线程池,分别是newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。newFixedThreadPool,创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。newScheduledThreadPool创建一个定长线程池,支持定时及周期性任务执行。newSingleThreadExecutor创建一个单线程化的线程池,他只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序优先级执行。(缓定调单)
ThreadLocal-线程局部变量,为每一个使用该变量的线程都提供一个变量的副本,是java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突。
Redis集群采用哈希槽进行数据的分配,默认分配了16384个哈希槽。当我们set的一个key,会使用crc16算法来取模得到所属的哈希槽,然后将这个可以分配到对应的哈希槽节点上,具体算法就是csc16(key)%16384。
spring boot习惯优于配置。
map映射reduce归约。MR是一种编程模型,用于大规模数据集的并行运算。
spring cloud为开发人员提供了快速构建分布式系统中的一些常见模式的工具,例如配置管理,服务发现,断路器,智能路由,微代理,控制总线。云原生是一种应用开发风格,鼓励在持续交付和价值驱动开发领域轻松采用最佳实践。
Java虚拟机所管理的内存将会包含以下几个运行时数据区:方法区,虚拟机栈,本地方法栈,堆,程序计数器。程序计数器是一块较小的内存空间,是当前线程所执行的字节码的行号指示器。java虚拟机栈描述的是java方法执行的内存模型,每个方法在执行的同时,都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出入口等信息。本地方法栈为虚拟机使用的native方法服务。java堆是java虚拟机所管理的内存中最大的一块,此区域唯一的目的就是存放对象实例。方法区与java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。运行时常量池是方法区的一部分。直接内存并不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域。