动态规划
动态规划问题的一般形式就是求最值 求解动态规划的核心问题是穷举 把大的问题细化到一个点,先研究在这个小的点上如何解决问题,然后再通过递归/迭代的方式扩展到整个问题 *定义 dp 数组/函数的含义 -> 明确 base case -> 明确「状态」-> 明确「选择」 * 自顶向下递归的动态规划 def dp(状态1, 状态2, ...): for 选择 in 所有可能的选择: 此时的状态已经因为做了选择而改变 result = 求最值(result, dp(状态1, 状态2, ...)) ...
Java并发(二)Java并发理论基础
为什么需要多线程 更多的处理核心:线程是一个处理器的最小调度单位,而一个线程同一时间只能运行在一个处理器核心上,单线程无法利用多个处理核心的优势。 异步执行更快:对一致性要求不高的操作,方便业务拆分,把不同业务单独放一个线程,异步执行,速度更快。 并发编程有什么缺点 并发编程的目的就是为了能提高程序的执行效率,提高程序运行速度 但是并发编程并不总是能提高程序运行速度的,而且并发编程可能会遇到很多问题,比如:内存泄漏、上下文切换、线程安全、死锁等问题。 什么是线程上下文切换 CPU通过时间片分配算法来循环执行线程任...
Java并发(一)Java线程基础
线程 线程和进程区别? 进程:一个在内存中运行的应用程序,每个正在系统上运行的程序都是一个进程 线程:进程中的一个执行任务(控制单元),它负责在程序里独立执行。 一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。 根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位 当我们运行一个可执行程序的时候,就会创建一个或多个进程,创建进程的时候需要分配空间,比如:栈区、文件映射区、堆区、静态区、常量区、代码段,因此也会说进程是资源分配的最小单位 线程则是程序执行的基本单位,每...
Redis(七)高可用
AOF 和 RDB,这两个持久化技术保证了即使在服务器重启的情况下也不会丢失数据(或少量损失)。 不过,由于数据都是存储在一台服务器上,会出现单点故障。解决的最好办法是将数据备份到其他服务器上,让这些服务器也可以对外提供服务,这样即使有一台服务器出现了故障,其他服务器依然可以继续提供服务。 多台服务器要保存同一份数据,这些服务器之间的数据如何保持一致性? 主从复制 主从服务器之间采用的是「读写分离」的方式。 主服务器可以进行读写操作,当发生写操作时自动将写操作同步给从服务器,而从服务器一般是只读。 ![](https://img.taitres.com/uploads/20...
Redis(六)缓存场景应用
缓存异常✨✨✨ 缓存雪崩 当大量缓存数据在同一时间过期(失效)或者 Redis 故障宕机时,如果此时有大量的用户请求,都无法在 Redis 中处理,于是全部请求都直接访问数据库,从而导致数据库的压力骤增,严重的会造成数据库宕机,从而形成一系列连锁反应,造成整个系统崩溃,这就是缓存雪崩的问题。 大量数据同时过期 针对大量数据同时过期而引发的缓存雪崩问题,常见的应对方法有下面这几种: 1. 均匀设置过期时间 如果要给缓存数据设置过期时间,应该避免将大量的数据设置成同一个过期时间。我们可以在对缓存数据设置过期时间时,**给这些数据的过期时间加上一...
批量插入假数据效率对比
1. 每条数据都执行建立连接,插入数据,关闭连接 @Resource private UserMapper userMapper; public void insertUsers() { StopWatch stopWatch = new StopWatch(); stopWatch.start(); final int INSERT_NUM = 100000; for (int i = 0; i < INSERT_NUM; i++) { User user = new User(); user.se...
Redis(五)过期删除和内存淘汰
过期删除策略有哪些? Redis 是可以对 key 设置过期时间的,因此需要有相应的机制将已过期的键值对删除,而做这个工作的就是过期键值删除策略。 在说 Redis 过期删除策略之前,先介绍下,常见的三种过期删除策略: 定时删除**(在设置 key 的过期时间时,同时创建一个定时事件,当时间到达时,由事件处理器自动执行 key 的删除操作); 优点: 可以保证过期 key 会被尽快删除,也就是内存可以被尽快地释放。因此,定时删除对内存是最友好的 缺点: 在过期 key 比较多的情况下,删除过期 key 可能会占用相当一部分 C...
Redis(四)线程模型
Redis单线程的含义 Redis 单线程指的是「接收客户端请求->解析请求 ->进行数据读写等操作->发生数据给客户端」(网络 IO 以及键值对指令读写是由一个线程来执行的)这个过程是由一个线程(主线程)来完成的,这也是我们常说 Redis 是单线程的原因。 但实际还有一些后台线程(BIO)用于执行一些比较耗时的操作。 后台线程相当于一个消费者,生产者把耗时任务丢到任务队列中,消费者(BIO)不停轮询这个队列,拿出任务就去执行对应的方法即可。 关闭文件、AOF 刷盘、释放内存这三个任务都有各自的任务队列: BIO_CLOSE_FILE,关闭文件任务队列...
Redis(三)持久化
使用缓存的时候,我们经常需要对内存中的数据进行持久化也就是将内存中的数据写入到硬盘中。大部分原因是为了之后重用数据(比如重启机器、机器故障之后恢复数据),或者是为了做数据同步(比如 Redis 集群的主从节点通过 RDB 文件同步数据)。 Redis 不同于 Memcached 的很重要一点就是,Redis 支持持久化,而且支持 3 种持久化方式: 快照(snapshotting,RDB) 只追加文件(append-only file,AOF) RDB 和 AOF 的混合持久化(Redis 4.0 新增) RDB 持久化 什么是 RDB 持久化 RDB持久化...
Redis(二) 数据类型和数据结构
Redis 常见数据类型和应用场景✨✨✨ 五种常见数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。 四种特殊数据类型: BitMap(位图,2.2 版新增)、HyperLogLog(基数统计,2.8 版新增)、GEO(地理位置,3.2 版新增)、Stream(流,5.0 版新增) Redis 五种常见数据类型的应用场景: String 类型的应用场景:缓存对象、常规计数、分布式锁、共享 session 信息等; List 类型的应用场景:消息队列(但是有两个问题:1. 生产者需要自行实现全局唯一...