Redis7系列教程入门-认识Redis

卡二条的技术圈

共 15031字,需浏览 31分钟

 ·

2023-03-03 18:55

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


浏览 53
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报