【redis】初识非关系型数据库——redis

W...Y的主页 😊

代码仓库分享💕 

 

初识 Redis 

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

 redis特性

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

1. 速度快
正常情况下,Redis执⾏命令的速度⾮常快,官⽅给出的数字是读写性能可以达到10万/秒,当然这也取决于机器的性能,但这⾥先不讨论机器性能上的差异,只分析⼀下是什么造就了Redis如此
之快,可以⼤概归纳为以下四点:
• Redis的所有数据都是存放在内存中的,表1-1是⾕歌公司?2009?年给出的各层级硬件执⾏速度,所以把数据放在内存中是Redis速度快的最主要原因。
• Redis是⽤C语⾔实现的,⼀般来说C语⾔实现的程序“距离”操作系统更近,执⾏速度相对会
更快。
• Redis使⽤了单线程,预防了多线程可能产⽣的竞争问题。Redis在6.0版本引⼊了多线程机制,但主要也是在处理⽹络和?IO,不涉及到数据命令,即命令的执⾏仍然采⽤了单线程模式。
• 作者对于Redis源代码可以说是精打细磨,曾经有⼈评价Redis是少有的集性能和优雅于⼀⾝的开源代码。 

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

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

4. 简单稳定
Redis的简单主要表现在三个⽅⾯。⾸先,Redis的源码很少,早期版本的代码只有2万⾏左右,
3.0版本以后由于添加了集群特性,代码增⾄5万⾏左右,相对于很多NoSQL数据库来说代码量相对要少很多,也就意味着普通的开发和运维⼈员完全可以“吃透”它。其次,Redis使⽤单线程模型,这样不仅使得Redis服务端处理模型变得简单,⽽且也使得客⼾端开发变得简单。
最后,Redis不需要依赖于操作系统中的类库(例如Memcache需要依赖libevent这样的系统类库),Redis⾃⼰实现了事件处理的相关功能。
但与简单相对的是Redis具备相当的稳定性,在⼤量使⽤过程中,很少出现因为Redis⾃⾝BUG?
⽽导致宕掉的情况 。

5. 客⼾端语⾔多
Redis提供了简单的TCP通信协议,很多编程语⾔可以很⽅便地接⼊到Redis,并且由于Redis受
到社区和各⼤公司的⼴泛认可,所以⽀持Redis的客⼾端语⾔也⾮常多,⼏乎涵盖了主流的编程语⾔,例如C、C++、Java、PHP、Python、NodeJS等,后续我们会对Redis的客⼾端使⽤做详细说明。

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

 7. 主从复制(Replication)
Redis提供了复制功能,实现了多个相同数据的Redis副本(Replica)(如图所⽰),复制
功能是分布式Redis的基础。后续我们会对Redis的复制功能进⾏详细演⽰。

 8. ⾼可⽤(High Availability)和分布式(Distributed)
Redis提供了⾼可⽤实现的Redis哨兵(Redis Sentinel),能够保证Redis结点的故障发现和故
障⾃动转移。也提供了Redis集群(RedisCluster),是真正的分布式实现,提供了⾼可⽤、读写和容量的扩展性。

Redis使用场景 

要充分理解Redis的作⽤,需要读者对⽹站的架构有⼀定的基础理解,考虑到部分读者缺少这⽅
⾯的背景知识,建议先学习为⼤家准备的《服务端⾼并发分布式结构演进之路》篇对该领域的基础知识。

1. 缓存(Cache)
缓存机制⼏乎在所有⼤型⽹站都有使⽤,合理地使⽤缓存不仅可以加速数据的访问速度,⽽且能
够有效地降低后端数据源的压⼒。Redis提供了键值过期时间设置,并且也提供了灵活控制最⼤内存和内存溢出后的淘汰策略。⼀个合理的缓存设计能够为⼀个⽹站的稳定保驾护航。 

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

3. 计数器应⽤
计数器在⽹站中的作⽤⾄关重要,例如视频⽹站有播放数、电商⽹站有浏览数,为了保证数据的
实时性,每⼀次播放和浏览都要做加1的操作,如果并发量很⼤对于传统关系型数据的性能是⼀种挑战。Redis天然⽀持计数功能⽽且计数的性能也⾮常好,可以说是计数器系统的重要选择。

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

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

