简单了解Redis(初识阶段)

news2024/11/17 17:48:08

1.认识Redis

对于Redis有一个很重要的点就是,它存储数据是在内存中存储的。

但是对于单机程序,直接通过变量存储数据的方式是更优的,在分布式系统下 Redis才能发挥威力

因为进程是有隔离性的,Redis可以基于网络,把进程自己的内存中的变量给别的进程,甚至是别的主机使用。这是Redis最核心的地方。

Redis可以用作数据库。它相比MySQL要快很多。因为Redis存储数据是内存级的。

但是内存存储快是快,但是劣势也很明显,那就是空间太小了。

往往都是Redis和MySQL结合起来使用。 在互联网上存在一个 二八原则,那就是 20%的热点数据(高频访问的数据),能满足80%的访问需求,那么就只要把这20%用Redis存储,全量数据用MySQL存储。此时Redis就是充当Cache的角色,不过这样就会使得系统的设计变得复杂,并且修改Redis中的数据时,还需考虑Redis和MySQL之间的同步问题。

2.浅谈分布式系统的演变过程

了解单机架构 

 即只有一台服务器,这个服务器负责所有的工作。

 虽然现在的硬件发展速度非常快,单机架构即便只有一台主机,但是这台主机的性能也是可以很高的,但是还是架不住用户量和数据量的水涨船高,单机的性能再高也是有上限的,

一台服务器的核心硬件资源:1.CPU 2.内存 3.硬盘 4.网络 。当然还有其他的。

 什么是分布式?

之前说了单机架构模式, 还有服务器的核心资源。当某一时刻,请求的数量太多了,就可能会导致服务器的某个硬件资源不够用了,无论是哪个方面不够用了,都会导致服务器处理请求的时间变长,甚至出错。

如果碰到这种情况,怎么处理呢?

1.开源:

简单粗暴,直接增加更多的硬件资源来解决性能问题。但是需要注意:一台主机能增加的硬件资源是有限的。比如CPU ,内存条,这些取决于主板的扩展能力。

当一台主机扩展到极限的时候,那么就只能引入多台主机了。而且不是说新的机器买来就可以直接解决问题,还需要在软件上做出对应的调整和适配。当引入了多台主机时,就可以把这个系统称为”分布式系统“了。

不过一般万不得已是不会引入分布式系统的,因为这会使得系统的复杂度大大提高。

2.节流:

节流就是从软件层面上去优化,需要通过性能测试找到性能瓶颈,再找出切实有效的优化方案。这个是比较难的。

数据库分离和负载均衡 

也就是应用服务和数据库服务分离

这里就已经是两个服务器了。 

此时还可以根据服务器业务的不同,针对性的给服务器配置硬件资源,以此达到更高的性价比。

如果一台应用服务器还是不够用的话,那么还可以引入更多的服务器结点:

 

此时用户访问就会先访问负载均衡器 / 网关(也是一个单独的服务器),然后负载均衡器再将请求进行分发。

另外,看似负载均衡器在这里承担了所有的请求,但是负载均衡器是分配任务的,所以它对于请求的承担能力是远超服务器的。就算请求量大到负载均衡也承担不了时,同样可以引入更多的硬件资源,也就是引入更多的负载均衡器(引入更多机房)。

数据库的读写分离

上面说到了应用服务和数据服务分离,这样降低了应用服务的压力,但是数据库服务的压力又上来了,因此为了降低数据库服务的压力又有两种解决办法:

开源和节流。其中节流门槛高,难度大,这里主要说开源。

 这里的核心思想就是读写分离。图中只画了两台服务器,实际上可能是多台。

在实际的应用场景中,读的频率是比写的频率高的,因此主服务器一般只有一个,从服务器有多个
并且从服务器也可以通过负载均衡的方式让应用服务器进行访问。

引入缓存 

数据库有一个天然的问题,因为它是读写硬盘访问的,所以速度是比较慢的。因此可以将数据进项冷热划分,将热数据放到缓存中,这样访问速度就能快很多了。

将热点数据存到缓存服务器中,数据库中存的依旧是完整的全量数据。 

