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而言,有什么优势?

相关推荐
追逐时光者2 小时前
推荐 12 款开源美观、简单易用的 WPF UI 控件库,让 WPF 应用界面焕然一新!
后端·.net
Jagger_2 小时前
敏捷开发流程-精简版
前端·后端
苏打水com3 小时前
数据库进阶实战:从性能优化到分布式架构的核心突破
数据库·后端
间彧4 小时前
Spring Cloud Gateway与Kong或Nginx等API网关相比有哪些优劣势?
后端
间彧4 小时前
如何基于Spring Cloud Gateway实现灰度发布的具体配置示例?
后端
间彧4 小时前
在实际项目中如何设计一个高可用的Spring Cloud Gateway集群?
后端
间彧4 小时前
如何为Spring Cloud Gateway配置具体的负载均衡策略?
后端
间彧4 小时前
Spring Cloud Gateway详解与应用实战
后端
EnCi Zheng5 小时前
SpringBoot 配置文件完全指南-从入门到精通
java·spring boot·后端
烙印6015 小时前
Spring容器的心脏:深度解析refresh()方法(上)
java·后端·spring