0%

前言

作为一个后端程序员,面试过程中难免会被问到缓存的一些问题,而目前来说,Redis 就是使用的最为广泛的一个缓存中间件了。下面我们就以 Redis 为例,说一说面试过程中会经常会被问到的一些面试题。并试着了解面试官所想,抓住重点,奋力一击,让面试不再烦恼。

Redis 简介

首先,简单回顾下 Redis 的简介,并提供一个思路范式。

Redis 是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,HyperLogLogs 等数据类型。内置复制、Lua 脚本、LRU 收回、事务,以及不同级别磁盘持久化功能,同时通过 Redis Sentinel 提供高可用,通过 Redis Cluster 提供自动分区。根据月度排行网站 DB-Engines 的数据,Redis 是最流行的键值对存储数据库。

上面是对 Redis 的一个基本介绍,但是在学习一门新技术的时候,一般至少需要考虑三个基本问题 WWH:

  1. WHAT:是什么,该技术是什么,有什么特性
  2. WHY:为什么,为什么要使用该技术,该技术解决了什么问题
  3. HOW:怎么做,如何使用该技术

如果需要再深入一点,那么就还有一个 HOW:该项技术是如何实现的,即需要明白该技术的实现原理。

所以,猿们在使用某项技术或者学习某项新技术的时候,不妨按照上面的四个问题来思考下。或者回顾复习的时候也可以按照该思路来准备,因为一般的面试题也都是和上面几个问题相关的。下面要讲到的面试题或多或少都会和上面的四个问题挂钩。Let’s begin.

阅读全文 »

本次本章从线程的基础讲到线程的相关实现类,每个章节算是一小块知识点,在每个知识点中,穿插地讲对应的知识原理,以及对应的常见面试题及其解答。多数面试题是前后环环相扣的。

什么是线程

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(Call Stack),自己的寄存器环境(Register Context),自己的线程本地存储(Thread-local Storage)。

一个进程可以有很多线程,每条线程并行执行不同的任务。在多核或多 CPU,或支持 Hyper-threading 的 CPU 上使用多线程程序设计的好处是显而易见的,即提高了程序的执行吞吐率。在单 CPU 单核的计算机上,使用多线程技术,也可以把进程中负责 I/O 处理、人机交互而常被阻塞的部分与密集计算的部分分开来执行,编写专门的 workhorse 线程执行密集计算,从而提高了程序的执行效率。

可能的问题,分别对应上面三段内容:

  1. 什么是线程
  2. 哪些数据存储是线程私有的
  3. 为什么要使用多线程,即使用多线程的好处
阅读全文 »

写代码久了,一直在用别人提供的第三方包依赖,有时是不是也会想着有一天别人能够使用自己的开源出去的项目。让我们从最简单的开始,提取一个小项目,将其开源并发布到中央仓库让大伙可以直接通过配置 Maven 依赖来使用。

寻找项目方案

我相信应该是有不少人都有过开源并发布自己项目的想法的,但是其中最大的一个问题可能就是不知道该写点什么了、不知道有什么东西可以开源出去让别人使用的。没有关系,这边带你慢慢来提取出一个可行的项目方案。

开源项目的种类多种多样,来源更是不用多说,我们这里不整这些这么广泛复杂的项目,我们就是想体验下将自己的项目构建发布到 Maven 中央仓库的快感。那么其实有一个特别容易的项目可以立马自己就着手设计的:实现 API。

阅读全文 »

最近工作中又有可能需要写 Node.js 应用了,距离上次写 Node.js 应用也有好些年了,所以就开始 重新熟悉下 Node.js 了。刚好最近又在学 Go,其最大的特点就是简单、轻量级的并发模型。非常容易 用它编写一个能够充分利用硬件资源的高性能应用。于是不免想起以前学习 Node.js 时会遇到的问题:如何 让 Node.js 充分利用多核 CPU 的资源。于是,让我发现了,Node.js 从 v10.5.0 开始引入 worker_threads 模块来解决该问题。并让我发现了这篇文章。

此文为译文,原文如下。

译自 Deep Dive into Worker Threads in Node.js


多年来,Node.js 一直都不是实现 CPU 密集型应用的最佳选择。其中最主要的原因就是 Node.js 仅仅 是 Javascript 而 JavaScript 是单线程的。作为该问题一个解决方法,Node.js 从 v10.5.0 开 始引入了实验性的 Worker Threads 概 念,并将其体现在 worker_threads 模块,该模块从 Node.js v12 LTS 开始作为一个稳定功能 模块提供出来。在这边文章中,我将会说明它们是如何工作的,怎样使用 worker threads 才能获取最好 的性能。假如你对 Node.js worker threads 还不了解的话,我建议你查看它们的 官方文档

注:文中引用的 Node.js 代码片段版本为 921493e

阅读全文 »

前言

最近工作有个小项目,其场景主要是封装内部的接口请求,然后做个转换之后,就请求外部请求,之后再 将外部响应转换成内部的统一格式,其实有点类似一个简单网关的应用,虽然也有一些业务逻辑在里面, 但是主要场景还是请求的转发处理,是一个 IO 密集型的应用,而且外部请求的延迟相对比较大而且不可控。 我想,这不正合适 Spring 5 出来的那个新特性的一个应用场景么。于是决定探究下 Spring Web on Reactive Stack: Spring WebFlux.

Spring WebFlux

Spring WebFlux 作为一个响应式(reactive-stack) web 框架补充,在 5.0 的版本开始加入到 Spring 全家桶。这是一个完全非阻塞的,支持 Reactive Streams, 运行在诸如 Netty, Undertow, 以及 Servlet 3.1+ 容器上的。Spring WebFlux 可以让你使用更少的线程去处理并发请求,同时能够让你使用更少的硬件资源来拓展 你的应用。

阅读全文 »