Redis已收费 还值得继续深入学习吗

大家好,我是Mandy,现在是一名服务端研发工程师。之前呢,也发过一篇文章关于Redis7系列教程的文章,后来总感觉不太合适。就给删除了。至于为什么呢?

个人觉得单纯的技术文章,并不能很好的帮助到更多基础相对薄弱的同学。为什么这么说呢?相信大家在编程学习的过程中,都发现一个问题,很多的东西学了忘,忘了又学,反复的学习,最终都很难掌握。

回想一下在学生生涯阶段,当你粗心做错一道题之后,是否有一种一辈子都不会忘记这道题的感觉。基于此,我个人开发了一套答题的小程序,然后结合文章配套练习,既能学习到理论知识,也能形成知识的巩固,更多的是能学习到项目实践相关的知识。因此我将Redis7.0系列教程和我的答题小程序配合,希望能够帮助到更多的基础薄弱的同学。

下面是关于Redis7.0系列教程的介绍和一些愿景。虽然最近Redis官方发表声明,Redis后续将采取付费使用的模式。Redis 的收费将对使用 Redis 的企业产生一定的影响。对于需要使用 Redis 的企业版功能的企业,需要考虑支付相应的费用。对于不需要使用 Redis 的企业版功能的企业,可以继续免费使用 Redis 的开源版本。从Redis发展的角度来看,收费其实也并非是一件坏事,毕竟作为一个开源项目,想要持久、稳定的发展下去,是要不断地投入成本,需要更多的开发者去维护,这样一款产品才能长久、健康的发展。

虽然最近两年国外也出现几款Redis的同类产品,网上也有很多的文章介绍,提到功能很强大,甚至超过Redis。可能大家会考虑是否还值得深入学习Redis呢?其实我觉得这是两码事情,不管其他的同类产品是多么的强大,站在技术的学习角度考虑,只要你学好一门技术,在去接触其他的技术,你会发现新技术即使门槛很高,你学习起来都还是很容易得。同时深入去学习一门技术,其实也是对这么技术的沉淀。再则Redis本身就是互联网企业中,最为热门的技术栈之一,即使出现衰败的情况,那可能也是n多年之后的事情。作为我们业务开发的同学来说,这些疑惑根本不需要去特别在意。

从今天开始,我会不间断的开始给大家分享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版本。一般软件的版本都有奇数和偶数之分,我们在选择版本也会优选的选择偶数版本,因为偶数版本会相对奇数版本稳定一些。

shell 复制代码
// 下载
cd ~ && wget https://github.com/redis/redis/archive/7.0.0.tar.gz
// 解压
tar -zxvf 7.0.0.tar.gz

解压之后,我们可以查看一下源码中大致有哪些文件。

shell 复制代码
[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

接下来,在源码路径下执行安装操作。

shell 复制代码
make && make install

在经过几分钟的等待,出现如下的界面,就表示Redis已经被成功的安装。

shell 复制代码
Hint: It's a good idea to run 'make test' ;)

INSTALL redis-server
INSTALL redis-benchmark
INSTALL redis-cli

默认情况下,Redis相关的客户端工具、服务端工具都会被安装在 /usr/local/bin 目录下面。

shell 复制代码
[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版本。

shell 复制代码
[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窗口关闭后,服务就会被停止。因此推荐使用指定配置文件的方式。

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

shell 复制代码
daemonize yes

接下来,在执行 redis-server ./redis.conf ,执行完之后,可能界面没有任何输出信息。我们可以使用 redis-cli 命令进行连接测试。

shell 复制代码
[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而言,有什么优势?

相关推荐
一只爱打拳的程序猿8 分钟前
【Spring】更加简单的将对象存入Spring中并使用
java·后端·spring
假装我不帅2 小时前
asp.net framework从webform开始创建mvc项目
后端·asp.net·mvc
神仙别闹2 小时前
基于ASP.NET+SQL Server实现简单小说网站(包括PC版本和移动版本)
后端·asp.net
计算机-秋大田2 小时前
基于Spring Boot的船舶监造系统的设计与实现,LW+源码+讲解
java·论文阅读·spring boot·后端·vue
货拉拉技术3 小时前
货拉拉-实时对账系统(算盘平台)
后端
掘金酱3 小时前
✍【瓜分额外奖金】11月金石计划附加挑战赛-活动命题发布
人工智能·后端
代码之光_19803 小时前
保障性住房管理:SpringBoot技术优势分析
java·spring boot·后端
ajsbxi3 小时前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
颜淡慕潇4 小时前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决