初识Redis

  Redis 是一个基于内存键值存储NoSQL数据库。

内存存储

  所有数据都存储在内存中,这使得读写操作非常快速。虽然 Redis 也支持数据持久化,将数据保存到磁盘,但其核心是内存数据库。

键值对(Key-Value)存储

  数据以键值对的形式存储,键是字符串,值可以是多种数据结构,例如下面的这些数据类型:

  • 字符串(Strings):普通的文本或二进制数据。
  • 散列(Hashes):包含键值对的集合,适合存储对象。
  • 列表(Lists):按插入顺序排序的字符串列表。
  • 集合(Sets):无序且不重复的字符串集合。
  • 有序集合(Sorted Sets):带有分数的字符串集合,按分数排序。
  • 位图(Bitmaps)
  • 基数统计(HyperLogLogs)
  • 地理空间索引(Geospatial Indexes)
  • 流(Streams)

NoSQL 数据库

  NoSQL(Not Only SQL)数据库是一类不使用传统关系模型的数据库系统。与关系型数据库(如 MySQL、PostgreSQL)相比,NoSQL 数据库具有以下特点:

  • 灵活的模式:不需要预定义数据模式,适合处理多变和非结构化数据。
  • 高扩展性:通常设计为分布式系统,能够水平扩展。
  • 高性能:专注于特定类型的数据存储和操作,性能优化较好。

SQL vs NoSQL

结构化和非结构化

  • 传统关系型数据库是结构化数据,每一张表都有严格的约束信息:字段名、字段数据类型、字段约束等等信息,插入的数据必须遵守这些约束
  • NoSQL则对数据库格式没有严格约束,往往形式松散,自由,可以是键值型(Key-Value)也可以是文档型(Document),还可以是图格式(Graph)。

关联和非关联

  • 传统数据库的表与表之间往往存在关联,例如外键,表的1-1、1-N和N-M关系。
  • 非关系型数据库不存在关联关系,要维护关系要么靠代码中的业务逻辑,要么靠数据之间的耦合

查询方式

  • 传统关系型数据库会基于Sql语句做查询,语法有统一标准,无论是MySQL、SQL Server还是其他数据库,基本的SQL语法相同,个别语法不同。
  • 非关系型数据库有自己的独特语法,如Redis的GET、SET、LPUSH、RPOP……

事务

  • 传统关系型数据库能满足事务ACID的原则,适用于对数据的安全性和一致性有较高要求。
  • 非关系型数据库往往不支持事务,或者不能严格保证ACID的特性,只能实现基本的一致性。

存储方式

  • 关系型数据库基于磁盘进行存储,会有大量的磁盘IO,对性能有一定影响
  • 非关系型数据库,他们的操作更多的是依赖于内存来操作,内存的读写速度会非常快,性能自然会好一些

扩展性

  • 关系型数据库集群模式一般是主从,主从数据一致,起到数据备份的作用,称为垂直扩展
  • 非关系型数据库可以将数据拆分,存储在不同机器上,可以保存海量数据,解决内存大小有限的问题。称为水平扩展

再识Redis

  Redis诞生于2009年全称是Remote Dictionary Server 远程词典服务器,是一个基于内存的键值型NoSQL数据库。

Redis 的特点和优势包括:

  • 高速性能:由于所有数据都存储在内存中,读写操作非常快,通常用于需要快速访问数据的应用程序。
  • 丰富的数据类型:支持多种数据类型,适用于不同的应用场景。
  • 持久化:支持将数据从内存持久化到磁盘,有多种持久化策略,如RDB(快照)和AOF(追加文件)。
  • 高可用性和分布式:通过Redis Sentinel和Redis Cluster实现高可用性和数据分片,保证系统的稳定性和扩展性。
  • 简单易用:提供简单直观的命令行接口和多种编程语言的客户端库,方便开发人员集成和使用。

Redis 常用于以下场景:

  • 缓存:减少数据库负载和提高应用程序响应速度。
  • 会话存储:存储用户会话信息,实现快速读取和写入。
  • 排行榜:利用有序集合实现排行榜功能。
  • 发布/订阅:实现消息发布和订阅机制。
  • 任务队列:使用列表或流来实现任务队列,处理异步任务。

安装Redis(Linux)

  大多数企业都是基于Linux服务器来部署项目,而且Redis官方也没有提供Windows版本的安装包,所以我们学习Linux系统下的Redis安装。

依赖库安装

  Redis是基于C语言编写的,因此首先需要安装Redis所需要的gcc依赖:

1
yum install -y gcc tcl

上传压缩包并解压

  到Redis官网下载后缀为gz结尾的安装包,通过任一shell软件将压缩包传到Linux系统当中,运行下列命令(替换版本号)进行解压缩:

1
tar -xzf redis-x.x.x.tar.gz

  进入解压后的Redis目录,运行编译命令,如果没有出错,应该就安装成功了。

1
make && make install

  默认的安装路径在/usr/local/bin目录下

该目录已经默认配置到环境变量,因此可以在任意目录下运行这些命令。其中:

  • redis-cli:是redis提供的命令行客户端
  • redis-server:是redis的服务端启动脚本
  • redis-sentinel:是redis的哨兵启动脚本

