一文了解Redis

一.什么是Redis

与MySQL一样,Redis也是客户端服务器结构的程序,是基于内存的键值对存储系统,属于NoSQL的一种。与很多键值对数据库不同的是,Redis 中的值可以是由 string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、 Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成,因此 Redis可以满⾜很多的应⽤场景。

Redis有很多优势

首先,Redis是基于内存进行存储的,也就是说Redis将数据存储到内存上,然而MySQL是将数据存储到硬盘上,我们知道cpu访问内存的速度比访问硬盘的速度快很多

有人可能会说,Redis是存储在内存中,但是定义变量不也是在内存中存储吗?那为啥还要使用Redis呢?其实Redis主要是在分布式系统中发挥威力,单机程序中使用变量才更方便。因为,我们知道,进程间具有隔离性,进程间的通信需要经过网络,而Redis就是基于网络的,它可以将自己内存中的变量给别的进程甚至别的主机上的进程使用

Redis虽然比MySQL快很多,但是它有一个缺点就是存储空间小。那怎么就能够又大又快呢?那就是Redis与MySQL配合使用,把Redis当作cache缓存,而MySQL还是主要的存储介质,全量数据依然存放在MySQL中,将常被访问到的热点数据存到Redis中,减少访问MySQL的次数。但这也是有代价的,那就是系统的复杂程度大大提高,而且在修改数据时会涉及到Redis与MySQL同步的问题

Redis初心是用作一个消息中间件(消息队列)来实现分布式系统下的生产者消费者模型,但现在很少使用Redis当作消息队列

二.Redis特性

1.In-memory Data Structures

在内存中存储数据。

MySQL是通过表的方式在硬盘中存储,是关系型数据库;而Redis则是通过键值对的方式在内存中存储数据

2.Programmability

Redis的可编程性。

使用Lua和Redis函数来扩展Redis

Redis 提供了一个编程接口,可让我们在服务器本身上执行自定义脚本。在 Redis 7 及更高版本中,可以使用 Redis 函数 来管理和运行脚本。在 Redis 6.2 及更低版本中,可以使用 Lua 脚本和 EVAL 命令 对服务器进行编程。

什么是脚本?Redis 中的可编程性一词意味着能够由服务器执行任意用户定义的逻辑。我们将这样的逻辑片段称为脚本

使用脚本可以减少网络开销。原本5次请求可以放到一次请求中,通过一个脚本同时传输给Redis,这样就可以在一次网络通信中完成5次访问Redis的操作。减少网络开销,提高了整体性能。

3.Extensibility

Redis的可扩展性

可以在Redis原有的功能的基础上再进行扩展。Redis提供了一组API,通过C、C++、Rust这几个语言编写Redis扩展(本质上是一个动态链接库),通过扩展能够让Redis使用更多的数据结构。

4.Persistence

持久化

Redis是将数据存储在内存上,但实际上内存中的数据是容易丢失的,会随着进程退出/系统重启而丢失

因此Redis也会将数据存储在硬盘上作为备份,内存为主硬盘为辅,Redis重启时就会加载硬盘中的数据到内存中

5.Clustering

集群

Redis作为一个分布式系统的中间件,能够支持集群是很关键的。一个Redis能存储的数据是有限的,所以引入多个主机,部署多个Redis节点,每个Redis存储数据的一部分,就可以解决问题

6.High availability

高可用

核心:冗余/备份

Redis自身支持主从结构,也就是主从复制架构。Redis提供了复制功能,实现了多个相同数据的Redis副本,从节点就是主节点的备份。主节点挂了,从节点就能够立马补上

7.快

为什么redis快?

1.数据在内存中存储,就比访问硬盘的数据库快

2.Redis的核心功能斗志较简单的逻辑,仅仅是较简单的操作内存的数据结构

3.网络角度:Redis使用了IO多路复用的方式(使用一个线程管理很多个socket,也就是一个线程中可以执行多个请求,或者说一次请求可以完成之前的多次请求的任务)

