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