咱们好,我是二条。一位从事服务端研发的程序猿。

从今天开端,我会不间断的开端给咱们同享Redis7.0版别的常识。

Redis7.0中文系列教程-入门基础

从2022年1月31开端,官方就发布了 Redis7.0-rc1,至今现已发布到 7.0.5 版别。许多的开发者,还对Redis知道停留在5.x的版别或许6.x的版别,对Redis7.0还缺乏较少的知道。本系列教程,将带领咱们完整的学习Redis7.0相关的常识点。从环境的建立、10大数据类型、事务、发布订阅、主从仿制、岗兵、集群等等常识。本教程最大的特点是,不会单纯的总结一些枯燥乏味的理论常识,而是理论常识+根底时刻+场景面试题剖析,一起也会同享一些Redis相关技能栈等等内容

Redis7.0中文系列教程-入门基础

今天给咱们同享的是Redis相关的根底知道,以及它适合在什么场景下运用,如何快速建立Redis环境。

Redis是什么

Redis是一款依据内存,选用 key => vlaue 方法存储的高性能内存型nosql数据库。Redis 供给数据结构,例如字符串、哈希、列表、集、带有规模查询的排序集、位图、超日志日志、地理空间索引和流。 Redis 具有内置仿制、Lua 脚本、LRU 逐出、事务和不同级别的磁盘耐久性,并经过 Redis Sentinel 和 Redis 集群的自动分区供给高可用性。

为什么会呈现Redis这样一款内存型数据库呢。这就要从Redis的作者antirezs说起。

2008年的时分有一个意大利西西里岛的小伙子,笔名antirez,创建了一个访客信息网站LLOOGG.COM。有的时分咱们需求知道网站的拜访情况,比方访客的IP、操作体系、阅读器、运用的查找关键词、地点地区、拜访的网页地址等等。在国内,有许多网站供给了这个功用,比方CNZZ,百度计算,国外也有谷歌的GoogleAnalytics。咱们不必自己写代码去完成这个功用,只需求在大局的footer 里边嵌入一段JS 代码就行了,当页面被拜访的时分,就会自动把访客的信息发送到这些网站计算的服务器,然后咱们登录后台就可以检查数据了。

Redis7.0中文系列教程-入门基础

LLOOGG.COM 供给的便是这种功用,它可以检查最多10000 条的最新阅读记载。这样的话,它需求为每一个网站创建一个列表(List),不同网站的拜访记载进入到不同的列表。假如列表的长度超过了用户指定的长度,它需求把最早的记载删去(先进先出)。

当LLOOGG.COM 的用户越来越多的时分,它需求维护的列表数量也越来越多,这种记载最新的请求和删去最早的请求的操作也越来越多。LLOOGG.COM 开端运用的数据库是MySQL,可想而知,因为每一次记载和删去都要读写磁盘,因为数据量和并发量 太大,在这种情况下不管怎么去优化数据库都不管用了。

考虑到最终限制数据库性能的瓶颈在于磁盘,所以antirez 计划抛弃磁盘,自己去完成一个具有列表结构的数据库的原型,把数据放在内存而不是磁盘,这样可以大大地提升列表的push 和pop 的效率。antirez 发现这种思路的确能解决这个问题,所以用C 言语重写了这个内存数据库,而且加上了耐久化的功用,09 年,Redis 横空出世了。从最开端只支撑列表的数据库,到现在支撑多种数据类型,而且供给了一系列的高档特性,Redis 现已成为一个在全世界被广泛运用的开源项目。

