无题
你好,我是杨四正。有多年互联网一线开发经验,曾在多家互联网企业任职,涉及电商、新零售、短视频、直播等多个领域。目前在某短视频大厂任职 **资深技术专家**,参与公司多款中间件开发,工作中深入研究并改造过多种开源产品的实现,在架构设计方面经验丰富。
我平时特别热衷于技术分享,目前已经出品了 Kafka、Dubbo、MyBatis、etcd、OpenTSDB、Promethus 等多个主题的书籍和课程。
为什么我要讲 Redis?已经出过这么多主题的书籍和课程了,这次我为什么要选择 Redis 这个主题呢?
那自然是因为 Redis 是我们实际开发中不可或缺的组件之一,也是目前全球最流行的 KV 数据库。相信小伙伴们在工作中也会频繁接触到 Redis,但可能并没有量化 Redis 到底有多流行,下面我们一起来看一下,DB-Engines 这个全球知名的数据库排名网站对 Redis 的排名:
在 Complete Ranking 列表(不分类的列表)中,Redis 排名第六,排在它前面的都是关系型数据库,可以说 Redis 和它们都不是一个赛道的产品;在 Key-Value Store 这 ...
无题
作为“先导篇”的第一篇文章,本文主要是给不熟悉 Redis 的小伙伴,快速介绍一下 Redis 的相关概念和使用场景。
本文主要从三个方面来介绍(如下图所示):Redis 是什么、为什么使用 Redis 以及 Redis 与 Memcached 的对比。其中,第二、第三方面也是面试的重灾区,在不同等级的面试中,多多少少都会涉及到这两方面的问题。
Redis 是什么?先来说说 Redis 是什么东西吧,有的小伙伴可能是第一次接触 Redis。
一般我们看一个东西是什么的时候,都是去官网上看一下 Introduction, 那我们 Redis 官网(https://redis.io/)走起,如下截图:
毕竟官网的解释最标准而权威,所以我们就一起解读下官网对于 Redis 的介绍。
Redis 是一个开源的、内存的、有数据结构的存储,通常会被用作 DB、缓存、消息队列、流处理引擎。
Redis 提供了非常多的数据类型,比如,String、Hash、Set、List 等。Redis 还提供了主从复制、Lua 脚本、LRU 淘汰机制,以及持久化、哨兵 、Cluster。(小声说一句,这些 ...
无题
介绍完 Redis 概述之后,本文我们就通过源码的方式,来安装一下 Redis 7.0。同时,也把阅读 Redis 的源码环境搭起来。
前面我们讲过 Redis 一般是部署在 Linux 系统上面,所以我们这里,就在 Mac 或者是在 Linux 上进行搭建,Windows 的话,就不太建议你去浪费时间搞这个了。
如果你手里只有 Windows 机器的话,也可以安一个虚拟机,在上面装一个 Linux,然后再去搭建 Redis 环境。后面我们可以用 IDE 远程连到这个虚拟机上进行 Debug,非常不建议你浪费时间在 Windows 上做 Redis 的编译或者是安装,没有啥太大意义。
说明:本小节的内容整体还是比较简单的,如果小伙伴不知道如何搭建 Redis 7 源码环境或者不知道怎么查看一个 Redis 7 新特性实现的话,可以跟着本小节一步步操作,我也是希望能尽量照顾到各个基础水平的小伙伴,做好铺垫,打好基础,在刚开始学习时有个平滑的学习曲线,这样咱们后续学习就能减少在基础知识上的磕磕绊绊,这也是我们“先导基础篇”的设置初衷。
当然,肯定有小伙伴基础水平很不错,已经完全掌握些细碎 ...
无题
要想读懂 Redis 里面关键的代码实现,还是需要先有一点点 C 语言基础的,因此,本文我们就来做一个简单的 C 语言入门讲解,主要是介绍一下 C 字符串、结构体、指针以及数组这四方面的内容。这四方面内容会和 Java 对比着说,尽可能让熟悉 Java 的小伙伴做到零门槛。
当然,如果你非常熟悉 C 语言的话,可以直接跳过这一篇文章。
C 字符串首先来看 C 语言中的字符串。在 Java 里面,我们是如何创建一个字符串呢?直接 new 一个 String 对象,就行了。比如,下面就定义一个 s 字符串变量:
1String s = new String("Hello World");
new String() 是在堆里面分配一个 String 对象,s 这个变量存的就是这个 String 对象的地址,就和下面这张图一样:
如果你看过 Java String 的源码,会知道 String 底层是拿 char 数组(字符数组)实现的。我这里用的还是 JDK 8 的源码,JDK 9 的话,就已经变成 byte[] 数组(字节数组)了。
C 语言里面的字符串也是这么 ...
无题
在前面的文章中,我们了解了 Redis 的基本功能,通过源码方式安装了 Redis,并搭建了 Redis 的源码运行环境。接下来将进入 “Redis 的实战应用篇”,在这部分我们将重点介绍 Redis 核心命令的使用,主要包括 Redis 中 String、List、Set、Hash 以及 Sorted Set 五大核心数据结构的命令,同时还会分析这五大数据结构的使用场景。
本节作为 Redis 实战应用篇的第一篇,我们重点介绍 Redis 中 String 相关的命令以及应用场景。
redis-cli 基础使用在开始正式介绍 String 的相关命令之前,我们需要先了解一下本篇执行 Redis 命令的工具 —— redis-cli。它是 Redis 自带的命令行客户端,可以将命令发送到 Redis 服务端执行并接收命令执行结果。
在上一讲编译好的 Redis 的 src 目录下面,就可以看到 redis-cli 这个命令行客户端,如下图所示:
直接执行这个 redis-cli 命令,它就会默认连到前面启动的 Redis 服务上。要是连其他远程的 Redis 服务,我们可以用 -h ...
无题
这一节我们开始看 Redis 里面的 List 命令。看到 List 这个词的时候,小伙伴们肯定非常亲切,因为我们在 Java 里面最常用的、最基础的数据结构就是 List。Redis 里面的 List 与 Java 里面的 LinkedList 差不多,都是用来表示一组有序元素的集合。
按照我们之前介绍字符串(String)的思路,我们依旧是打开 Redis 官网,找到 Command 页面,选择 List,然后就能看到 List 相关的全部命令:
List 的命令也不少,这里对 List 命令做一个简单的分类,这节就按照这个思维导图去介绍这些 List 的命令。这里主要分了四个大类,基本的 List 操作、阻塞版本的 List 命令,还有一些复合操作,最后是一些随机访问的命令。
基础操作你可以想一下,Java 里面 LinkedList 是不是能够在队尾写元素、队头取元素,实现一个先进先出(FIFO)的队列,那我们怎么用 Redis 的 List 实现 FIFO 的效果?会涉及到四个命令,分别是 LPUSH、RPOP、RPUSH、LPOP,我们一个个来说。
上一节介绍字符串的时 ...
无题
上一节中,我们介绍了操作 List 的五大类命令,对每一个命令都做了详细的演示,并分析了每个命令的特性和应用场景。
这一节,我们就来看看 Redis List 数据结构在实战中的应用场景,这里主要介绍消息队列、提醒功能、热点列表三个实战场景,如下图所示:
消息队列Redis List 最简单的一个应用场景就是利用 List 先进先出的特性,做一个消息队列。
我们先创建一个 ListTest 测试类,专门用来写 List 的单元测试,然后把之前连 Redis 的 before() 方法和 after() 方法拷贝过来,具体代码如下所示:
12345678910111213141516171819202122public class ListTest { private static RedisClient redisClient; private static StatefulRedisConnection<String, String> connection; private static RedisAsyncCommands<Strin ...
无题
浅谈虚拟化和容器技术相信所有对 Docker 有所耳闻的朋友都知道,它是一款以容器虚拟化技术为基础的软件,因此在了解有关 Docker 的概念知识和使用方法之前,虚拟化和容器技术是我们不可或缺的基础知识。在本小册的第一个小节里,我们就先来尝一尝这道有关虚拟化和容器技术的开胃菜吧。
虚拟化技术如果要用简单的语句来阐述虚拟化技术的话,那么可以这么解释:
虚拟化技术是一种将计算机物理资源进行抽象、转换为虚拟的计算机资源提供给程序使用的技术。
这里所指的计算机资源,就包括了 CPU 提供的运算控制资源,硬盘提供的数据存储资源,网卡提供的网络传输资源等。
为程序跨平台兼容而生虚拟化这个概念并不是什么新事物了,早在 20 世纪 60 年代,IBM 就用它来描述一套能够抽象硬件资源的实验性系统。
在计算机技术发展的早期,各类计算平台、计算资源所提供的接口、调用方式十分杂乱,没有像今天这样相对统一的标准。由于要适配不同的平台,写各种兼容代码,这无形给开发者带来了很多的困扰。这种混乱甚至都出现在 IBM 这一家公司下不同机型的机器上,所以 IBM 的工程师们创造了虚拟化技术,用来帮助程序快速适配不 ...
无题
了解 Docker 的核心组成在掌握 Docker 的一些背景知识后,我们还不得不花费一节的篇幅来简单介绍有关 Docker 核心的一些知识。当然,大家不要觉得有“核心”这类的词,我们就要在这一节中深入 Docker 底层去讲解原理性的东西,更确切的说这一节更像一张词汇表,在掌握这些与 Docker 紧密相关的词汇后,大家可以更好的理解之后小节中的内容。
四大组成对象在之前的小节里,我们提到了 Docker 实现容器引擎的一些技术,但那些都是一些相对底层的原理实现,在 Docker 将它们封装后,我们并不会直接操作它们。在 Docker 中,另外提供出了一些软件层面的概念,这才是我们操作 Docker 所针对的对象。
在 Docker 体系里,有四个对象 ( Object ) 是我们不得不进行介绍的,因为几乎所有 Docker 以及周边生态的功能,都是围绕着它们所展开的。它们分别是:**镜像 ( Image )、容器 ( Container )、网络 ( Network )、数据卷 ( Volume )**。
镜像镜像 ( Image ) 这个概念相信大家不会陌生,因为它是其他虚拟化技 ...
无题
这是 Docker 的简历在了解虚拟化和容器技术后,我们就更容易理解 Docker 的相关知识了。在这一小节中,我将介绍关于 Docker 的出现和发展,Docker 背后的技术。同时,我们将阐述 Docker 在虚拟化领域中的定位以及其带来的变革。
Docker 开源项目如果说 Docker 的诞生,就必须从 Docker 这个开源项目提起 ( 虽然它现在已经不叫 Docker 了 )。Docker 项目是一个由 Go 语言实现的容器引擎,它最初由 dotCloud 这家做云服务的公司在 2013 年开源。
由于 Docker 带来的巨大的便利,让很多开发、测试和运维等软件开发环节上的工作被简化甚至省去,所以在短短的几年间便成为虚拟化乃至整个技术领域的热词。同时,许多开发者乃至大型科技企业都参与到了 Docker 相关领域的贡献中来,为 Docker 及其生态圈贡献了许多优秀的软件项目,这大大提高了 Docker 生态的完整性,也让 Docker 日益健壮。
也许 dotCloud 自己也没有想到,云服务没卖出几个钱,反倒是 Docker 越来越火。拥有商业头脑的他们,干脆不再做云服 ...