4.线程角度:Redis使用单线程模型,减少了不必要的线程之间的竞争开销。

为什么Redis不适用多线程呢?多线程不是可以提高效率吗?这就要挖掘本质了,多线程能够提效的前提就是这是一个CPU密集型任务,使用多个线程可以充分利用多核cpu资源。但Redis的核心任务主要是操作内存数据结构,不会吃很多cpu,所以此时使用多线程就起不到作用。

5.Redis使用C语言开发,更贴近操作系统,所以快。(这一条待定,毕竟MySQL也是C语言开发的)

三.Redis使用场景

1.Real-time data store

将Redis当作实时存储的数据库。

大多数情况下,考虑到数据存储,优先考虑“大”,但仍有些场景需要考虑快

例如:搜索引擎的广告搜索(商业搜索),对性能要求就非常高,需要在很短的时间内将与用户输入关键字相关的广告找到并显示到网页上。这种情况下就不适合使用MySQL这样的数据库存储广告到硬盘中,而是要存储到内存中从而提高访问速度,用到的就是类似于Redis这样的内存数据库来完成,当然,使用这样的内存数据库存储大量的数据,需要不少的硬件资源。

2.caching

使用数据库存储数据,虽然存的多,但是非常慢。

然而数据的访问一般都遵循二八原则:20%的数据可以满足80%的访问。

所以可以将MySQL中的热点数据拎出来,存到Redis中,此时Redis只存部分数据,而MySQL依然存储全量数据。访问时,先从Redis中查找,实在找不到再去MySQL中找,减少了访问mysql的次数,从而提高性能。这就相当于将Redis作为cache缓存。

3.session storage

session storage 会话存储。在之前,session都是存储在应用服务器上

如上,第一次请求,请求发送到了A,产生了一个会话,第二次请求,可能发到了B,就又得重新登陆。这如何解决?

方法一:让负载均衡器把同一个用户的请求始终达到同一个机器上,这需要使用userid之类的方式来配合

方法二:把会话拎出来放到同一台机器上(就比如Redis),每个应用服务器都从Redis上读取会话。(好处:即使应用程序重启了,会话也不会丢失)

4.streaming&messaging

Redis可作为消息队列(服务器)

基于此,可实现一个网络版本的生产者消费者模型(以前写的都是单机的生产者消费者模型)。在分布式系统中,服务器与服务器之间,优势也需要使用到生产者消费者模型(优势:解耦合。削峰填谷)

Redis不可以做什么?Redis不可以大规模存储数据

四.Redis本质

与MySQL相同,Redis也是客户端服务器结构的程序。

Redis服务器是Redis的本体。

Redis客户端有很多种形态

1.自带了命令行客户端 redis-cli,在Linux上直接输入redis-cli就可以启动Redis客户端;或者输入redis-cli -h (ip地址) -p (端口号),从而指定ip和端口号,例如 redis-cli -h 127.0.0.1 -p 6379

2.图形化界面的客户端:如桌面程序,web程序(网页),图形化程序依赖windows系统,而未来实际工作中,用来办公的windows系统连接到服务器可能会有诸多限制,你的图形化界面客户端能否连接到你们服务器里面的redis,是个未知数

3.基于redis的api自行开发的客户端(是工作中的主要形态),类似于MySQL的C语言api和JDBC编程

五.Ubuntu安装redis

在linux上安装程序,必须在root用户下

1.su  切换到root用户

2.apt search redis   使用apt命令搜索Redis相关软件包

3.apt install redis 安装redis

4.netstat -anp | grep redis 查看redis所使用的端口号

由图可知,它默认使用6379这个端口号

但上面使用的是127.0.0.1这个ip,需要修改

5.修改redis配置项

redis相关配置都在redis配置文件redis.conf中,它放在/etc/redis这个目录下,如下通过vim编辑器,将下面三个地方进行修改:

首先,在vim编辑器中按/键进入搜索模式,搜索关键字bind,将后面的127.0.0.1改成0.0.0.0,表示任何ip都可以访问我的redis服务器

其次,找到protected-mode 改为no,以便于可以跨主机访问

6.修改完成后,重启redis服务器

没有提示说明重启成功,如果担心未重启,可以通过service redis-server status来查看redis服务器的运行状态

active running说明正常运行

7.redis-cli  使用redis自带的客户端来连接服务器

8.如何退出redis:ctrl+d,相当于输入EOF

9./var/lib/redis是redis的工作目录  /var/log/redis是redis的日志目录,redis-server.log就是redis的日志

10.service redis-server stop 停止redis服务

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索Chrome DevTools的高级技巧与隐藏功能

Chrome DevTools是网页开发者不可或缺的调试工具,它提供了丰富的功能,帮助开发者快速诊断和解决问题。然而,除了常见的功能,如元素检查、网络监控和JavaScript调试之外,DevTools还有许多不为人知的强大功能和技巧。本文…

Paragon NTFS for Mac 15软件下载-详细安装教程视频

​Paragon NTFS for Mac是Mac平台上一款非常优秀的读写工具,可以在Mac OS X中完全读写、修改、访问NTFS硬盘、U盘等外接设备的文件。这款软件最大的亮点简书可以让我们读写 NTFS 分区,因为在Mac OS X 系统上,默认状态下我们只能读取NTFS 分区…

有趣的傅里叶变换与小波变换对比(Python)

不严谨的说,时域和频域分析就是在不同的空间看待问题的,不同空间所对应的原子(基函数)是不同的。你想一下时域空间的基函数是什么?频域空间的基函数是什么?一般的时-频联合域空间的基函数是什么?小波域空间的基函数是什…

Win11安装WSA 安卓系统,然后再电脑安装APK文件

参考文章: https://blog.csdn.net/m0_56076343/article/details/122334759 https://blog.csdn.net/u012514495/article/details/120885242 在微软的网站下载 打开:https://store.rg-adguard.net/ ,如下图: 在 1 的那个地方&am…

二维数组与指针【C语言】

二维数组与指针 一维数组一维数组与指针二维数组二维数组与指针总结补充判断以下方式是否正确打印二维数组一维数组 int arr[] = {11, 22, 33, 44};arr:首地址(第一个元素的地址) 一维数组与指针 int arr[] = {11, 22, 33, 44};因为,arr表示的是首地址,等价于 int* p =…

谷粒商城实战(033 业务-秒杀功能4-高并发问题解决方案sentinel 2)

Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强 总时长 104:45:00 共408P 此文章包含第332p-第p335的内容 熔断降级 开启对Feign远程服务的熔断保护机制 feign.sentinel.enabletrue 这里我们只是调用方加就行 被调用方不用加 正常…

PD19 Parallels Desktop 虚拟机 安装Windows10系统 操作步骤(保姆级教程,轻松上手)

Mac分享吧 文章目录 效果一、准备工作二、开始安装1、打开pd 19 虚拟机,点击右上角文件,新建2、通过下载好的镜像安装Windows10系统。找到镜像文件位置,安装,配置2、显示安装完成,打开Windows10系统 三、运行测试1、打…

SQLAlchemy:filter()和filter_by()的微妙差异

哈喽,大家好,我是木头左! 在Python编程中,SQLAlchemy是一个强大的ORM(对象关系映射)工具,它允许使用Python代码来操作数据库。然而,对于新手来说,SQLAlchemy中的一些函数…

cocos开发的时候 wx.onShow在vscode里面显示红色

这个函数是在微信小游戏平台才会用到。 cocos识别不到wx这个变量。 可以改成下面的写法。 只要在变量前面加一个globalThis.就能识别这个变量了。也不报错了。 搞死强迫症了。orz 欢迎大家来玩我的微信小游戏。多多提意见啊。

【Java】图的初识