Redis的全称是 REmote DIctionary Server。其默许的服务端口是 6379。关于Redis的端口号挑选 6379,有这么一种说法。6379在是手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字。Alessia Merz 是一位意大利舞女、女演员。 Redis 作者 Antirez(意大利人) 早年看电视节目,觉得 Merz 在节目中的一些话愚蠢可笑,Antirez 喜欢造“梗”用于平常和朋友们交流,所以造了一个词 “MERZ”,描述愚蠢,与 “stupid” 含义相同。后来 Antirez 从头定义了 “MERZ” ,描述”具有很高的技能价值,包含技艺、耐心和劳作,但仍然保持简略本质“。到了给 Redis 挑选一个数字作为默许端口号时,Antirez 没有多想,把 “MERZ” 在手机键盘上对应的数字 6379 拿来用了。

Redis7.0中文系列教程-入门基础

假如你想重视更多Redis相关的内容,除了官网地址,还可以经过Redis作者的博客,GitHub地址。

1、官方地址:redis.io/

2、GitHub地址:github.com/antirez

3、博客地址:antirez.com/latest/0

Redis运用场景

Redis是依据内存操作,具备高可用、高性能等特点,一起也供给了丰富的数据类型。一般可用于如下场景:

1、数据缓存。项目早期一般都是将数据存储到MySQL、oracle等关系型数据库中,一切的数据读写都是依据磁盘操作。跟着事务的不断扩大,经过传统的方法进行数据的读取,体系在读写方面都会遇到瓶颈。针对这一情况,将数据存放在内存中,一切的读操作都经过内存进行查询,提高了体系的数据查询才能。关于数据的读,在高并发的事务场景下,也可以将数据先写入内存中,在经过异步的方法耐久化到磁盘中,提高了体系的并发才能。

2、存储用户登录token。针对用户登录鉴权,一般可以依据cookie、jwt来完成。cookie是依据文件存储,而且cookie会涉及到跨域、分布式架构问题,jwt由所以依据客户端断存储方案,服务端无法直接操控登录token的状况。因为Redis是具备分布式布置架构,很好的解决了分布式架构token鉴权、用户登录状况等问题的操控。一起将登录token存放在Redis中,每次读取都选用内存读取,也提高了整个体系的性能。

3、秒杀场景。关于秒杀事务场景,关于体系的并发才能都是十分高的。在该场景下,将产品数据存储到Redis中,提高了体系的查询才能,减少了MySQL的压力。将产品库存都存储到Redis中,因Redis选用的是单线程架构,也可以完成产品超卖问题。

4、用户报到。可以运用 bitmap 数据类型,将用户报到存储在Redis中,然后经过异步线程将数据存储到MySQL中。既节省了内存,也供给了体系的读写才能。

5、音讯行列。Redis供给 list 数据类型,技能用来做音讯行列,也能用来做栈等场景。在 Redis5.0 开端,也供给了一种 stream 数据类型,提高了音讯行列的牢靠性。

6、社交场景。Redis供给了两种集合数据类型(set sortset),可以用在积分排行、好友引荐等场景。

7、 就近引荐。Redis中是供给了一种 GEO 的数据类型来进行位运算。可以依据用户当时的经纬度,来计算邻近的酒店、商场等场所的查找与引荐功用。

8、分布式锁。当分布式架构中,需求对同享数据的读写操作(例如产品秒杀)。为了保证数据的一致性,一般是选用分布式锁完成,Redis可以十分简略的完成分布式锁功用。可以直接运用 setnx key value + expire time 操作,为了完成原子性操作,也可以直接运用 lua 完成。

Redis7.0中文系列教程-入门基础

Redis有什么优势

Redis作为一种内存型数据库,其读写性能都是十分高的。这儿将Redis与memcached进行对比。

1、线程模型。memcached选用的多线程形式,Redis选用的是单线程形式,虽然Redis6.0版别之后是支撑多线程,但这儿的多线程也只是对网络IO的处理是多线程,实际的数据操作仍是单线程形式。单线程履行(减少上下文切换、锁竞争等问题)。

2、耐久化。关于内存型数据库,一切的数据都是存储在内存中。当服务呈现异常,服务宕机都会导致数据的丢失,Redis是支撑讲数据存储到磁盘中,服务呈现异常之后重启会从磁盘中,将数据从头加载到内存中。Redis关于数据的耐久化存储,支撑两种方法。一种是快照方法(RDB),另外一种是日志方法(ROF)。