而我们一直说的Redis就处于缓存服务器这个位置。 

数据库分库分表 

引入分布式系统,不光要应对更高的请求量(并发量),还要能够应对更大的数据量(比如短视频平台的数据量就很大)。当数据量多到一台服务器已经存不下的时候,就需要多台主机来存储。 

所以还可以针对数据库再进行水平拆分,这里也叫分库分表

比如本来一个数据库服务器上有多个数据库(指逻辑上的数据集合),现在就引入了多个数据库服务器,每个数据库服务器存储一个或者一部分数据库。 

图中展现的是分库,如果当某张表特别大的时候,也可以对表进行拆分,也就是分表。

引入微服务 

这里针对的就是应用服务器,当应用服务器里的功能太多太复杂了,就可以把它的功能进行拆分,本来是一个服务器,现在拆分了,就叫做微服务。

 

微服务本质上是解决 ”人“的问题。因为当一个应用服务功能越来越多,结构越来越复杂时,就需要更多的人来维护。

 那么就可以按照功能拆分成多组微服务,这样就有利于上述人员的结构组织的分配了。

虽然微服务解决了人的问题,但是它也是付出了代价的:

 

 

概念的补充 

应⽤(Application)/ 系统(System):

为了完成⼀整套服务的⼀个程序或者⼀组相互配合的程序群。

 模块(Module)/ 组件(Component):

 一个应用,里面有很多个功能,每一个独立的功能就可以称为一个模块 / 组件。

当应⽤较复杂时,为了分离职责,将其中具有清晰职责的、内聚性强的部分,抽象出概念,便于
理解。

分布式(Distributed)

系统中的多个模块被部署于不同服务器之上,即可以将该系统称为分布式系统。如 Web 服务器与
数据库分别⼯作在不同的服务器上,或者多台 Web 服务器被分别部署在不同服务器上。⽣活例⼦类⽐:为了更好的满⾜现实需要,⼀个在同⼀个办公场地的⼯作⼩组被分散到多个城市的不同⼯作场地中进⾏远程配合⼯作完成⽬标。跨主机之间的模块之间的通信基本要借助⽹络⽀撑完成。

引入多个主机 / 服务器,协同配合完成一系列的工作 (物理上的多主机)

集群(Cluster)

被部署于多台服务器上的、为了实现特定⽬标的⼀个/组特定的组件,整个整体被称为集群。⽐如
多个 MySQL ⼯作在不同服务器上,共同提供数据库服务⽬标,可以被称为⼀组数据库集群。
分布式 vs 集群。通常不⽤太严格区分两者的细微概念,细究的话,分布式强调的是物理形态,即
⼯作在不同服务器上并且通过⽹络通信配合完成任务;⽽集群更在意逻辑形态,即是否为了完成特定服务⽬标。

引入多个主机 / 服务器,协同配合完成一系列的工作 (逻辑上的多主机)

主(Master)/ 从(Slave) 

集群中,通常有⼀个程序需要承担更多的职责,被称为主;其他承担附属职责的被称为从。⽐如
MySQL 集群中,只有其中⼀台服务器上数据库允许进⾏数据的写⼊(增/删/改),其他数据库的数据修改全部要从这台数据库同步⽽来,则把那台数据库称为主库,其他数据库称为从库。

中间件(Middleware)  

⼀类提供不同应⽤程序⽤于相互通信的软件,即处于不同技术、⼯具和数据库之间的桥梁。⽣活
例⼦类⽐:⼀家饭店开始时,会每天去市场挑选买菜,但随着饭店业务量变⼤,成⽴⼀个采购部,由采购部专职于采买业务,称为厨房和菜市场之间的桥梁。

中间件一般是和业务无关的服务:

 1.数据库

2.缓存

3.消息队列(是生产者消费模型)

4...

评价指标(Metric):
1.可⽤性(Availability)
考察单位时间段内,系统可以正常提供服务的概率/期望。例如: 年化系统可⽤性 = 系统正常提供
服务时⻓ / ⼀年总时⻓。
平时我们常说的 4 个 9 即系统可以提供 99.99% 的可⽤性,5 个 9 是 99.999% 的可⽤性,以此类推。 我们平时只是⽤⾼可⽤(High Availability HA)这个⾮量化⽬标简要表达我们系统的追求。

