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

时间:2022-12-26 00:37:02

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

从今天开始,我会不间断的开始给大家分享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、官方地址:​​https://redis.io/​

2、GitHub地址:​​https://github.com/antirez​

3、博客地址:​​http://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而言,有什么优势?