poprabbit

学习如何把牛逼落地


  • 首页

  • 标签

  • 归档

redis

发表于 2020-05-19 | 更新于: 2020-05-19
概述Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。 使用场景计数器可以对 String 进行自增自减运算,从而实现计数器功能。 缓存将热点数据放到内存中,设置内存的最大使用量以及淘汰策略来保证缓存的命中率。 会话缓存可以使用 Redis 来统一存储多台应用服务器的会话信息。 分布式锁实现可以使用 Redis 自带的 SETNX 命令实现分布式锁,除此之外,还可以使用官方提供的 RedLock 分布式锁实现。 键的过期时间Redis 可以为每个键设置过期时间,当键过期时,会自动删除该键。 数据淘汰策略(失效策略)可以设置内存最大使用量,当内存使用量超出时,会施行数据淘汰策略。Redis 具体有 6 种淘汰策略:从已设置过期时间的数据集中:volatile-lru,volatile-ttl,volatile-random从所有数据集中:allkeys-lru,allkeys-random,noeviction提高缓存命中率的做法:可以将内存最大使用量设置为热点数据占用的内存量,然后启用 allkeys-lru 淘汰策略,将最近最少使用的数据淘汰。 持久化RDB 持久化(for backups)将某个时间点的所有数据都存放到硬盘上。 ...
阅读全文 »

database

发表于 2020-05-08 | 更新于: 2020-05-08
数据库系统原理事务概念:事务指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚。 原子性(Atomicity)事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。 一致性(Consistency)在一致性状态下,所有事务对同一个数据的读取结果都是相同的。 隔离性(Isolation)一个事务所做的修改在最终提交以前,对其它事务是不可见的。 持久性(Durability)一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。 事务的 ACID 特性概念简单,但不是很好理解,主要是因为这几个特性不是一种平级关系: 只有满足一致性,事务的执行结果才是正确的。 在无并发的情况下,事务串行执行,隔离性一定能够满足。此时只要能满足原子性,就一定能满足一致性。 在并发的情况下,多个事务并行执行,事务不仅要满足原子性,还需要满足隔离性,才能满足一致性。 事务满足持久化是为了能应对系统崩溃的情况。 并发一致性问题 丢失修改:丢失修改指一个事务的更新操作被另外一个事务的更新操作替换。 读脏数据:读脏数据指在不同的事务下,当前事务可以读到另外事务未提交的数据。 不可重复读:不可重复读指在一个事务内多次读取同一数据集合。 幻影读:幻读本质 ...
阅读全文 »

JVM 类文件及类加载

发表于 2020-05-05 | 更新于: 2020-05-05
类加载机制类加载过程包含了加载、验证、准备、解析和初始化这 5 个阶段。 加载从 类的二进制字节流 到 内存中一个代表该类的 Class 对象 验证确保 Class 文件的字节流中包含的信息符合当前虚拟机的要求 准备类变量是被 static 修饰的变量,准备阶段为类变量分配内存并设置初始值,使用的是方法区的内存。 解析将常量池的符号引用替换为直接引用的过程。其中解析过程在某些情况下可以在初始化阶段之后再开始,这是为了支持 Java 的动态绑定。 初始化初始化阶段才真正开始执行类中定义的 Java 程序代码。初始化阶段是虚拟机执行类构造器 () 方法的过程。 类初始化时机 主动引用虚拟机规范严格规定了有且只有下列五种情况必须对类进行初始化(加载、验证、准备都会随之发生): 遇到 new、getstatic、putstatic、invokestatic 这四条字节码指令时; 使用 java.lang.reflect 包的方法对类进行反射调用的时候; 当初始化一个类的时候,如果发现其父类还没有进行过初始化; 当虚拟机启动时,用户需要指定一个要执行的主类(包含 main() 方法的那个类); 当使用 JDK 1.7 的动态语言支持时; 被动引用(不会触发初始化) 通过子类引用父类的静态字段,不会导致子类初始化。 通过数组定义来引用类。 常量在编译阶段会存入调用 ...
阅读全文 »

threadpool

发表于 2020-04-29 | 更新于: 2020-05-01
BlockingQueue是一个先进先出的队列(Queue),为什么说是阻塞(Blocking)的呢?是因为 BlockingQueue 支持当获取队列元素但是队列为空时,会阻塞等待队列中有元素再返回;也支持添加元素时,如果队列已满,那么等到队列可以放入新元素时再放入。 BlockingQueue 对插入操作、移除操作、获取元素操作提供了四种不同的方法用于不同的场景中使用,我们的关注点应该在 put(e) 和 take() 这两个方法,因为这两个方法是带阻塞的。 BlockingQueue 不接受 null 值的插入 可以是有界的,也可以是无界的(容量为Integer.MAX_VALUE) BlockingQueue 的实现都是线程安全的(除批量操作),常用于生产者-消费者的场景中。 ArrayBlockingQueue底层是数组,有界队列,如果我们要使用生产者-消费者模式,这是非常好的选择。 LinkedBlockingQueue底层是单项链表,可以当做无界和有界队列来使用,使用两个锁来实现线程安全。takeLock 和 notEmpty 搭配 – putLock 和 notFull 搭配 (唤醒对方的设计比较特别) SynchronousQueue读线程和写线程需要同步,本身不带有空间来存储任何元素,使用上可以选择公平模式和非公平模式。tra ...
阅读全文 »

AbstractQueuedSynchronizer

发表于 2020-04-20 | 更新于: 2020-04-20
AbstractQueuedSynchronizer是 Java 并发包的基础工具类,是实现 ReentrantLock、CountDownLatch、CyclicBarrier、Semaphore、FutureTask 等类的基础属性如下: // 头结点,你直接把它当做 当前持有锁的线程private transient volatile Node head;// 阻塞的尾节点,每个新的节点进来,都插入到最后,也就形成了一个链表private transient volatile Node tail;// 这个是最重要的,代表当前锁的状态,0代表没有被占用,大于 0 代表有线程持有当前锁// 这个值可以大于 1,是因为锁可以重入,每次重入都加上 1private volatile int state;// 代表当前持有独占锁的线程,举个最重要的使用例子,因为锁可以重入private transient Thread exclusiveOwnerThread; //继承自AbstractOwnableSynchronizer 其内部维护了一个等待队列 –包含头节点及阻塞队列 –由Node 组成的双向链表 Node 的结构简介 // 取值为上面的1、-1、-2、-3,或者0(以后会讲到)// 这么理解,暂时只需要知道如果这个值 大于0 代表此线程取消了等待,// ...
阅读全文 »
1…34
popular rabbit

popular rabbit

java

35 日志
13 标签
0%
© 2021 popular rabbit
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4