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

从明天开始,我会不间断的开始给大家分享Redis7.0版本的常识。

从2022年1月31开始,官网就公布了 Redis7.0-rc1,至今曾经公布到 7.0.5 版本。很多的开发者,还对Redis意识停留在5.x的版本或者6.x的版本,对Redis7.0还不足较少的意识。本系列教程,将率领大家残缺的学习Redis7.0相干的知识点。从环境的搭建、10大数据类型、事务、公布订阅、主从复制、哨兵、集群等等常识。本教程最大的特点是,不会单纯的总结一些枯燥乏味的理论知识,而是理论知识+根底工夫+场景面试题剖析,同时也会分享一些Redis相干技术栈等等内容

明天给大家分享的是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 代码就行了,当页面被拜访的时候,就会主动把访客的信息发送到这些网站统计的服务器,而后咱们登录后盾就能够查看数据了。

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 拿来用了。

如果你想关注更多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 实现。

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 这样的包管理工具。因为这种形式十分的简略,上面就独自演示源码编译装置。

通过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 COPYINGdrwxrwxr-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.mddrwxrwxr-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-serverINSTALL redis-benchmarkINSTALL 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-benchmarklrwxrwxrwx 1 root root       12 2月  26 15:48 redis-check-aof -> redis-serverlrwxrwxrwx 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-clilrwxrwxrwx 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 -vRedis 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而言,有什么劣势?