大家好,我是二条。一位从事服务端研发的程序猿。
从明天开始,我会不间断的开始给大家分享 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 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 而言,有什么劣势?