文章目录 【Java】图的初识图是什么图的基本组成部分图的类型图的表示方法图的常见操作 Java中图的表示方法邻接矩阵邻接表 常见操作图的遍历深度优先搜索(DFS)广度优先搜索(BFS) 结论 【Java】图的初识 图是什么 图是一种数学概念&#xf…

[Linux] TCP协议介绍(1): TCP协议 数据格式、可靠性的控制、标记位... 简单介绍

上一篇文章, 针对UDP协议的格式、数据等内容做了一些简单的介绍. 并且提到, 在网络协议栈TCP/IP模型的传输层中, 有两个最具代表性的协议: UDP和TCP 下面就简单介绍分析一下TCP协议 TCP协议, 完整的称呼其实叫: 传输控制协议(Transmission Control Protocol) 从名字就可以看出…

Vue51-插件

一、插件的定义 vue里面的插件,类似于游戏的外挂。 vue中插件的本质:一个对象,里面必须包含install方法。 二、插件的使用 2-1、创建一个插件js文件(写在src中plugins.js) 2-2、应用插件:Vue.use(插件) …

基于Python+OpenCV高速公路行驶车辆的速度检测系统

简介: 基于Python和OpenCV的高速公路行驶车辆的速度检测系统旨在实时监测高速公路上的车辆,并测量它们的速度。该系统可以用于交通监控、道路安全管理等领域,为相关部门提供重要的数据支持。 系统实现: 视频流输入:系…

Python学习打卡:day07

day7 笔记来源于:黑马程序员python教程,8天python从入门到精通,学python看这套就够了 目录 day753、列表的常用操作课后练习题54、列表的循环遍历列表的遍历—— while 循环列表的遍历—— for 循环while 循环和 for 循环的对比练习 55、元组…

解决使用Jmeter进行测试时出现“302“,‘‘401“等用户未登录的问题

使用 JMeter 压力测试时解决登录问题的两种方法 在使用 JMeter 进行压力测试时,可能会遇程序存在安全验证,必须登录后才能对里面的具体方法进行测试: 如果遇到登录问题,通常是因为 JMeter 无法模拟用户的登录状态,导…

工程设计问题---行星轮系设计问题

该问题的主要目标是使汽车传动比的最大误差最小。为了使最大误差最小,对自动行星传动系统的齿轮齿数进行了计算。该问题包含6个整数变量和11个不同几何约束和装配约束的约束。 参考文献: Abhishek Kumar, Guohua Wu, Mostafa Z. Ali, Rammohan Malliped…

在 C++ 中使用不同平台的时间函数及比较

在 C 编程中,时间函数的选择对于性能测量、任务调度和时间戳记录至关重要。不同的操作系统提供了不同的时间函数,同时在同一个平台上,也可能有多种不同的时间函数可供选择。本文将介绍在 C 中常用的时间函数,并比较它们在不同平台…

【阿里云】2024年5月21日【算法岗暑期实习】面试经验分享

【阿里云】2024年5月21日【算法岗暑期实习】面试经验分享 面试流程:1个小时多。介绍WordEmbedding线性回归和逻辑回归的区别介绍 Information Gain(信息增益)IG做情感分析的时候存在多义词应该如何解决? 解题思路一:解…

【机器学习】机器学习重要分支——强化学习:从理论到实践

文章目录 强化学习:从理论到实践引言第一章 强化学习的基本概念1.1 什么是强化学习1.2 强化学习的基本组成部分1.3 马尔可夫决策过程 第二章 强化学习的核心算法2.1 Q学习2.2 深度Q网络(DQN)2.3 策略梯度方法 第三章 强化学习的应用实例3.1 游…

aarch64系统中给qt编译的可执行程序加上图标

在qt中编译的可执行程序图标是默认是一种格式 而且无法替换改图标,看起来不够美观,可以使用.desktop的链接文件来链接编译的执行程序,通过点击.desktop图标来去运行可执行程序。 实现步骤: 创建一个以.desktop结尾的文件并记得给…