【Redis】Redis介绍

目录

1.Redis是什么?

2. Redis特性

2.1 速度快

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

2.3 丰富的功能

2.4 简单稳定

2.5 客户端语言多

2.6 持久化

2.7 主从复制

2.8 高可用和分布式

3. Redis使用场景

3.1 缓存(Cache)

3.2 排行榜系统

3.3 计数器应用

3.4 社交网络

3.5 消息队列系统

4. Redis 不可以做什么


1.Redis是什么?

Redis 是一种基于键值对(key-value)的 NoSQL数据库,与很多键值对数据库不同的是,Redis
中的值可以是由 string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合).  Bitmaps(位图)、HyperLogL0g、GEO(地理信息定位) 等多种数据结构和算法组成,因此Redis可以满足很多的应用场景,而且因为 Redis 会将所有数据都存放再内存中,所以它的读写性能非常惊人。不仅如此,Redis还可以将内存的数据利用快照和日志的形式保存到硬盘上,这样在发生类似断电或者机器故障的时候,内存中的数据不会“丢失””。除了上述功能以外,Redis还提供了键过期、发布订阅、事务、流水线、Lua 脚本等附加功能。总之,如果在合适的场景使用号 Redis,它就会像一把瑞士军刀一样所向披靡。

Redis的来源

       2008年,Redis的作者 Salvatore Sanfilippo 在开发一个叫 LLOOGG 的网站时,需要实现一个高性能的队列功能,最开始是使用 MySQL来实现的,但后来发现无论怎么优化 SQL语句等都不能使网站的性能提高上去,再加上自己囊中羞涩,于是他决定自己做一个专属于 LLOOGG 的数据库,这个就是 Redis 的前身。后来,Salvatore Sanfilippo 将 Redis 1.0 的源码发布到 Github 上,可能连他自己都没想到,Redis后来如此受欢迎。

        假如现在有人问 Redis 的作者都有谁在使用 Redis,我想他可以开句玩笑的回答:还有谁不使用Redis,当然这只是开玩笑,但是从 Redis 的官方公司统计来看,有很多重量级的公司都在使用Redis,如国外的Twitter、Instagram、StackOverflow、Github等,国内就更多了,如果单单从体量来统计,新浪微博可以说是全球最大的 Redis 使用者,除了新浪微博,还有像阿里巴巴、腾讯、搜狐、优酷土豆、美团、小米、唯品会等公司都是 Redis 的使用者。除此之外,许多开源技术像 ELK等已经把 Redis 作为它们组件中的重要一环,而且 Redis 还提供了模块系统让第三方人员实现功能扩展,让 Redis 发挥出更大的威力。所以,可以这么说,熟练使用和运维 Redis 已经成为开发运维人员的一个必备技能。

2. Redis特性

Redis 之所以受到如此多公司的青睐,必然有之过人之处,下面是关于 Redis 的8个重要特性。

2.1 速度快

      正常情况下,Redis执行命令的速度非常快,官方给出的数字是读写性能可以达到 10 万/秒,当然这也取决于机器的性能,但这里先不讨论机器性能上的差异,只分析一下是什么造就了 Redis 如此之快,可以大概归纳为以下四点:

  1. Redis 的所有数据都是存放在内存中的,表 1-1是谷歌公司 2009 年给出的各层级硬件执行速度,所以把数据放在内存中是 Redis 速度快的最主要原因。
  2. Redis 是用C语言实现的,一般来说C语言实现的程序“距离”操作系统更近,执行速度相对会更快。
  3. Redis 使用了单线程,预防了多线程可能产生的竞争问题。
  4. Redis 在 6.0版本引入了多线程机制,但主要也是在处理网络和 10,不涉及到数据命令,即命令
  5. 的执行仍然采用了单线程模式。
  6. 作者对于 Redis 源代码可以说是精打细磨,曾经有人评价 Redis 是少有的集性能和优雅于一身的开源代码。

表 1-1 谷歌公司给出的各层级硬件执行速度

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

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

2.3 丰富的功能

