目录
1.认识Redis
Redis(Remote Dictionary Server)是一个基于客户端-服务器架构的存储数据的中间件。它是一种内存数据库,属于NoSQL(非关系型数据库)的一种,可用于作为数据库,缓存/会话存储,消息队列。
它通常被用作中间缓存层,将频繁访问的数据存储在内存中,从而大幅提升读取性能。上文所说的主从分离/冷热分离架构中的缓存服务器就可以用Redis来实现,以提高热点数据的读取性能。
Redis主要特点
1.键值存储:Redis使用简单的键值对(K-V)数据模型。每个键都与一个唯一的值相关联,通过键可以快速访问和操作对应的值。
2.内存存储:Redis将数据保存在内存中,以实现高速的读写操作(还引入了IO多路复用,一个线程管理多个socket)。这使得Redis能够实现非常低延迟和高吞吐量的数据访问
3.可编程的:可直接通过简单的交互式命令进行操作,也可通过脚本的方式,批量执行操作
4.可扩展:Redis提供了一组API,在原有的功能上进行扩展(以支持更多的数据结构,命令),通过几个语言编写Redis扩展,本质上是一个动态链接库
5.持久化与备份:提供持久化功能,将数据写入磁盘或其他持久存储介质。此外,一些RDS还支持数据备份和恢复功能,以防止数据丢失
6.支持集群:支持水平扩展(类似于分库分表),将数据分片到多个节点上,以提高存储和处理能力
7.高可用性:Redis支持主从复制(Master-Slave Replication)和哨兵(Sentinel)机制,以提供数据的高可用性和容错能力。通过配置主从复制和哨兵节点,Redis可以实现自动故障恢复和故障转移
主要应用场景
1.实时的数据存储(Real-time data store),将 Redis 当作数据库。适用于对性能要求高的业务场景
2.作为缓存/会话存储(Caching & session storage),MySql存储数据空间大,但是读取速度慢,满足不了缓存的要求
会话存储时,cookie用来存储用户信息的身份标识(sessionId),需要session配合,Redis真正存储了用户信息。无论负载均衡器将登录请求分担给哪个应用服务器,都能从Redis中获取到会话
3.消息队列(服务器)(Streaming & messaging),可以实现网络版的生产者-消费者模型(优势:解耦合;削峰填谷)
注意:由于是使用内存来存储数据,不能使用Redis存储大规模数据,考虑使用其它数据库
2.MySQL VS NoSQL
Redis属于一种NoSQL数据库
数据模型:
- MySQL是关系型数据库管理系统(RDBMS),使用表格来组织数据,并使用结构化查询语言(SQL)进行数据操作。数据以行和列的形式存储,且需预定义数据模式和数据类型。
- NoSQL是非关系型数据库,其数据模型可以是键值对(Key-Value)、文档(Document)、列族(Wide-Column)或图形(Graph)等。NoSQL数据库更加灵活,不需要预定义固定的数据模式
扩展性:
- MySQL在水平扩展时存在一些限制,常规部署通常是单机或主从复制架构。虽然可以通过分区和分片等技术来提高性能和可伸缩性,但相对较复杂。
- NoSQL数据库通常天生具备可伸缩性,易于构建分布式集群,可以通过添加更多节点来水平扩展,以应对大规模数据和高并发访问的需求。
强一致性和灵活性:
- MySQL支持强一致性,即保证所有读取操作都能看到最新的写入操作。通过事务和锁机制,确保数据一致性和完整性。
- NoSQL数据库中的一些类型,如键值对存储,可能会放宽一致性要求以换取更高的性能和可用性。这种弱一致性模型在某些场景下更加适用。
查询复杂性:
- MySQL作为关系型数据库,支持SQL语言进行复杂查询,可以执行连接操作、聚合函数和多表关联等。
- NoSQL数据库的查询方式相对简单,通常使用键值对或类似于JSON的查询语法。它们更适合于数据访问模式简单、数据结构扁平化的场景。
如果需要强大的事务支持、复杂查询和一致性保证,以及已经有现有的SQL架构和工具链,那么MySQL是一个不错的选择。对于大规模数据、高并发和灵活的数据模型,以及更容易进行水平扩展的需求,可以考虑使用NoSQL数据库。
此外,也可以在特定场景中将两者结合使用,如使用MySQL作为主数据库,然后使用NoSQL数据库作为辅助或缓存数据库来提升性能。
3.Redis的安装与配置
redis5的安装
Redis官方不支持Windows版本的,需要在Linux中安装
前置工作:安装Linux环境
我们在CentOS上安装Redis5,如果是CentOS8,yum仓库中默认的redis是5版本,直接yum install
如果是CentOS7,yum仓库中默认的redis是3版本,不能直接yum install
需要先安装额外的软件源-scl源
yum install centos-release-scl-rh
安装redis5
修改配置文件
安装完成之后,由于默认的安装目录比较深且复杂,我们通过符号链接,把需要用的关键内容设置到方便使用的目录中,相当于快捷方式
1)针对可执行程序设置符号链接
[root@localhost user]# cd /usr/bin
[root@localhost bin]# ln -s /opt/rh/rh-redis5/root/usr/bin/redis-server ./redis-server
[root@localhost bin]# ln -s /opt/rh/rh-redis5/root/usr/bin/redis-sentinel ./redis-sentinel
[root@localhost bin]# ln -s /opt/rh/rh-redis5/root/usr/bin/redis-cli ./redis-cli
2)针对配置文件设置符号链接
[root@localhost etc]# ln -s /etc/opt/rh/rh-redis5/ ./redis
[root@localhost etc]# ll redis/
总用量 76
drwxr-xr-x. 2 root root 6 4月 17 2019 opt
drwxr-xr-x. 2 root root 6 4月 17 2019 pki
drwxr-xr-x. 5 root root 52 7月 10 07:36 pm
-rw-r-----. 1 redis root 61916 10月 25 2021 redis.conf
-rw-r-----. 1 redis root 9837 10月 25 2021 redis-sentinel.conf
修改配置文件
1)设置ip地址
先进入redis的配置文件中
将ip地址127.0.0.1修改为0.0.0.0
2)将保护模式设置为no
3)启动守护进程
服务器程序一般都是一后台进程的方式运行,linux中的进程,分为前台进程和后台进程。前台进程会随着终端的关闭结束,后台进程不会随终端关闭而关闭
4)设置工作目录
创建工作目录
在配置文件中,设置工作目录
[root@localhost redis]# mkdir -p /var/lib/redis
[root@localhost redis]# vim redis.conf
5)设置日志目录
先创建日志目录
[localhost redis]# mkdir -p /var/log/redis/
在配置文件中,设置日志目录
启动redis
启动redis命令:redis-server /etc/redis/redis.conf
[root@localhost redis]# mkdir -p /var/log/redis/
[root@localhost redis]# redis-server /etc/redis/redis.conf
[root@localhost redis]# netstat -anp | grep redis
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 64192/redis-server
[root@localhost redis]# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
ping:与redis服务做心跳测试,服务端正常的话会返回pong
redis成功启动并且绑定端口为6379。进程id为64192
关闭redis:根据netstat或者ps查询到redis的服务器的pid,再根据pid进行kill即可
关闭redis命令:kill 64192
后续如果修改了配置文件,需要重启redis才能生效
查看redis生成的日志文件
[root@localhost redis]# cd /var/log/redis/
[root@localhost redis]# ll
总用量 4
-rw-r--r--. 1 root root 2496 7月 10 08:31 redis-server.log
[root@localhost redis]# vim redis-server.log
4.Redis客户端
Redis也是一个基于客户端-服务器(Client-Server)架构的内存数据库
命令行客户端
自带的命令行客户端,可通过命令直接启动
redis-cli -h <host> -p <port>
其中 <host>
是Redis服务器的主机名或IP地址,<port>
是Redis服务器监听的端口号。
输入密码(如果有密码保护)。如果Redis服务器设置了密码保护,命令行客户端将提示输入密码以进行身份验证。输入密码后,按下回车键
图形化界面客户端
桌面程序或web程序,使用较少,依赖的是windows系统,连接到windows系统后会有诸多限制。
基于redis的API自行开发客户端
工作中最主要的形态,后续会通过java视角去演示开发客户端的过程
注意:redis的“快”是相对于mysql这类关系型数据库的,如果是直接和内存中的操作变量相比就没有优势甚至更慢了。
比如针对单机系统,应用程序要存储K-V结构的数据,那么使用redis还是HashMap更好呢?
引入redis,一定是比变量HashMap更慢的,因为map是直接操作内存,redis是先通过网络再操作内存的
具体是否使用redis还要考虑实际的需求,引入redis的缺点是会更慢,但数据能单独存储,后续重启服务器不会影响数据内容,使用hashmap,服务器重启后数据就没了。
此外,前文所描述的,如果未来要扩展成分布式系统,使用redis也是更佳的