启动方式

  • 默认启动

  • 指定配置启动

  • 开机自启

默认启动

  在任意目录输入redis-server命令即可启动Redis,会看到Redis的图标。

这种启动属于前台启动,会阻塞整个会话窗口,窗口关闭或者按下CTRL + C则Redis停止。不推荐使用。

指定配置启动

  如果要让Redis以后台方式启动,则必须修改Redis配置文件,就在我们之前解压的redis安装包,名字叫redis.conf

我们先将这个配置文件备份一份:

1
cp redis.conf redis.conf.bck

然后修改redis.conf文件中的一些配置,用vi编辑器打开该文件:

1
vi redis.conf

/加上想要查找的字符,查找到对应行,输入i进行修改,修改完成:wq保存并退出,不小心修改错了则:q!不保存退出

1
2
3
4
5
6
# 允许访问的地址,默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问,生产环境不要设置为0.0.0.0
bind 0.0.0.0
# 守护进程,修改为yes后即可后台运行
daemonize yes
# 密码,设置后访问Redis必须输入密码
requirepass 123321

Redis的其它常见配置:

1
2
3
4
5
6
7
8
9
10
# 监听的端口
port 6379
# 工作目录,默认是当前目录,也就是运行redis-server时的命令,日志、持久化等文件会保存在这个目录
dir .
# 数据库数量,设置为1,代表只使用1个库,默认有16个库,编号0~15
databases 1
# 设置redis能够使用的最大内存
maxmemory 512mb
# 日志文件,默认为空,不记录日志,可以指定日志文件名
logfile "redis.log"

启动Redis:

1
2
3
4
# 进入redis安装目录 
cd /usr/local/src/redis-x.x.x
# 启动
redis-server redis.conf

停止服务:

1
2
3
# 利用redis-cli来执行 shutdown 命令,即可停止 Redis 服务,
# 因为之前配置了密码,因此需要通过 -u 来指定密码
redis-cli -u 123321 shutdown

开机自启

  我们也可以通过配置来实现开机自启。

首先,新建一个系统服务文件:

1
vi /etc/systemd/system/redis.service

内容如下:

1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=redis-server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /usr/local/src/redis-6.2.6/redis.conf
PrivateTmp=true

[Install]
WantedBy=multi-user.target

然后重载系统服务:

1
systemctl daemon-reload

现在,我们可以用下面这组命令来操作redis了:

1
2
3
4
5
6
7
8
# 启动
systemctl start redis
# 停止
systemctl stop redis
# 重启
systemctl restart redis
# 查看状态
systemctl status redis

执行下面的命令,可以让redis开机自启:

1
systemctl enable redis

Redis客户端的使用

安装完成Redis,我们就可以操作Redis,实现数据的CRUD了。这需要用到Redis客户端,包括:

  • 命令行客户端
  • 图形化桌面客户端
  • 编程客户端

Redis命令行客户端

  Redis安装完成后就自带了命令行客户端:redis-cli

使用方式如下:

1
redis-cli [options] [commonds]

其中常见的options有:

  • -h 127.0.0.1:指定要连接的redis节点的IP地址,默认是127.0.0.1
  • -p 6379:指定要连接的redis节点的端口,默认是6379
  • -a 123321:指定redis的访问密码

例如我们可以通过以下命令行连接上Redis

1
redis-cli -a 123321

图形化桌面客户端

  这里我推荐使用Navicat,当然也可以使用其他的客户端

个人觉得Navicat界面美观,在Navicat 17版本后可以连接Redis,可以实现一个软件连接多个不同类型的数据库,不需要为了多个数据库而在电脑上安装多个软件客户端,便捷高效

点击左上角的连接,选择Redis,填入对应的数据:

  • 连接名称随意

  • 主机为你安装了Redis的Linux系统的IP地址

  • 由于没有设置用户名,所以选择通过Password进行验证,输入密码后点击连接即可

2

如果确认信息都对,但是连接不上,则需要在Linux将Redis使用端口放行,再次测试连接即可

1
firewall-cmd --zone=public --add-port=6379/tcp --permanent

编程IDE客户端

  本章使用IntelliJ IDEA作为例子,说明如何在编程IDE中连接Redis

启动IntelliJ IDEA,打开任一项目

在右侧工具栏中选着Database,点击+号,选择Redis

在弹出的窗口中输入正确的参数,点击左下角Test Connection测试连接,出现Succeeded即为连接成功,同样的方法也可以连接MySQL等其他数据库,与在Navicat中查看无异

5

总结

  至此,Redis入门篇(一)就结束了。通过本篇文章,我们初步了解了Redis作为一个基于内存的键值存储NoSQL数据库的特点和优势。Redis因其高速的读写性能、多样的数据类型支持和灵活的持久化方案,被广泛应用于需要快速数据访问的场景。此外,我们学习了Redis与传统关系型数据库的区别,掌握了基本的安装和配置方法,并了解了不同客户端(命令行客户端、图形化客户端和编程IDE客户端)的使用方式。通过这些内容,我们为进一步深入学习和使用Redis奠定了坚实的基础。