除了5种数据结构,Redis还提供了许多额外的功能:

  • 提供了键过期功能,可以用来实现缓存。
  • 提供了发布订阅功能,可以用来实现消息系统。
  • 支持 Lua 脚本功能,可以利用 Lua 创造出新的 Redis 命令。
  • 提供了简单的事务功能,能在一定程度上保证事务特性。
  • 提供了流水线(Pipeline)功能,这样客户端能将一批命令一次性传到 Redis,减少了网络的开销。

2.4 简单稳定

        Redis 的简单主要表现在三个方面。首先,Redis 的源码很少,早期版本的代码只有2万行左右,3.0 版本以后由于添加了集群特性,代码增至5万行左右,相对于很多 NOSOL数据库来说代码量相对要少很多,也就意味着普通的开发和运维人员完全可以“吃透”它。其次,Redis 使用单线程模型,这样不仅使得 Redis 服务端处理模型变得简单,而且也使得客户端开发变得简单。最后,Redis 不需要依赖于操作系统中的类库(例如 Memcache 需要依赖 libevent 这样的系统类库),Redis 自己实现了事件处理的相关功能。

       但与简单相对的是 Redis 具备相当的稳定性,在大量使用过程中,很少出现因为 Redis 自身 BUG而导致宕掉的情况。

2.5 客户端语言多

         Redis 提供了简单的 TCP 通信协议,很多编程语言可以很方便地接入到 Redis,并且由于 Redis 受到社区和各大公司的广泛认可,所以支持 Redis 的客户端语言也非常多,几乎涵盖了主流的编程语言,例如C、C++、Java、PHP、Python、NodeJs等,后续我们会对 Redis 的客户端使用做详细说明。

2.6 持久化

通常看,将数据放在内存中是不安全的,一旦发生断电或者机器故障,重要的数据可能就会丢
失,因此 Redis 提供了两种持久化方式:RDB和 AOF,即可以用两种策略将内存的数据保存到硬盘中(如图 1-1所示),这样就保证了数据的可持久性,后续我们将对 Redis 的持久化进行详细说明。

图 1-1 Redis 内存到硬盘的持久化

2.7 主从复制

Redis 提供了复制功能,实现了多个相同数据的 Redis副本(Replica) (如图 1-2 所示),复制
功能是分布式 Redis 的基础。后续我们会对 Redis 的复制功能进行详细演示。

图 1-2 Redis 主从复制架构

2.8 高可用和分布式

Redis 提供了高可用实现的 Redis 哨兵(Redis Sentinel),能够保证 Redis 结点的故障发现和故
障自动转移。也提供了 Redis集群(Redis Cluster),是真正的分布式实现,提供了高可用、读写和
容量的扩展性。

3. Redis使用场景

上节我们已经了解了 Redis 的若干个特性,本节来看一下 Redis 的典型应用场景有哪些?

3.1 缓存(Cache)

      缓存机制几乎在所有大型网站都有使用,合理地使用缓存不仅可以加速数据的访问速度,而且能够有效地降低后端数据源的压力。Redis 提供了键值过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略。可以这么说,一个合理的缓存设计能够为一个网站的稳定保驾护航。

3.2 排行榜系统

        排行榜系统几乎存在于所有的网站,例如按照热度排名的排行榜,按照发布时间的排行榜,按照各种复杂维度计算出的排行榜,Redis提供了列表和有序集合的结构,合理地使用这些数据结构可以很方便地构建各种排行榜系统。

3.3 计数器应用

         计数器在网站中的作用至关重要,例如视频网站有播放数、电商网站有浏览数,为了保证数据的实时性,每一次播放和浏览都要做加1的操作,如果并发量很大对于传统关系型数据的性能是一种挑战。Redis 天然支持计数功能而且计数的性能也非常好,可以说是计数器系统的重要选择。

3.4 社交网络

       赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等是社交网站的必备功能,由于社交网站访问量通常比较大,而且传统的关系型数据不太合适保存这种类型的数据,Redis 提供的数据结构可以相对比较容易地实现这些功能。

3.5 消息队列系统

       消息队列系统可以说是一个大型网站的必备基础组件,因为其具有业务解耦、非实时业务削峰等特性。Redis提供了发布订阅功能和阻塞队列的功能,虽然和专业的消息队列比还不够足够强大,但是对于一般的消息队列功能基本可以满足。

4. Redis 不可以做什么