3、分布式架构。Redis支撑主从仿制、岗兵、集群等高可用、高牢靠架构。一起具备学习成本低特点。

4、数据类型。Redis有基本的五大数据类型,还有其他的几种数据类型;Memcached只有单纯的字符串类型。

环境装置

上面对Redis的知道做了一个大致的介绍,下面就正式步入学习的第一步,建立Redis环境。假如你不想建立环境,也可以运用官方供给的web 界面的cli东西,不过在运用上也有必定的局限性。

Redis是支撑Linux、Mac和Windows环境,但官网也不引荐在Windows上运用Redis,这样无法充沛的发挥Redis的优势。在本教程中,一切的操作都是运用Mac环境建立,Linux环境和Mac环境几乎都是相同的,也不过多的去重视这两者的差异。

在Mac操作体系上有 brew 包管理东西,在Linux上有 yum 或许 ap-get 这样的包管理东西。因为这种方法十分的简略,下面就单独演示源码编译装置。

Redis7.0中文系列教程-入门基础

经过Redis官方的GitHub地址,下载Redis7.0.0版别。一般软件的版别都有奇数和偶数之分,咱们在挑选版别也会优选的挑选偶数版别,因为偶数版别会相对奇数版别安稳一些。

// 下载
cd ~ && wget https://github.com/redis/redis/archive/7.0.0.tar.gz
// 解压
tar -zxvf 7.0.0.tar.gz

解压之后,咱们可以检查一下源码中大致有哪些文件。

[root@VM-16-3-centos redis-7.0.0]# ll
总用量 252
-rw-rw-r--  1 root root  27744 4月  27 2022 00-RELEASENOTES
-rw-rw-r--  1 root root     51 4月  27 2022 BUGS
-rw-rw-r--  1 root root   5026 4月  27 2022 CONDUCT
-rw-rw-r--  1 root root   2634 4月  27 2022 CONTRIBUTING
-rw-rw-r--  1 root root   1487 4月  27 2022 COPYING
drwxrwxr-x  7 root root   4096 4月  27 2022 deps
-rw-rw-r--  1 root root     11 4月  27 2022 INSTALL
-rw-rw-r--  1 root root    151 4月  27 2022 Makefile # 编译文件
-rw-rw-r--  1 root root   6888 4月  27 2022 MANIFESTO
-rw-rw-r--  1 root root  22435 4月  27 2022 README.md
-rw-rw-r--  1 root root 106547 4月  27 2022 redis.conf # 默许装备文件
-rwxrwxr-x  1 root root    279 4月  27 2022 runtest
-rwxrwxr-x  1 root root    283 4月  27 2022 runtest-cluster # 集群东西
-rwxrwxr-x  1 root root   1578 4月  27 2022 runtest-moduleapi
-rwxrwxr-x  1 root root    285 4月  27 2022 runtest-sentinel
-rw-rw-r--  1 root root   1695 4月  27 2022 SECURITY.md
-rw-rw-r--  1 root root  13924 4月  27 2022 sentinel.conf # 岗兵默许装备文件
drwxrwxr-x  4 root root   4096 4月  27 2022 src #源码文件
drwxrwxr-x 11 root root   4096 4月  27 2022 tests
-rw-rw-r--  1 root root   3055 4月  27 2022 TLS.md
drwxrwxr-x  8 root root   4096 4月  27 2022 utils

接下来,在源码路径下履行装置操作。

make && make install

在经过几分钟的等候,呈现如下的界面,就表明Redis现已被成功的装置。

Hint: It's a good idea to run 'make test' ;)
INSTALL redis-server
INSTALL redis-benchmark
INSTALL redis-cli

默许情况下,Redis相关的客户端东西、服务端东西都会被装置在 /usr/local/bin 目录下面。