响应时⻓(Response Time RT) 

指⽤⼾完成输⼊到系统给出⽤⼾反应的时⻓。 这个指标越小越好

吞吐(Throughput)vs 并发(Concurrent) 

吞吐考察单位时间段内,系统可以成功处理的请求的数量。并发指系统同⼀时刻⽀持的请求最⾼
量。例如⼀条辆⻋道⾼速公路,⼀分钟可以通过 20 辆⻋,则并发是 2,⼀分钟的吞吐量是 20。实践中,并发量往往⽆法直接获取,很多时候都是⽤极短的时间段(⽐如 1 秒)的吞吐量做代替。我们平时⽤⾼并发(Hight Concurrnet)这个⾮量化⽬标简要表达系统的追求。

通常用响应时长和吞吐&&并发来衡量服务器性能,但是它们衡量的角度是不一样的。 

分布式系统 小结:

 大致过程:

1.单机架构 ->

2.数据库和应用分离 ->

3.引入负载均衡  应用服务器 => 集群 ->

4.引入读写分离,数据库主从结构 ->

5.引入缓存,冷热数据分离 ->

6.引入分库分表,数据库能进一步扩展空间 ->

7.引入微服务,从业务上进一步拆分应用服务器

3.Rdies的一些特性介绍(优点) 

Redis特性介绍 

Redis是内存中存储数据的中间件,它作为数据库,作为数据缓存之所以能在分布式系统中大展拳脚是因为它的一些特性(优点)

1.数据在内存中存储的->速度快:

 2.基于键值对的数据结构服务器

⼏乎所有的编程语⾔都提供了类似字典的功能,例如 C++ ⾥的 map、Java ⾥的 map、Python ⾥
的 dict 等,类似于这种组织数据的⽅式叫做基于键值对的⽅式,与很多键值对数据库不同的是,
Redis 中的值不仅可以是字符串,⽽且还可以是具体的数据结构,这样不仅能便于在许多应⽤场景的开发,同时也能提⾼开发效率。Redis 的全程是 REmote Dictionary Server,它主要提供了 5 种数据结构:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(ordered set /zet),同时在字符串的基础之上演变出了位图(Bitmaps)和 HyperLogLog 两种神奇的 ”数据结构“,并且随着 LBS(Location Based Service,基于位置服务)的不断发展,Redis 3.2. 版本种加⼊有关 GEO(地理信息定位)的功能,总之在这些数据结构的帮助下,开发者可以开发出各种 “有意思” 的应⽤。

3.有丰富的功能,拓展性强大

除了 5 种数据结构,Redis 还提供了许多额外的功能:
提供了键过期功能,可以⽤来实现缓存。
提供了发布订阅功能,可以⽤来实现消息系统。
⽀持 Lua 脚本功能,可以利⽤ Lua 创造出新的 Redis 命令。
提供了简单的事务功能,能在⼀定程度上保证事务特性。
提供了流⽔线(Pipeline)功能,这样客⼾端能将⼀批命令⼀次性传到 Redis,减少了⽹络的开
销。

 比如我们可以自己用C++代码去拓展Redis的功能。

 4.简单稳定

其次,Redis 使⽤单线程模型,
这样不仅使得 Redis 服务端处理模型变得简单,⽽且也使得客⼾端开发变得简单。最后,Redis 不需要依赖于操作系统中的类库(例如 Memcache 需要依赖 libevent 这样的系统类库),Redis ⾃⼰实现了事件处理的相关功能。
但与简单相对的是 Redis 具备相当的稳定性,在⼤量使⽤过程中,很少出现因为 Redis ⾃⾝ BUG
⽽导致宕掉的情况。

 5.客户端语言多

C、C++、Java、PHP、Python、NodeJS 等。
6.持久化(Persistence)