实际上和任何一门技术一样,每个技术都有自己的应用场景和边界,也就是说 Redis 并不是万金
油,有很多合适它解决的问题,但是也有很多不合适它解决的问题。我们可以站在数据规模和数据冷热的角度来进行分析。

站在数据规模的角度看,数据可以分为大规模数据和小规模数据,我们知道Redis 的数据是存放
在内存中的,虽然现在内存已经足够便宜,但是如果数据量非常大,例如每天有几亿的用户行为数
据,使用 Redis 来存储的话,基本上是个无底洞,经济成本相当高。

站在数据冷热的角度,数据分为热数据和冷数据,热数据通常是指需要频繁操作的数据,反之为
冷数据,例如对于视频网站来说,视频基本信息基本上在各个业务线都是经常要操作的数据,而用户的观看记录不一定是经常需要访问的数据,这里暂且不讨论两者数据规模的差异,单纯站在数据冷热的角度上看,视频信息属干热数据,用户观看记录属干冷数据。如果将这些冷数据放在 Redis上,基本上是对于内存的一种浪费,但是对于一些热数据可以放在 Redis 中加速读写,也可以减轻后端存储的负载,可以说是事半功倍。

所以,Redis 并不是万金油,相信随着我们对 Redis 的逐步学习,能够清楚 Redis 真正的使用场
景。

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

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

相关文章

【HarmonyOS学习日志(10)】一次开发,多端部署之功能级一多开发,工程级一多开发

功能级一多开发 SysCap机制介绍 HarmonyOS使用SysCap机制(即SystemCapability),可以帮助开发者仅关注设备的系统能力,而不用考虑成百上千种具体的设备类型。 在过去,开发不同设备上的应用就用不同设备的SDK进行开发&…

vue3 与 spring-boot 完成跨域访问

spring-boot,写一个接口用于前端访问,并且给接口设置跨域访问,这里我前端的域名为 localhost:5173 RestController CrossOrigin(origins "http://localhost:5173") public class Vue3Controller {GetMapping("/vue")pu…

机器学习-神经网络(BP神经网络前向和反向传播推导)

1.1 神经元模型 神经网络(neural networks)方面的研究很早就已出现,今天“神经网络”已是一个相当大的、多学科交叉的学科领域.各相关学科对神经网络的定义多种多样,本书采用目前使用得最广泛的一种,即“神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够…

如何通过智能生成PPT,让演示文稿更高效、更精彩?

在快节奏的工作和生活中,我们总是追求更高效、更精准的解决方案。而在准备演示文稿时,PPT的制作往往成为许多人头疼的问题。如何让这项工作变得轻松且富有创意?答案或许就在于“AI生成PPT”这一智能工具的广泛应用。我们就来聊聊如何通过这些…

丹摩|丹摩智算平台使用教学指南

本指南旨在为新用户提供一个详细的操作步骤和实用的入门指导,帮助大家快速上手丹摩智算平台。 一、平台简介 丹摩智算平台是一款强大的数据分析和计算平台,支持多种编程语言,提供丰富的数据处理和机器学习工具。无论您是数据分析师、开发者…

Python学习第十天--处理CSV文件和JSON数据

CSV:简化的电子表格,被保存为纯文本文件 JSON:是一种数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,以JavaScript源代码的形式将信息保存在纯文本文件中 一、csv模块 CSV文件中的每行代表电…

mini-spring源码分析

IOC模块 关键解释 beanFactory:beanFactory是一个hashMap, key为beanName, Value为 beanDefination beanDefination: BeanDefinitionRegistry,BeanDefinition注册表接口,定义注册BeanDefinition的方法 beanReference:增加Bean…

2024年9月中国电子学会青少年软件编程(Python)等级考试试卷(六级)答案 + 解析

一、单选题 1、下面代码运行后出现的图像是?( ) import matplotlib.pyplot as plt import numpy as np x np.array([A, B, C, D]) y np.array([30, 25, 15, 35]) plt.bar(x, y) plt.show() A. B. C. D. 正确答案:A 答案…

UniApp开发实战:常见报错解析与解决方案

UniApp开发实战:常见报错解析与解决方案 病例1、TypeError: undefined is not an object (evaluating ‘this. s c o p e . scope. scope.getAppWebview’) 需求:获取页面示例,动态修改头部搜索框内容,获取页面实例时候报错unde…

BGP对等体建立方法--实验

目录 实验拓扑图 实验要求: 第一步、IP地址规划 第二步、配置接口IP地址 第三步、AS 200使用IGP OSPF实现网络互通 第四步、建立BGP对等体关系 1、R1与R2使用直连链路建立EBGP关系。 2、R2与R4使环回建立非直连IBGP关系。 3、R4与R5使用环回建立EBGP关系。…

(已解决)wps无法加载此加载项程序mathpage.wll

今天,在安装Mathtype的时候遇到了点问题,如图所示 尝试了网上的方法,将C:\Users\Liai_\AppData\Roaming\Microsoft\Word\STARTUP路径中的替换为32位的Mathtype加载项。但此时,word又出现了问题 后来知道了,这是因为64位…

Vue+Element Plus实现自定义表单弹窗

目录 一、基本框架 1.父组件index.vue 2.子组件FormPop.vue 二、细节补充 1)input、textarea、select、input number 2)daterange、date、monthrange 3)数据定义 4)没改样式的效果 5)最终效果 三、最终代码 …

