咱们好,我是二条。一位从事服务端研发的程序猿。
从今天开端,我会不间断的开端给咱们同享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、官方地址: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
完成。
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而言,有什么优势?