Redis不可以做什么
实际上和任何⼀⻔技术⼀样,每个技术都有⾃⼰的应⽤场景和边界,也就是说Redis并不是万⾦
油,有很多合适它解决的问题,但是也有很多不合适它解决的问题。我们可以站在数据规模和数据冷热的⻆度来进⾏分析。
站在数据规模的⻆度看,数据可以分为⼤规模数据和⼩规模数据,我们知道Redis的数据是存放
在内存中的,虽然现在内存已经⾜够便宜,但是如果数据量⾮常⼤,例如每天有⼏亿的⽤⼾⾏为数
据,使⽤Redis来存储的话,基本上是个⽆底洞,经济成本相当⾼。
站在数据冷热的⻆度,数据分为热数据和冷数据,热数据通常是指需要频繁操作的数据,反之为
冷数据,例如对于视频⽹站来说,视频基本信息基本上在各个业务线都是经常要操作的数据,⽽⽤⼾的观看记录不⼀定是经常需要访问的数据,这⾥暂且不讨论两者数据规模的差异,单纯站在数据冷热的⻆度上看,视频信息属于热数据,⽤⼾观看记录属于冷数据。如果将这些冷数据放在Redis上,基本上是对于内存的⼀种浪费,但是对于⼀些热数据可以放在Redis中加速读写,也可以减轻后端存储的负载,可以说是事半功倍。 

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

 

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

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

相关文章

基于协同过滤算法的个性化课程推荐系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

AndroidStudio部署多渠道打包环境(一)

对于游戏来说,需要上架国内很多家应用商店,还有一些小的渠道SDK,大大小小加起来也有几十家了,那么我们部署了多渠道打包环境之后就很方便了。 一 、配置游戏基本参数:在app下面的build.gradle文件里编辑, …

Java全栈经典面试题剖析4】JavaSE高级 -- 包装类,String, 类方法

目录 面试题3.1 什么是自动装箱与拆箱?用什么方式来装箱与拆箱? 面试题3.2 int和Integer有什么区别? 面试题3.3 Integer常量池 面试题3.4 字符串常量池 面试题3.5 这句代码创建了几个对象? String str1 new String("xyz");…

【AI大模型】深入解析 存储和展示地理数据(.kmz)文件格式:结构、应用与项目实战

文章目录 1. 引言2. 什么是 .kmz 文件?2.1 .kmz 文件的定义与用途2.2 .kmz 与 .kml 的关系2.3 常见的 .kmz 文件使用场景 3. .kmz 文件的内部结构3.1 .kmz 文件的压缩格式3.2 解压缩 .kmz 文件的方法3.3 .kmz 文件的典型内容3.4 .kml 文件的结构与主要元素介绍 4. 深…

python对文件的读写操作

任务:读取文件夹下的批量txt数据,并将其写入到对应的word文档中。 txt文件中包含:编号、报告内容和表格数据。写入到word当中:编号、报告内容、表格数据、人格雷达图以及对应的详细说明(详细说明是根据表格中的标识那一列中的加号…

安徽对口高考Python试题选:输入一个正整数,然后输出该整数的3的幂数相加形式。

第一步&#xff1a;求出3的最高次幂是多少 guoint(input("请输入一个正整数:")) iguo a0 while i>0: if 3**i<guo: ai break ii-1print(a)#此语句为了看懂题目&#xff0c;题目中不需要打印出最高幂数 第二步…

开源模型应用落地-Qwen2-VL-7B-Instruct-vLLM-OpenAI API Client调用

一、前言 学习Qwen2-VL &#xff0c;为我们打开了一扇通往先进人工智能技术的大门。让我们能够深入了解当今最前沿的视觉语言模型的工作原理和强大能力。这不仅拓宽了我们的知识视野&#xff0c;更让我们站在科技发展的潮头&#xff0c;紧跟时代的步伐。 Qwen2-VL 具有卓越的图…

ELK日志收集

目前&#xff0c;各个微服务系统的日志都保存在各自指定的目录中&#xff0c;如果这些微服务部署在不同的服务器上&#xff0c;那么日志文件也是分散在各自的服务器上。分散的日志不利于我们快速通过日志定位问题&#xff0c;我们可以借助ELK来收集各个微服务系统的日志并集中展…

智能台灯设计(一)原理图设计

1. 前言 作者最近突发奇想&#xff0c;想自己做一个小台灯&#xff0c;设想的功能有&#xff1a;带锂电池可充电、可以调节亮度&#xff0c;后续通过增加WIFI模块实现手机控制开关功能。目前先实现最简单的功能&#xff0c;有时间再一步步完善吧。 2. 原理图设计 充电芯片使用…

B端产品常用组件及设计规则 原型图 Axure原型图 交互设计

B端产品常用组件及设计规则 本作品总结整理了B端产品原型设计时常用的组件、设计指南、常用模板等。为原型设计人员提供实用的组件和指南&#xff0c;帮助他们快速灵活地构建出更加美观、高质量的产品原型&#xff0c;更加高效地完成原型设计工作。 原型演示地址&#xff1a;…

【笔记】软件测试09——接口测试

九、接口测试 一)接口测试的概念 1)接口测试 通过数据包的方式观察客户端向服务器发送了什么请求,模拟这些请求的过程 接口测试是测试系统组件间数据交互的一种方式。 接口测试是通过测试不同情况下的输入参数和与之对应的输出结果来判断接口是否符合或满足相应 的功能性、…

