垃圾收集器
垃圾收集垃圾收集器之间的联系 有连线说明可以搭配使用 年轻代常见的垃圾收集器Serial收集器(-XX:+UseSerialGC,复制算法) 复制算法 单线程收集,进行垃圾收集时,必须暂停所有工作线程 简单高效,Client模式下默认的年轻代收集器 ParNew收集器(-XX:+UseParNewGC,复制算法) 复制算法 多线程收集,其余的行为、特点和Serial收集器一样 单核执行效率不如Serial,在多核下执行才有优势 Parallel Scavenge收集器(-xx:+UseParallelGC) 复制算法 比起关注用户线程停顿时间,更关注系统吞吐量 吞吐量 = 运行用户代码的时间 / (运行用户代码的时间 + 垃圾收集的时间) 在多核下执行才有优势,Server模式下默认的年轻代收集器 老年代常见的垃圾收集器Serial Old收集器(-XX:+UseSerialOldGC) 标记-整理算法 单线程收集,进行垃圾收集时,必须暂停所有工作线程 简单高效,Client模式下默认的老年代收集器 Parallel...
Linux体系结构
Linux体系结构Linux 体系结构分为用户态和内核态 内核:本质上是一段管理计算机硬件设备的程序 系统调用:内核的访问接口,是一种不能再简化的操作 公用函数库:系统调用的组合拳 Shell:命令解释器,可编程 查找特定文件find12# 语法:find path [options] params 在指定目录下查找文件 示例: 1find / -name "target.java" 12# 以target开头 不区分大小写 支持正则表达式 find / -iname "target*" 检索文件内容grep12# 语法:grep [OPTION]... PATTERN [FILE]... 全称:Global Regular Expression Print 作用:查找文件里符合条件的字符串 示例: 12# 从target开头的文件中找包含moo的行grep "moo" target* 12# 通过正则表达式匹配(输入由管道输入)grep -o...
Redis简介
Redis 简介缓存中间件——Memcache 与 Redis 的区别Memcache:代码层次类似Hash 支持简单数据库 不支持持久化 不支持主从 不支持分片 Redis 数据类型丰富 支持持久化 支持主从 支持分片 如果只是简单需要一个key-value缓存,则mencache即可,有高级要求则建议Redis 为什么Redis这么快Redis可以达到100000+QPS(Query per second,每秒查询次数) 完全基于内存,绝大部分请求是纯粹的内存操作,执行效率高 数据结构简单,对数据操作也简单 采用单线程,单线程也能处理高并发请求,想多核也可启动多实例 单线程指网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,其他模块仍用了多个线程。 单线程避免了频繁的上下文切换和锁竞争,也不会出现并发问题。 整个Redis肯定是多线程的,比如持久化写入时就开一个子线程去写入。 使用多路I/O复用模型,非阻塞I/O ...
Redis常用数据类型
Redis 常用数据类型供用户使用的数据类型 String 最基本的数据类型,二进制安全(可以存任何数据,包括图像等) 值最大有512M Hash String元素组成的字典,适合用户存储对象 List 列表,按照String元素插入顺序排列 Set String元素组成的无序集合,通过Hash表实现,不允许重复 Redis对Set提供了求交集并集等操作 Sorted Set(ZSet) 有序集合 每个元素会关联一个double类型的分数 通过分数为集合成员从小到大排序 用于计数的HyperLogLog 用于支持存储地理位置信息的Geo KEYS pattern: 查找所有符合给定模式pattern的key KEYS指令一次性返回所有符合条件的key 键的数量过大会使服务器卡顿 从海量key里查询某一固定前缀的keySCAN cursor [MATCH pattern] [COUNT count] scan每次执行都只会返回少量元素...
持久化方式之RDB
持久化方式之RDBRDB(快照)持久化:保存某个时间节点的全量数据快照Redis配置文件在根目录下的redis.conf 配置文件中RDB相关信息 含义:900秒内有一条写入就产生快照,300秒内有10条写入就产生快照,以此类推 配置二: 设置成yes表示当备份进程出错的时候主进程就停止接受新的写入操作 配置三: 设置成yes就表示在备份时先压缩再保存,建议设置成no RDB的创建与载入生成命令一:SAVE 阻塞Redis的服务进程,直到RDB文件被创建完毕(很少被使用) 生成命令二: BGSAVE Fork一个子进程来创建RDB文件,不阻塞服务器进程 LASTSAVE返回上次保存的时间 自动化触发RDB持久化的方式 根据redis.conf文件中的配置来定时触发(用的BGSAVE) 主从复置时,主节点自动触发 执行Debug Reload时 执行Shutdown且没有开启AOF持久化 BGSAVE原理 执行 bgsave 命令,Redis 父进程判断当前是否存在正在执行的子进程,如 RDB/AOF 子进程,如果存在 bgsave...
AOF持久化
AOF持久化AOF(Append-only-file)持久化:保存写状态 记录除查询以外所有变更数据库状态的指令 以append的形式将命令追加保存在AOF文件中(增量) 配置方法默认关闭,在配置文件中将appendonly no改为appendonly...
Pipline及主从同步
Pipline和主从同步Pipline Pipline和Linux管道类似 Redis基于请求/响应模型,单个请求处理需要一一作答 Pipline批量执行命令,节省多次I/O往返时间 有顺序依赖的指令建议分批发送 Redis同步机制主从同步原理 全量同步过程 Slave发送一个sync同步命令给Master要求全量同步。 Master接收到从服务的sync同步命令时,会fork一个子进程后台执行bgsave命令(非阻塞)快照保存,生成RDB文件。 Master将保存数据快照期间收到的写命令缓存起来 Mater完成写文件操作后将RDB文件发送给Slave Slave将接收到的RDB文件载入自己的redis内存。 待Slave将RDB载入完成后,主服务再将缓冲区所有写命令发送给从服务。 从服务在将主服务所有的写命令载入内存从而实现数据的完整同步。 从服务下次在需要同步数据时只需要发送自己的offset位置(相当于MySQL...
Redis集群
Redis集群如何从海量数据里快速找到所需分片:按照某种规则划分数据,分散存储在多个节点上常规实现方法:按照哈希值与节点数取模来存储 无法实现节点动态增减 一致性Hash算法: 对2^ 32取模,将Hash值空间组织成虚拟圆环 对节点用同方法取Hash 对数据key用同方法算出Hash,算出key在环上的位置 数据key沿环行走,存储在找到的第一台节点中 节点宕机后数据被保存到下一个节点中去 新增节点后数据也会被相应重新保存 缺点 Hash环数据倾斜问题 解决办法: 引入虚拟节点,每个节点计算多个hash,每个hash位置放置一个虚拟节点
有序集合zset_跳表
redis有序集合zset的底层实现——跳跃表skiplist原理 上图用a,b,c,d,e五种有序链表及其变式(变式的名字是我随便起的)说明了跳跃表的motivation. [a]单链表:查询时间复杂度O(n)[b]level-2单链表:每隔一个节点为一个level-2节点,每个level-2节点有2个后继指针,分别指向单链表中的下一个节点和下一个level-2节点。查询时间复杂度为O(n/2)[c]level-3单链表:每隔一个节点为一个level-2节点,每隔4个节点为一个level-3节点,查询时间复杂度O(n/4)[d]指数式单链表:每2^i个节点的level为i+1,查询时间复杂度为O(log2N)[e]跳跃表:各个level的节点个数同指数式单链表,但出现的位置随机,查询复杂度仍然是O(log2N)吗 当数据较少时,sorted set是由一个ziplist来实现的。 当数据多的时候,sorted set是由一个dict +...
spring家族
Spring 家族Spring常见问题总结