博文

目前显示的是 五月, 2020的博文

Future异步执行 - 掘金

图片
Future异步执行 - 掘金 pipi蛋 2020年05月26日 阅读 43 Future异步执行 前言 随着业务的发展,系统的功能也越来越多,这时候很多业务操作就需要异步执行,提高效率。大多时候,我们都可以采用线程池来实现异步执行的需求,但是,有时候主流程需要等待其他任务执行完以后才能继续执行,又或者是主流程需要知道其他任务执行的结果,这时候,就需要采用线程的合并了。 在讲线程合并之前,我们先来看看平时使用Thread是怎么实现主线程等待其他线程的。 join合并线程 当一个线程需要等待其他线程执行完再继续执行的时候,我们可以使用join或者是CountDownLatch,这里只说join,CountDownLatch前面的文章已经说过,这里不再赘述。 当线程A调用线程B的join方法时,线程A会阻塞,直到线程B执行完以后才继续执行。 下面举个简单例子:下班回家,煮饭、做菜和烧水这些日常操作是怎么用多线程来实现的。下面是具体流程: 主线程需要等待煮饭线程和烧水线程执行完才能继续下面的吃饭喝水操作。下面我们看看代码是怎么实现的 java public class JoinDemo { static class RiceThread extends Thread { @Override public void run () { try { System.out.println(Thread.currentThread().getName() + "开始煮饭" ); Thread.sleep( 10 * 1000 ); System.out.println(Thread.currentThread().getName() + "饭煮好了" ); } catch (InterruptedException e) { e.printStackTrace(); } } } ...

Redis 6.0更新放大招:客户端缓存怎么用好 - 掘金

图片
Redis 6.0更新放大招:客户端缓存怎么用好 - 掘金 java梦想口服液 2020年05月20日 阅读 284 Redis 6.0更新放大招:客户端缓存怎么用好 近日 Redis 6.0.0 GA 版本发布,这是 Redis 历史上最大的一次版本更新,包括了客户端缓存 (Client side caching)、ACL、Threaded I/O 和 Redis Cluster Proxy 等诸多更新。 我们今天就依次聊一下客户端缓存的必要性、具体使用、原理分析和实现。 为什么需要客户端缓存 我们都知道,使用 Redis 进行数据的缓存主要目的是减少对 MySQL 等数据库的访问,提供更快的访问速度,毕竟 《Redis in Action》中提到的, Redis 的性能大致是普通关系型数据库的 10 ~ 100 倍。 所以,如下图所示,Redis 用来存储热点数据,Redis 未命中,再去访问数据库,这样可以应付大多数情况下的性能要求。 但是,Redis 也有其性能上限,并且访问 Redis 必然有一定的网络 I/O 以及序列化反序列化损耗。所以,往往会引入进程缓存,将最热的数据存储在本地,进一步加快访问速度。 如上图所示(示意图,细节不必过度在意,下同),Guava Cache 等进程缓存作为一级缓存,Redis 作为二级缓存: 先去 Guava Cache 中查询数据,如果命中则直接返回。 Guava Cache 中未命中,则再去 Redis 中查询,如果命中则返回数据,并在 Guava Cache 中设置此数据。 Redis 也未命中的话,只有去 MySQL 中查询,然后依次将数据设置到 Redis 和 Guava Cache 中。 只使用 Redis 分布式缓存时,遇到数据更新时,应用程序更新完 MySQL 中的数据,可以直接将 Redis 中对应缓存失效掉,保持数据的一致性。 而进程内缓存的数据一致性比分布式的缓存面临更大的挑战。数据更新的时候,如何通知其他进程也更新自己的缓存呢? 如果按照分布式缓存的思路,我们可以设置极短的缓存失效时间,这样不必实现复杂的通知机制。 但是不同进程内的数据依然会面临不一致的问题,并且不同进程缓存失效时间不统一,同一个请...

Hello!GitHub 好用好玩值得收藏的开源项目集合~ - 掘金

图片
Hello!GitHub 好用好玩值得收藏的开源项目集合~ - 掘金 Kerwin_ 2020年05月20日 阅读 859 Hello!GitHub 好用好玩值得收藏的开源项目集合~ ❝ 「 这是我许久以来从各处发现的极佳开源项目,希望分享给大家~ 如果帮到你了,给我个赞啦 」 ❞ 编程语言类 ❤️learn-go-with-tests(通过单元测试学Go) GitHub地址:https://ift.tt/2p0PQCA 通过单元测试学习 Go 语言。下载仓库源码后,进入对应目录。每一个小文件夹就是一个对应的 Go 项目,在里面 go test 即可运行单元测试。由于是测试驱动开发,所以需要在你改动代码之后跑通单元测试才算学会通过。每一个对应的文件夹都有相应 Markdown 文字教程,比较浅显易懂。而且还有中文版:https://ift.tt/2zRHPZ6 ❤️500LineorLess_CN(500行Python代码能做什么) GitHub地址:https://ift.tt/2c0dB5v 500 line or less 中文翻译计划。 ❤️awesome-leetcode(各大 IT 公司的算法面试题) GitHub地址:https://ift.tt/2A5PIpm LeetCode of algorithms with java solution(updating). ❤️BrowserQuest(JavaScript多人在线游戏) GitHub地址:https://ift.tt/HeoU76 前端类 ❤️fe-interview(每天四道前端面试题) GitHub地址:https://ift.tt/2Yeudy5 万人Star 每天早上 4 个基础前端面试题,助你在前端面试中‘所向披靡,无人能挡 ❤️vuepress( Vue 官方出品的静态网站生成器 ) 演示地址:https://ift.tt/2Hiw2VB GitHub地址:https://ift.tt/2GXCcuS Vue 官方出品的静态网站生成器。大家的个人博客是不是要折腾一番了? 官方中文文档 Vue-Form-Making(Vue拖拽生成器) 基于Vue的可视化表单设计器,让表单开发简单而...

Spring的IOC,你真的能解释清楚吗? - 掘金

图片
Spring的IOC,你真的能解释清楚吗? - 掘金 LinkedBear 2020年05月18日 阅读 308 Spring的IOC,你真的能解释清楚吗? 一直以来,SpringFramework 作为 Java 企业级开发的老大哥,面试中也常被问到。虽说有些基础性的问题可能不那么特别被面试官和求职者重视,但如果真的问起来,能不能回答的准确、全面、有深度,还是很容易体现出水平的。 在接下来的一个系列中,我会慢慢盘点一些 Spring 中常见但不好回答全面的问题,跟小伙伴们分享。 本文主题:Spring 的 IOC 如何回答的尽可能全面、准确、有深度。 问:什么是IOC? 这是一个看上去特别简单、感觉很无脑的问题,很多求职者在回答这个问题时会不加思考、快速回答出一个很简单但同时也没有什么含量的答案。 草率的回答 IOC 是控制反转,Inverse of Control 。 试问一句,亲,你在做名词翻译吗? 就算真的是在做名词翻译,也不应该只是把这个简称的全称解释出来就完事吧,好歹的展开解释点东西也好吧,作为 面试官不应该只想听到这么一点点 吧。 方向偏了 IOC 是控制反转,它把对象间的依赖关系的维护权利交给了 Spring ,程序本身不再维护。 这里面大体上把 IOC 的核心思想解释出来了: 对象间的依赖关系的维护权利发生了转移 ,但是请小伙伴们注意,我们在问 IOC , 这个问题仅仅是问 IOC 本身,与具体的技术无关 。 IOC 不止有 Spring ,只是当下最强大的、使用最广的是 Spring 而已。 所以小伙伴们在 回答理论、概念等问题时,不要直接在概念解释中提到具体的技术,技术都是概念和理论的落地实现,不止一种 。单把一种拉出来,面试官可能会觉得:你是不是只知道这个? 一种参考回答 该答案仅供参考,可根据自身的知识储备动态调整。 IOC 全名 控制反转 Inverse of Control,它是一种 编程原则 ,它的设计和架构可以实现 组件间的解耦 ,核心思想是 将控制权转移出去 。 这里面提到了几个点: 编程原则:它是一种 理论 ,而非具体的某种技术落地 组件间的解耦:所谓 耦合 ,就是上面提到的 对象间的依赖关系 ; 解耦 ,就是 解除了对象间的...