通常看,将数据放在内存中是不安全的,⼀旦发⽣断电或者机器故障,重要的数据可能就会丢
失,因此 Redis 提供了两种持久化⽅式:RDB 和 AOF,即可以⽤两种策略将内存的数据保存到硬盘中。

 7.高可用性(High Availability)

假设主节点挂掉了,那么从结点可以立马顶上,不至于让整个服务直接宕机 。

Redis为什么快呢? 

 1.Redis数据在内存中,那就比访问硬盘的数据库要快很多。

2.Redis核心功能都是比较简单的逻辑

3.从网络角度上来说,Redis使用了IO多路复用

4.Redis使用的是单线程模型(虽然高版本Redis引入多线程,但是是对网络部分的),

这样减少了不必要的线程之间的竞争开销。

注意:多线程提高效率的前提是 CPU密集型的任务,并且能使多个线程可以充分利用CPU的多核资源。但是Redis的核心任务主要就是操作内存的数据结构。

5.Redis是用C语言开发的,所以快。不过需要注意,这里的快是指跟其他语言相比起来,用C语言快,而不能跟MySQL比,因为MySQL也是C语言开发的,而之所以会引入Redis就是因为MySQL慢。

4.Redis的应用场景 

1.作为数据库

虽然在大多数情况下,数据库存储优先考虑的是 “大”,但是还是有一些场景下考虑的是 “快”。因为Redis的最大特点就是快,所以Redis就可以满足 考虑 “快”的场景下的要求。不过此时Redis存储的就是全量数据了,此时的数据可不能丢失。

2.作为缓存 && 会话存储

作为缓存我们之前也谈到过,因为在互联网的数据访问遵循二八原则,所以我们可以把热数据放在 缓存也就是Redis中,全量数据依旧放在MySQL这样的数据库中。此时Redis的数据有丢失也不要紧,丢失了可以从MySQL中再加载回来。

那么会话存储又是什么呢?
我们之前学过Cookie,而Cookie是和session搭配使用的。

假设在一个分布式系统下

有一个用户发起了登录请求,这个请求经过负载均衡器转发到应用服务器上,然后应用服务器就会生成一个会话,并给用户返回了这个会话的id,保存了用户的登录信息,那么用户 下次就只要拿着合法的会话id就直接登录了。

那么此时又有一个问题:因为请求是要先经过负载均衡器的,而会话是形成在一个应用服务器上的,其他的应用服务器没有,那么当用户又发来一个请求时,它不一定会被转发到之前的那个服务器,就导致用户需要再登录一次,如果用户运气不好每个请求都要登录,那就有点反人类了。于是有两种解决方法:

1.想办法让负载均衡器把同一个用户的请求始终打到同一台机器上。

2.直接把会话数据单独拎出来,放到一组独立的机器上存储,也就是用Redis,所以这就是Redis 应用在会话存储上。

3.作为消息队列 

这里的消息队列不是Linux进程通信的消息队列。

那么Redis不能用于什么场景了,这已经显而易见了:
Redis不能用于大规模存储(太贵了)。 

5.Redis环境搭建

这里以Redis 5为例。 

Ubuntu下安装 

在root用户下执行

apt install redis

 一般下载好它会自己启动

可以查看一下

netstat -nltp | grep redis

关于redis的配置文件 ,在 /etc/redis 目录下:

cd /etc/redis

 

 vim打开后发现这里的bind绑定的是本地环回

这样只能本地客户端才能连接这个服务器,我们要将其修改成为  0.0.0.0  。 

还有这里的关于主机保护,为方便今后能跨主机访问,我们给yes 修改为 no

修改完之后,记得要重启服务器。

service redis-server restart

 执行

service redis-server status

可以查看服务的运行状态

在本机执行

redis-cli

 如果想验证是否联通了,可以输入ping,如果返回了一个 PONG 则说明联通了

使用 ctrl + d 来退出redis客户端

Redis客户端介绍 

首先我们要知道,Redis是一个 客户端-服务器结构的程序,这一点和MySQL是一样的。

Redis的客户端有多种形式:

1.自带命令行客户端。

另外 在这里登录时我们可以指明 ip地址和端口号进行登录。

2.图形化界面的客户端