[root@VM-16-3-centos bin]# cd /usr/local/bin
[root@VM-16-3-centos bin]# ll
总用量 27896
-rwxr-xr-x 1 root root      383 12月 10 2019 chardetect
-rwxr-xr-x 1 root root      389 12月 10 2019 cloud-init
-rwxr-xr-x 1 root root     1781 12月 10 2019 cloud-init-per
-rwxr-xr-x 1 root root      399 12月 10 2019 easy_install
-rwxr-xr-x 1 root root      407 12月 10 2019 easy_install-3.6
-rwxr-xr-x 1 root root     1005 12月 10 2019 jsondiff
-rwxr-xr-x 1 root root     3663 12月 10 2019 jsonpatch
-rwxr-xr-x 1 root root     1839 12月 10 2019 jsonpointer
-rwxr-xr-x 1 root root      392 12月 10 2019 jsonschema
-rwxr-xr-x 1 root root  6976488 2月  26 15:48 redis-benchmark
lrwxrwxrwx 1 root root       12 2月  26 15:48 redis-check-aof -> redis-server
lrwxrwxrwx 1 root root       12 2月  26 15:48 redis-check-rdb -> redis-server
-rwxr-xr-x 1 root root  7234616 2月  26 15:48 redis-cli
lrwxrwxrwx 1 root root       12 2月  26 15:48 redis-sentinel -> redis-server
-rwxr-xr-x 1 root root 14307984 2月  26 15:48 redis-server

1、redis-server:Redis服务端东西,发动Redis服务时,需求运用该东西。

2、redis-cli:Redis客户端东西,运用指令操作Redis时,需求运用该东西。

3、redis-check-rdb:耐久化RDB文件检测,当RDB文件存在问题时,可以运用该东西进行检测与恢复。

4、redis-check-aof:耐久化AOF文件检测,当AOF文件存在问题时,可以运用该东西进行检测与恢复。

5、redis-sentinel:Redis岗兵东西,在运用岗兵形式下,需求运用该东西发动岗兵。

6、redis-benchmark:Redis压缩东西,经过该东西可以模仿Redis性能。

装置成功之后,咱们也可以检查当时的装置Redis版别。

[root@VM-16-3-centos bin]# redis-server -v
Redis server v=7.0.0 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=34dee89a8e7e24d2

发动服务

发动服务时,咱们可以指定装备文件,也可以不指定装备文件。假如不指定装备,运用 redis-server 时会运用默许的装备文件。

1、不运用装备文件发动。直接运用 redis-server 指令即可,看到如下的界面表明Redis服务现已正常发动。但这样也存在一个问题,Redis服务时处于前台运转的,当咱们将该shell窗口关闭后,服务就会被停止。因此引荐运用指定装备文件的方法。

[root@VM-16-3-centos bin]# redis-server
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 7.0.0 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                  
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 615368
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           https://redis.io       
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               
615368:M 26 Feb 2023 16:02:04.530 * Ready to accept connections

2、指定装备文件发动。在Redis的源码目录中存在一个 redis.conf 文件。可以直接在该文件修正,也可以将文件仿制到指定目录,在对其修正。找到文件中的 daemonize 装备项,将其值改为 yes

daemonize yes

接下来,在履行 redis-server ./redis.conf ,履行完之后,可能界面没有任何输出信息。咱们可以运用 redis-cli 指令进行衔接测试

[root@VM-16-3-centos redis-7.0.0]# redis-cli
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> 

经过上图的演示,咱们可以看到Redis现已可以被正常链接,此致Redis的环境装置、根底测试和衔接就悉数完成了。

教程回忆

看完上面的内容,做几个简略的测试吧,以便回忆一下常识内容。

1、 Redis是什么?

2、 项目当中,运用MySQL作为数据库存储,为什么还要运用Redis?

3、 Redis有哪些运用场景?

4、 Redis默许的端口是什么?

5、 Redis相对memcached而言,有什么优势?