【插入排序】:直接插入排序、二分插入排序、shell排序

【插入排序】:直接插入排序、二分插入排序、shell排序 1. 直接插入排序1.1 详细过程1.2 代码实现 2. 二分插入排序2.1 详细过程2.2 代码实现 3. shell排序3.1 详细过程3.2 代码实现 1. 直接插入排序 1.1 详细过程 1.2 代码实现 public static void swap(int[]arr,…

PHP 生成分享海报

因为用户端有多个平台,如果做分享海报生成,需要三端都来做,工作量比较大。 所以这个艰巨的任务就光荣的交给后端了。经过一定时间的研究和调试,最终圆满完成了任务,生成分享海报图片实现笔记如下。 目录 准备字体文件…

MySQL底层概述—5.InnoDB参数优化

大纲 1.内存相关参数优化 (1)缓冲池内存大小配置 (2)配置多个Buffer Pool实例 (3)Chunk(块)大小配置 (4)InnoDB缓存性能评估 (5)Page管理相关参数 (6)Change Buffer相关参数优化 2.日志相关参数优化 (1)日志缓冲区相关参数配置 (2)日志文件参数优化 3.IO线程相关参数…

05_JavaScript注释与常见输出方式

JavaScript注释与常见输出方式 JavaScript注释 源码中注释是不被引擎所解释的,它的作用是对代码进行解释。lavascript 提供两种注释的写法:一种是单行注释,用//起头:另一种是多行注释,放在/*和*/之间。 //这是单行注释/* 这是 多行 注释 *…

HTML CSS JS基础考试题与答案

一、选择题&#xff08;2分/题&#xff09; 1&#xff0e;下面标签中&#xff0c;用来显示段落的标签是&#xff08; d &#xff09;。 A、<h1> B、<br /> C、<img /> D、<p> 2. 网页中的图片文件位于html文件的下一级文件夹img中&#xff0c;…

【工具】JS解析XML并且转为json对象

【工具】JS解析XML并且转为json对象 <?xml version1.0 encodingGB2312?> <root><head><transcode>hhhhhhh</transcode></head><body><param>ccccccc</param><param>aaaaaaa</param><param>qqqq<…

如何为 ext2/ext3/ext4 文件系统的 /dev/centos/root 增加 800G 空间

如何为 ext2/ext3/ext4 文件系统的 /dev/centos/root 增加 800G 空间 一、引言二、检查当前磁盘和分区状态1. 使用 `df` 命令检查磁盘使用情况2. 使用 `lsblk` 命令查看分区结构3. 使用 `fdisk` 或 `parted` 命令查看详细的分区信息三、扩展逻辑卷(如果使用 LVM)1. 检查 LVM …

Z2400023基于Java+Servlet+jsp+mysql的酒店管理系统的设计与实现 源码 调试 文档

酒店管理系统的设计与实现 1.摘要2.主要功能3. 项目技术栈运行环境 4.系统界面截图5.源码获取 1.摘要 本文介绍了一个基于Java的酒店管理系统&#xff0c;该系统采用Servlet、JSP、JDBC以及c3p0等技术构建&#xff0c;为酒店提供了一个全面的管理平台。该系统不仅适合酒店进行…