不是很推荐,因为不稳定

 3.基于redis的api自行开发的客户端 (工作常见)

补充:

关于Redis的速度快,是相对于MySQL这样的关系型数据库的,如果直接和内存中的操作变量相比,就没有优势了,甚至更慢了。

举例:
一个单机系统,用hashmap存储了一些简单的数据,此时对于是否要引入Redis,是要结合实际应用场景的,这里举例引入后的优缺点:

缺点:

一:系统变得复杂。

二:hashmap是直接操作内存的,而Redis是要先通过网络,再操作内存的,速度反而会下降。

优点:

一:有了Redis后,数据可以单独存储,如果服务器重启了也不会影响到数据,持久化了。

二:未来如果要扩展成分布式系统,那么用Redis要更佳。

所以综上,对于是否要引入一个技术(Redis),不仅要想清楚能解决什么问题,还得想明白会引来什么新的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2162613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

solidwork怎么隐藏实体再

在实际生产生活中,由于一些零件重叠或覆盖导致我们无法正确装配 我们就需要隐藏实体来看内部结构 假如不需要这个白色的大腿 先双击点他,然后右键 此时即可隐藏 同时右边零件会变白 想重新显示这样操作就可以了

Linux 常用命令(待更新)

1、pwd命令 2、cd命令 3、ls命令 4、locate命令 5、clear命令 6、cat命令 7、head命令 8、tail命令 9、grep命令 10、chmod命令 11、cp命令 12、mv命令 13、mkdir命令 14、rm命令 15、文件压缩和有关归档的命令 16、文件系统的命令 17、与系统管理相关的命令 …

2024 Snap 新款ar眼镜介绍

2024 snap 新款ar眼镜介绍 2024 Snap 新款ar眼镜介绍 助力快速掌握数据集的信息和使用方式。

【中台设计】数字中台,大数据中台解决方案,中台建设指南(资料Word分享)

1. 中台概念 2. 推动企业组织模式演进 3. 建设方法 4 .中台内容 5. 数据安全体系 中台内容围绕数据中台建设评估、整体框架、数据采集,结构化、半结构化、非结构化的数据采集,数据计算能力、存储计算引擎、数据架构、数据挖掘、各种不同数据层建设、模型…

煤矿井下钻场目标检测数据集 5类 voc格式

煤矿井下钻场目标检测数据集 本数据集包含了来自不同钻场和环境背景条件下的70948张图片,涵盖了夹持器、钻机卡盘、煤矿工人、矿井安全帽和钻杆等五类目标,并提供了PASCAL VOC格式的标注文件。 摘要 煤矿井下钻场打钻是解决瓦斯灾害、水害、隐蔽地质灾害…

点云与Open3D