鸿蒙原生应用开发及部署:首选华为云,开启HarmonyOS NEXT App新纪元

目录 前言 HarmonyOS NEXT&#xff1a;下一代操作系统的愿景 1、核心特性和优势 2、如何推动应用生态的发展 3、对开发者和用户的影响 华为云服务在鸿蒙原生应用开发中的作用 1、华为云ECS C系列实例 &#xff08;1&#xff09;全维度性能升级 &#xff08;2&#xff…

人工智能进程;算子加速的具体计算部分;大模型GPT5:参数18万亿;大模型面临问题

目录 人工智能进程 算子加速的简单理解,举例说明 一、简单理解 二、举例说明 一、算子加速的具体计算部分 二、举例说明 三、算子加速是否仅针对GPU 大模型GPT5:参数18万亿 大模型面临问题 算力集群设计框架 人工智能进程

论文阅读(二十六):Dual Attention Network for Scene Segmentation

文章目录 1.Introduction3.DANet3.1Position Attention Module3.2Channel Attention Module 论文&#xff1a;Dual Attention Network for Scene Segmentation   论文链接&#xff1a;Dual Attention Network for Scene Segmentation   代码链接&#xff1a;Github 1.Intr…

C++——string的模拟实现(下)

目录 成员函数 3.4 修改操作 (3)insert()函数 (4)pop_back()函数 (5)erase()函数 (6)swap()函数 3.5 查找操作 (1)find()函数 (2)substr()函数 3.6 重载函数 (1)operator赋值函数 (2)其他比较函数 (3)流插入和流提取 完整代码 结束语 第一篇链接&#xff1a;C——…

vue通过JSON文件生成KML文件源码

可以使用封装的json解析器进行JSON数据获取&#xff0c;读取点的经度、维度、高程等数据&#xff0c;再使用对应的KML文件生成函数使用该源码下载KML文件&#xff08;固定KML生成&#xff1a;js模板式生成大疆上云kml文件&#xff08;含详细注释&#xff0c;已封装成函数&#…

unity中GameObject介绍

在 Unity 中&#xff0c;Cube和Sphere等基本几何体是 Unity 引擎的内置预制体&#xff08;Prefabs&#xff09;&#xff0c;它们属于 Unity 中的GameObject 系统&#xff0c;可以在 Unity 的 Hierarchy 视图或 Scene 视图中右键点击&#xff0c;然后在弹出的菜单中选择 3D Obje…

MySQL 数据出海之数据同步方案

优质博文&#xff1a;IT-BLOG-CN 数据库出海流程 【1】业务出海&#xff1a;1&#xff09;数据库出海&#xff1b;2&#xff09;应用出海&#xff1b;3&#xff09;流量分发&#xff1b; 【2】数据库出海&#xff1a;涉及业务方、信安、DBA和框架组。 数据库出海&#xff0c…

Go 语言基础教程:7.Switch 语句

在这篇教程中&#xff0c;我们将学习 Go 语言中的 switch 语句&#xff0c;它是条件分支的重要结构。我们将通过一个示例程序逐步解析 switch 的不同用法。 package mainimport ("fmt""time" )func main() {i : 2fmt.Print("Write ", i, " …

Python画笔案例-094 绘制 神奇彩条动画

1、绘制 神奇彩条动画 通过 python 的turtle 库绘制 神奇彩条动画,如下图: 2、实现代码 绘制 神奇彩条动画,以下为实现代码: """神奇彩条动画.py一个用海龟画图的图章功能配合颜色渐变和动画原理做成的动画。 """ from random import randi…