目录
[2.1 In-memory data structures(在内存中存储数据)](#2.1 In-memory data structures(在内存中存储数据))
[2.2 Programmablilty(编程能力)](#2.2 Programmablilty(编程能力))
[2.3 Extensibility(扩展能力)](#2.3 Extensibility(扩展能力))
[2.4 Persistence(持久化)](#2.4 Persistence(持久化))
[2.5 Clustering(集群)](#2.5 Clustering(集群))
[2.6 High availability(高可用)](#2.6 High availability(高可用))
[3.1 Real-time data store(实时的数据存储)](#3.1 Real-time data store(实时的数据存储))
[3.2 session storage(会话存储)](#3.2 session storage(会话存储))
[3.3 Streaming & messaging(消息队列)](#3.3 Streaming & messaging(消息队列))
一,关于Redis
Redis是一个和MySQL一样的"客户端 - 服务器" 结构的程序,Redis客户端和服务器可以在同一个主机上,也可以在不同主机上。
Redis是一个能在内存中存储数据的中间件,可以用作数据库,也可以用作数据缓存,在分布式系统中能大展拳脚
二,Redis特性介绍
2.1 In-memory data structures(在内存中存储数据)
MySQL主要是通过"表 "的方式来存储和组织数据的,称为"关系型数据库"。
而Redis主要是通过"键值对 "的方式来存储组织数据的 --> key是string,value可以是其它的数据结构 --> 称为"非关系型数据库"。
2.2 Programmablilty(编程能力)
针对Redis的操作,我们可以直接通过简单的交互式命令进行操作,也可以通过一些脚本的方式,批量执行一些操作 --> Lua语言,也是编程语言
2.3 Extensibility(扩展能力)
我们可以在Redis原有的功能基础上,再进行扩展,Redis提供了一组API(C,C++,Rust,通过这几个语言编写Redis扩展,本质上就是一个动态链接库)
除了它提供的API,我们可以去自己扩展Redis的功能,比如Redis自身提供了很多的数据结构和命令,通过扩展可以让Redis可以支持更多的数据结构和命令
2.4 Persistence(持久化)
Redis是把数据放在内存上的,这样就可以快速访问 ;而内存上的数据是易失的 ,进程退出/系统重启等等事件都会使内存没了。
所以Redis会把部分数据存储在硬盘上,内存为主,硬盘为辅,硬盘相当于备份内存数据,如果Redis重启,就会在重启时加载硬盘数据到内存。
2.5 Clustering(集群)
Redis作为一个分布式系统的中间件,能够支持集群是很关键的
一个Redis存储的数据是有限的,内存也是有限的,就可以引入多个服务器,部署多个Redis节点,每个节点存储数据的一部分
2.6 High availability(高可用)
Redis自身也支持主从结构的,从节点相当于主节点的备份,保证系统的可用性(主节点挂了,从节点也能顶上,这个过程是自动的)
三,Redis应用场景
3.1 Real-time data store(实时的数据存储)
- 这个就是把Redis当做了数据库,应用与对实时性要求比较高的场景,需要有更低的延迟和更高的吞吐量
- 大多数情况下,对于数据存储的考虑首先是"大",即存储的空间要大,但是仍然有一些场景考虑的是"快"。
- 比如"搜索引擎",广告搜索(商业搜索),对于性能的要求是非常高的,所以搜索引擎中没有用到MySQL这样的数据库,所以就把所有需要检索的数据都存储在内存中,就是使用类似于Redis这样的内存数据库来完成的
- 当然,使用这样的内存数据库存储大量的数据,需要不少的硬件资源的,所以一般只有不差钱的大厂才用得起
- Redis也可以和MySQL一起使用,遵循二八原则,将热点数据存在Redis中,这种时候Redis存的是全量数据,不能随便丢。也可以让Redis存部分数据,全量数据以mysql为主
3.2 session storage(会话存储)
- cookie 是实现用户身份信息的保存,同时也需要session配合(前者只是在浏览器这边存储了一个用户的身份标识,session才是真正存储在服务器上的用户的数据)
- 之前的session是直接存储在应用服务器上的,现在变成分布式系统后,引入负载均衡器,用户服务器有多个,用户的请求可能会被随机分发到不同的服务器,所以假设用户第一次请求,负载均衡器分到了1号服务器,生成了会话,但是用户第二次请求时,负载均衡器可能会把数据发到2号服务器,由于2号服务器没有会话,所以可能会重新登录,这样的反复登录会造成大量的资源浪费
- 解决:1:想办法让负载均衡器把同一个用户的请求始终打到同一个服务器上 2:把会话数据单独拿出来,放到一台独立的服务器上,每个应用服务器都把会话放到这个服务器上,访问也访问这一个
3.3 Streaming & messaging(消息队列)
- 此处的消息队列不是Linux进程间通信的那个,此处的消息队列是一个单独的服务器,只是有了消息队列的功能
- 基于这个我们就可以实现一个基于网络版本的生产者消费者模型
- 优势:1:解耦合 2,削峰填谷
- 业界也有很多知名的消息队列:RabbitMQ,Kafka,RocketMQ等,Redis也是提供了消息队列的功能的,是Redis研发的初心
- 但我们几乎不使用Redis作为消息队列使用
四,Redis为什么快?
- Redis数据在内存中,就比访问硬盘的数据库,要快很多
- Redis的核心功能都是比较简单的逻辑 ------ 核心功能基本都是操作内存中的数据结构
- 从网络角度上,Redis使用了IO多路复用的方式(epoll,用一个线程管理很多个socket)
- Redis使用的是单线程模型(虽然更高版本的Redis引入了多线程,但是只是在网络IO用到了,核心业务逻辑还是单线程),减少了不必要的线程之间的竞争开销,提高效率(多线程不一定能提高效率,前提是CPU密集型的任务,使用多线程可以充分利用CPU多核资源,但是Redis核心任务,主要就是操作内存的数据结构,是比较简单快捷的,不会吃很多CPU资源 ------ 没有银弹)
- Redis使用C语言开发的,所以快(该结论太勉强,不太认可),比如MySQL也是C语言开发的,凭啥Redis快
五,在Linux上安装Redis
下面展示在Ubuntu环境上安装Redis客户端和服务器,并启动服务器再让客户端连接上服务器
bash
sudo apt install redis
如果是Centos,就八上面的apt换成yum即可
然后就是修改下配置文件,因为Redis是基于网络的,所以配置文件会默认将Redis的连接IP设为127.0.0.1,我们需要修改成0.0.0.0,表示该服务器可以支持任何其它IP来进行连接
bash
vim /etc/redis/redis.conf
修改完成后我们直接启动redis服务器(都需要root权限)
bash
sudo service redis-server start
也可以输入这个,查看服务状态,里面有的active,表示正常运行
bash
service redis-server status
然后就是用客户端连接服务器,直接在命令行输入 redis-cli 即可;进入到客户端以后,输入ping,如果打印PONG,表示客户端正常运行。
然后我们也可以在其它主机上使用特定IP和端口来连接Redis服务器,如下图:
六,Redis客户端介绍
Redis也是一个客户端-服务器 结构的程序,MySQL也是这样,redis客户端和服务器可以在同一个主机上,也可以在不同主机上。并且服务器可以给多个客户端提供服务,Redis服务器是本体,负责存储和管理数据
Redis也有很多形态:
- 自带命令行的客户端:redis-cli 或者也可以redis-cli -h 127.0.0.1 -p 6379
- 图形化界面:桌面程序,web程序,但是图形化程序依赖与Windows。而以后在实际工作中,用来办公的windows系统,连接到服务器可能会有很多限制,所以不能保证和Linux一样,能100%连上redis服务器(Windows中间可能会经历跳板机,堡垒机,权限校验等)
- 基于Redis的API自行开发客户端:工作中最主要的形态,非常类似于MySQL的C语言API和JDBC
咱们说Redis快,是相对于MySQL这样的关系型数据库的,但是如果是和内存中的操作变量相比,就没有优势了,甚至更慢。
比如我要存一个键值对,可以用redis来存,也可以直接在内存中搞个hash map来存,但是使用hash map是直接操作内存 ,使用redis是先通过"网络",再操作内存的。
所以,是否要使用redis是需要结合实际业务的,引入redis会变慢,但是可以把数据单独存储,服务器重启不会影响到数据内容,假设未来要扩展分布式系统,使用redis是最佳的