一文了解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服务

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

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

相关文章

【算法专题--链表】删除排序链表中的重复元素II -- 高频面试题(图文详解,小白一看就懂!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐ 双指针 -- 采用 哨兵位头节点 🥝 什么是哨兵位头节点? 🍍 解题思路 🍍 案例图解 四、总结与提炼 五、共勉 一、前言 删除排序链表中的重复元素II元素这道题&#xff0c…

【JKI SMO】框架讲解(二)

JKI State Machine 讲解 将JKI State Machine 模板拖曳到程序框图中, 如下图, 此模板会默认放置一个OK按钮在前面板中,用于提示用户如何增加一个简单的用户事件去使用此框架。 “Event Structure”,Idle:此分支可以设…

【JS重点17】原型链(面试重点)

一:原型链底层原理 以下面一段代码为例,基于原型对象(Star构造函数的原型对象)的继承使得不同构造函数的原型对象关联在一起(此处是最大的构造函数Object原型对象),并且这种关联的关系是一种链…

C#联合Halcon机器视觉框架源码—升级版

相较于之前的NxtVision,本软件代码架构更加合理,且新增ui设计器、原来的vb脚本改为C#脚本,并尝试将视觉与运动控制相结合,是一体化的框架。 对源码有需求的,订阅本专栏后,私信我领取。

活动集锦 | 英码科技积极参与行业盛会,AI赋能城市数字化转型

在当今数字经济时代,城市全域数字化转型已经成为提升城市管理效能、优化资源配置、推动经济发展的重要手段。英码科技始终致力于为企业打造高效、低成本的行业应用方案,助力企业实现数字化转型。近日,英码科技受邀参加了多场行业展示活动&…

操作系统复习-线程同步

互斥量 两个线程的指令交叉执行互斥量可以保证先后执行称为原子性 原子性是指一系列操作不可被中断的特性这一系列操作要么全部执行完成,要么全部没有执行不存在部分执行部分未执行的情况 互斥锁 互斥量是最简单的线程同步的方法互斥锁,处于两态之一的…

01 飞行器设计 —— 一门独立的学科

01 飞行器设计 —— 一门独立的学科 01 引言02 飞机设计概述2-1 什么是飞机设计?2-1 飞机设计是从哪里开始的?2-2 如何成为一名飞机设计师?2-4 本书的组织 参考文献 说明:关于Raymer的《Aircraft Design》的读书笔记; …

解读ROS功能包模块的步骤

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言解读ROS功能包模块的步骤前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 推荐开发经验及方法博客专栏: [https:/…

哇塞,超好吃的麻辣片,一口就爱上

最近,我发现了一款让人欲罢不能的美食——食家巷麻辣片!😍 一打开包装,那浓郁的麻辣香气就扑鼻而来,瞬间刺激着我的嗅觉神经。😃食家巷麻辣片的外观色泽鲜艳,红通通的一片,看着就特…

Android断点续传原理及实现

常见两种网络请求方式 一、 HttpURLConnection HttpURLConnection的setRequestProperty()方法,对我们要读取的字节部分进行控制,比如: 1.Range0-100代表只读取前100个字节。 2.Range100-500代表读取从第100个字节开始,读到第500个字节为止。…

常见的宽基指数基金

指数基金投资指南 ❝ 这篇博客里面的内容主要来自于银行螺丝钉的《定投十年,财务自由》和《指数基金投资指南》这两本书中章“常见的宽基指数”,最近第三次读这本书,打算做一点笔记加深自己的印象。 博客中很多内容是从书中摘抄的&#xff0c…

【git使用三】git工作机制与命令用法

目录 git工作机制和相关概念 四个重要区域 分支的概念 上传代码到远程分支的基本流程 克隆代码 仓库同步 开发者如何提交代码到远程仓库分支 1.初始化本地仓库 2.关联本地仓库和远程仓库 创建关联 查看关联情况 如何解除关联 3.推送代码到远程仓库 3.1先下拉远程…

PyTorch计算机视觉入门:测试模型与评估,对单帧图片进行推理

在完成模型的训练之后,对模型进行测试与评估是至关重要的一步,它能帮助我们理解模型在未知数据上的泛化能力。本篇指南将带您了解如何使用PyTorch进行模型测试,并对测试结果进行分析。我们将基于之前训练好的模型,演示如何加载数据…

解决老毛子路由器自带微信提示功能无法触发问题

新买了一个二手的RM AC2100,刷了老毛子后,发现自带的上下线微信提示无法使用(方糖公众号无信息) 经我开启SSH,将上下线部分代码拿出来调试发现,发不出来的原因是原版信息发送长度过长,需要截取一部分才能发送成功。 …

【Android面试八股文】说一说JVM、DVM(Dalvik VM)和ART的区别

文章目录 1. JVM(Java Virtual Machine):2. DVM(Dalvik Virtual Machine):与JVM区别基于的架构不同执行的字节码不同3. ART(Android Runtime):与DVM的区别4. 什么是JIT?4.1 什么是JIT4.2 JIT 编译的优势包括:4.3 对于 DVM 和 ART,它们在 JIT(Just-In-Time)编译方…

【学习笔记】centos7安装mysql相关事项

究极恶心的体验 依赖要按照顺序安装,有些依赖安装位置也不同 非常细节 mysql安装包:mysql官网下载地址 centos7选择Red Hat Enterprise Linux 7 / Oracle Linux 7 (x86, 64-bit), RPM Bundle 下载版本自选 安装视频教程:centos7.5安装mysql …

消息队列-RabbitMQ-延时队列实现

死信队列 DLX,全称为Dead-Letter-Exchange,死信交换机,死信邮箱。当消息在一个队列中变成死信之后,它能重新发送到另外一个交换器中,这个交换器就是DLX,绑定DLX的队列就称为死信队列。 导致死信的几种原因: ● 消息…

Spring配置那些事

一、引言 配置是一个项目中不那么起眼,但却有非常重要的东西。在工程项目中,我们一般会将可修改、易变、不确定的值作为配置项,在配置文件/配置中心中设置。 比方说,不同环境有不同的数据库地址、不同的线程池大小等&#xff0c…

【计算机毕业设计】241外卖微信小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

jadx+android studio+雷电模拟器 动态调试apk

# 环境准备 1.雷电模拟器,开启root 2.jadx: https://sourceforge.net/projects/jadx.mirror/files/v1.5.0/jadx-gui-1.5.0-with-jre-win.zip/download 3.java jdk 11 https://www.oracle.com/cn/java/technologies/javase/jdk11-archive-downloads.…