点云数据介绍 点云与三维图像的关系:三维图像是一种特殊的信息表达形式,其特征是表达的空间中三个维度的数据,表现形式包括: 深度图(以灰度表达物体与相机的距离),几何模型(由CAD软…

Solidity语言:重点学习Solidity编程语言,这是EVM上最常用的智能合约语言。

Solidity是一种面向合约的编程语言,用于在以太坊虚拟机(EVM)上编写智能合约。它是Solidity开发者在以太坊平台上创建智能合约的主要选择之一。 学习Solidity的重点包括以下几方面: 语法和数据类型:学习Solidity的基本…

工业边缘计算网关和普通网关的区别-天拓四方

随着物联网(IoT)和工业4.0的快速发展,网关作为连接不同网络和设备的关键设备,其角色和功能日益凸显。在工业环境中,工业边缘计算网关和普通网关虽然都扮演着重要的角色,但它们在功能、应用场景和性能上存在…

算法:69.x的平方根

题目 链接:leetcode链接 思路分析(二分算法) 当然你可以使用暴力查找,但是二分算法的时间复杂度更好。 我们先用暴力查找找点灵感 x :1 2 3 4 5 6 7 8 x2:1 4 9 16 25 36 49 64 我们的目的是找到一个x…

【Java特性】多态详解——对象类型转换与 instanceof 关键字的运用

多态是指不同类的对象在调用同一个方法时所呈现出的多种不同行为。通常来说,在一个类中定义的属性和方法被其他类继承或重写后,当把子类对象直接赋值给父类引用变量时,相同引用类型的变量调用同一个方法所呈现出的多种不同形态。多态不仅解决…

My_string 运算符重载,My_stack

思维导图 将My_string类中的所有能重载的运算符全部进行重载 、[] 、>、<、、>、<、! 、&#xff08;可以加等一个字符串&#xff0c;也可以加等一个字符&#xff09;、输入输出(<< 、 >>) My_string my_string.h #ifndef MY_STRING_H #define MY_…

【论文】FunAudioLLM:一个旨在增强人类与大型语言模型(LLMs)之间自然语音交互的模型家族

研究背景 1.研究问题&#xff1a;这篇文章要解决的问题是如何增强人类与大型语言模型&#xff08;LLMs&#xff09;之间的自然语音交互。具体来说&#xff0c;研究集中在语音识别、情感识别和音频事件检测&#xff08;多语言&#xff09;以及语音生成&#xff08;多语言、零样…

云栖3天,云原生+ AI 多场联动,新产品、新体验、新探索

云栖3天&#xff0c;云原生 AI 20场主题分享&#xff0c;三展互动&#xff0c;为开发者带来全新视听盛宴 2024.9.19-9.21 云栖大会 即将上演“云原生AI”的全球盛会 展现最新的云计算技术发展与 AI技术融合之下的 “新探索” 一起来云栖小镇 见证3天的云原生AI 前沿探索…

828华为云征文 | 在华为云上通过Docker容器部署Elasticsearch并进行性能评测

目录 前言 1. 华为云X实例介绍及优势 1.1 柔性算力 1.2 vCPU和内存的灵活配比 1.3 成本效益与性能 2. 安装并运行 Docker 2.1 修改仓库配置文件 2.2 安装 Docker 2.3 启动 Docker 3. 使用Docker部署Elasticsearch 3.1 拉取Elasticsearch镜像 3.2 启动Elasticsearch…

SpringBoot整合ELK实现日志监控(保姆级教程)

新建SpringBoot项目 pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.…

[单master节点k8s部署]24.构建EFK日志收集平台(三)

Kibana Kibana是elasticsearch的可视化界面。 首先创建kibana的服务&#xff0c;yaml文件如下。k8s里的服务分为四种&#xff0c;clusterIP为仅仅为pod分配k8s集群内部的一个虚拟ip&#xff0c;用于集群内的pod通信&#xff0c;而不对外暴露。elasticsearch的服务就是cluster…

Redis 优化

目录 优雅的 key 删除 Bigkey 恰当的数据类型 批处理优化 Pipeline 集群下的批处理 服务端优化 持久化配置 慢查询 命令以及安全配置 内存安全和配置 内存缓冲区配置 集群最佳实践 集群带宽问题 集群还是主从 优雅的 key 删除 Bigkey Bigkey 内存占用较多&…

线程池和JUC

1. 线程池 1.1 线程状态介绍 当线程被创建并启动以后&#xff0c;它既不是一启动就进入了执行状态&#xff0c;也不是一直处于执行状态。线程对象在不同的时期有不同的状态。那么Java中的线程存在哪几种状态呢&#xff1f;Java中的线程 状态被定义在了java.lang.Thread.Stat…

微服务学习笔记之Docker

目录 认识Docker 安装Docker 安装yum工具 配置Docker的yum源 更新yum&#xff0c;建立缓存 安装Docker 启动并校验 配置镜像加速 Docker常见命令 命令 演示 给命令起别名 Docker数据卷 认识数据卷 数据卷常见命令 nginx的html目录挂载演示 数据卷挂载本地目录或…

强制类型转换

问题 最近在研读公司项目的时候发现一段很有意思的代码&#xff1a; if (a instanceof b) {B ent (B) a;if (!useGivenAuditAttributes) {ent.createdAt MyDateUtils.now();ent.createdBy AppContext.instance.loginUser.userId;ent.lastUpdatedAt ent.createdAt;ent.las…