Redis: 特点,优势,与其他产品的区别以及高并发原理

入门Redis概述


1 )选择Redis是因为其高性能

  • 因为 Redis 它数据存储的机制是存在内存中的,减少了传统关系数据库的磁盘IO
  • 它是单线程的保证了原子性,它还提供了事务,锁等相关的机制

2 )Redis 环境安装配置

  • linux 或 docker 环境

3 )Redis 的并发下的模式演进

  • 并发在十万以下的时候,Redis提供了单机单节点模式
  • 官方测试的数据: 读取每秒11万次,写入每秒8万1, 所以性能是非常高的
  • 当并发上来了,10万 到 20万左右的时候,使用 Redis 提供到读写分离, 主从模式
  • 在这种模式下,主节点肯定要保持高可用的,Redis 提供了哨兵监控机制
  • 为了降低各节点之间存储数据的压力,Redis 提供了集群模式

4 )了解微服项目的构建以及springboot应用的开发

  • 我们围绕着项目来打通Redis任督二脉的,以项目作为驱动
  • 在项目中实现 Redis 各种应用场景:实现缓存,保证缓存中的数据一致性等等

5 )理论准备

  • 理论作为基石,需要了解缓存相关中间件,(Redis, Memcache 和 Ehcache) 的比较
  • 对 Redis 的基本理解,Redis 它的定位是什么?解决了什么问题?
  • 微服务相关的概念,最终是以微服务项目作为驱动开发的

5 )实际操作

  • 在linux环境中安装 Redis,包括了解它的一些配置信息,每一个配置项都代表什么意思
    • 以及把 Redis 作为开机自启项加入到系统服务当中,它的启动, 停止该如何去操作
  • Redis 的基本命令
  • 数据库表结构的设计
    • Redis 作为一款 nosql 数据库, 肯定不能百分百替代关系数据库的
    • 在一般项目中都是 Redis 和 mysql 组合,而 Redis 都是作为缓存层而存在
    • 它最终缓存的是关系数据库中的数据
  • SpringBoot & SpringCloud项目搭建
    • 通过一个微服务的项目,也可以使用 go-micro 或 其他
    • 这里了解 SpringBoot & SpringCloud 类似的微服务项目环境如何搭建

Redis 如何支撑 10w+ QPS


1 ) Redis 特点

  • 内存数据库,速度快,也支持数据的持久化。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供Lists、Hashes、Sets、Sorted Sets 等多种数据结构的存储
  • Redis支持数据的备份(master-slave)与集群(分片存储),以及拥有哨兵监控机制
  • 支持事务

2 ) 优势

  • 性能极高-Redis能读的速度是110000次/s,写的速度是81000次/s
  • 丰富的数据类型-Redis支持 Strings、Lists、Hashes、Sets、Sorted Sets 等数据类型操作
  • 原子操作-Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行(事务)
  • 丰富的特性-Redis还支持 publish/subscribe,通知,key 过期等特性

3 ) Redis、Memcached、Ehcache 的区别

EhcacheMemcachedRedis
最新版本2017年2月
3.3.0
2018年7月
1.5.9
2018年7月
5.0 Beta
许可证开源免费开源免费开源免费
实现语言JavaCC
服务器系统JavaFreeBSD、Linux、OSX、Unix、WindowsFreeBSD、Linux、OSX、Unix、Windows
数据类型支持不支持支持多种:string、hash、list、set、sorted set等
客户端语言Java.Net、C、C++、ColdFusion、Erlang、Java、Lisp、Lua、Ocaml、Perl、PHP、Python、RubyC、C#、C++、D、Erlang、Go、Haxe、Java、Node.js、Lisp、Lua、MatLab、Objective-C、Pascal、Perl、PHP、R、Ruby、Scala、Swift、Visual Basic 等 30十多种
  • 在分布式的情况下, 用 Ehcache,就不能很好的去实现分布式项目之间缓存的同步共享的问题
  • Memcached 对于数据类型比较单一,存在一些瓶颈
  • 最终通过比较,还是选择 Redis
  • 这三个中间件都可以应用于缓存,但目前市面上使用Redis的场景会更多,更广泛,其原因是:Redis性能高、原子操作、支持多种数据类型,主从复制与哨兵监控,持久化操作等

4 ) Redis的高并发

  • 官方的bench-mark数据:测试完成了50个并发执行100000个请求, 设置和获取的值是一个256字节字符串
  • 结果:读的速度是110000次/s,写的速度是81000次/s。redis尽量少写多读,符合缓存的适用要求
  • 单机redis支撑万级,如果10万+可以采用主从复制的模式

4.1.原理

  • Redis是纯内存数据库,所以读取速度快。
  • Redis使用的是非阻塞10,10多路复用,减少了线程切换时上下文的切换和竞争。
  • Redis采用了单线程的模型,保证了每个操作的原子性,也减少了线程的上下文切换和竞争。
  • Redis存储结构多样化,不同的数据结构对数据存储进行了优化加快读取的速度。
  • Redis采用自己实现的事件分离器,效率比较高,内部采用非阻塞的执行方式,吞吐能力比较大。

4.2. Redis的单线程

选择单线程原因

  • 不需要各种锁的性能消耗
  • 单线程多进程集群方案
  • CPU消耗

优劣对比

单进程单线程优势

  • 代码更清晰,处理逻辑更简单
  • 不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
  • 不存在多进程或者多线程导致的切换而消耗CPU

单进程单线程弊端

  • 无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善

4.3 IO多路复用技术

redis 采用网络10多路复用技术来保证在多连接的时候,系统的高吞吐量

  • 举个现实生活的例子,从左边水龙头流向右边,传统的模式下,需要建立5个管子,如下
  • 而在 IO 多路复用模式下,只需要建立一根管子让左侧水龙头分别与这根管子相连即可,如下
  • 最终目的,都是要提高系统的吞吐量,而提高吞吐量就是为了快速的写入和读取
  • 它拥有这些特性才能保证 Redis 在高并发的场景下,仍然是拥有非常高的性能的

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

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

相关文章

JavaScript 输出方式

JavaScript 提供了多种输出方式,用于在浏览器中显示信息。以下是几种常见的输出方式及其详细代码示例: 1. console.log() 用于在浏览器的开发者控制台输出信息,常用于调试。 优点: 调试方便:可以输出任意类型的数据&…

改进拖放PDF转换为图片在转换为TXT文件的程序

前段时间我写了Python识别拖放的PDF文件再转成文本文件-CSDN博客 最近有2点更新,一是有一些pdf文件转换出来的图片是横的,这样也可以识别文字,但是可能会影响效果,另一个是发现有一些文字识别不出来,看了关于提高Padd…

学习制作第一个LC带通滤波器的初步认识与总结

作为业余爱好,之前没有接触过射频方面的知识。 收音机,fm调频话筒等等想必是很多人都想制作的一个入门制作。但是这个里面的振荡,谐振,滤波,虽然在电子报上面频频看见,对于普通爱好者,如果没有…

在视频上绘制区域:使用Vue和JavaScript实现交互式画布

在数字时代,交互式媒体内容的创建和消费变得越来越普遍。特别是视频内容,它不仅提供了视觉信息,还允许用户与之互动,从而增强了用户体验。本文将介绍如何使用Vue.js框架和JavaScript创建一个交互式组件,该组件允许用户…

【Docker】Docker快速入门

Docker学习笔记 一、Docker概述 为什么会出现Docker? 安卓开发流程:apk(java开发的)发布到应用商店,用户安装apk即可使用。 后端开发流程: jar(java开发的)带上环境发布到Docker仓库,用户从Docker仓库拉取镜像并部署。 总结…

如何提高UI自动化的稳定性

用例层面: 1. 将用例设计成参数化,将测试数据通过参数进行传递 2. 对于一些可能会变化的参数,将其设计成全局变量,减少维护用例的成本 3. 对用例之间避免产生依赖,可以独立执行 框架层面: 1. 使用PO设…

Android 如何实现搜索功能:本地搜索?数据模型如何设计?数据如何展示和保存?

目录 效果图为什么需要搜索功能如何设计搜索本地的功能,如何维护呢?总结 一、效果图 二、为什么需要搜索功能 找一个选项,需要花非常多的时间,并且每次都需要指导客户在哪里,现在只要让他们搜索一下就可以。这也是模…

低代码平台后端搭建-阶段完结

前言 最近又要开始为跳槽做准备了,发现还是写博客学的效率高点,在总结其他技术栈之前准备先把这个专题小完结一波。在这一篇中我又试着添加了一些实际项目中可能会用到的功能点,用来验证这个平台的扩展性,以及总结一些学过的知识。…

python自学笔记

python部分总结 主要记录的是python与之前学的语言的不同之处 函数总结 首字母大写: name.title() 删除右边空格(暂时):name.rstrip() 删除左边空格(暂时):name.lstrip() 删除前缀(暂时):name.removeprefi…

数据库数据恢复—Oracle报错“需要更多的恢复来保持一致性”的数据恢复案例

Oracle数据库故障&检测: 打开oracle数据库报错“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。 数据库没有备份,无法通过备份去恢复数据库。用户方联系北亚企安数据恢复中心并提供Oracle_Home目录中的所有文件,…

Android APN type 配置和问题

问题/疑问 如果APN配置了非法类型(代码没有定义的),则APN匹配加载的时候最终结果会是空类型。 那么到底是xml解析到数据库就是空type呢?还是Java代码匹配的时候映射是空的呢? Debug Log 尝试将原本的APN type加入ota或者新建一条ota type APN,检查log情况。 //Type有…

大小端字节序 和 内存高低地址顺序

目录 1. 大小端字节序 1.1 什么是大小端字节序? 1.2 为什么有大小端字节序? 1.3 习题:用程序结果判断大端小端 2. 各种易混淆的高低地址顺序 2.1 监视窗口的地址表示【计算机标准展示方式】 2.2 横向地址表示 2.3 一个字节 与 多个字节 的地址…

C语言 | Leetcode C语言题解之第416题分割等和子集

题目&#xff1a; 题解&#xff1a; bool canPartition(int* nums, int numsSize) {if (numsSize < 2) {return false;}int sum 0, maxNum 0;for (int i 0; i < numsSize; i) {sum nums[i];maxNum fmax(maxNum, nums[i]);}if (sum & 1) {return false;}int tar…

《程序猿之设计模式实战 · 适配器模式》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

24/9/24 算法笔记 超参数优化算法

在机器学习中&#xff0c;优化超参数的算法是至关重要的&#xff0c;因为它们可以帮助我们找到最佳的模型配置&#xff0c;从而提高模型的性能。以下是一些常用的超参数优化算法&#xff1a; 网格搜索&#xff08;Grid Search&#xff09;&#xff1a;这是一种穷举搜索的方法&a…

分布式系统实战经验

分布式系统是现代软件架构的核心部分&#xff0c;它通过多个计算节点协同工作来处理大规模数据和请求&#xff0c;提供高可用性、可扩展性和容错能力。在实际开发和运维中&#xff0c;构建分布式系统需要考虑多方面的挑战。以下是一些在分布式系统中的实战经验&#xff1a; 1.…

springboot文件上传+拦截器

springboot文件上传拦截器 文章目录 springboot文件上传拦截器1.静态资源访问静态目录&#xff1a; 2.文件上传文件上传配置文件书写文件上传代码 3.拦截器1.初始化拦截器2.初始化配置文件 1.静态资源访问 静态目录&#xff1a; 这里的static就是spring boot默认存放静态资源的…

ZYNQ FPGA自学笔记~操作PLL

一 时钟缓冲器、管理和路由 垂直时钟中心&#xff08;clock backbone&#xff09;将设备分为相邻的左侧和右侧区域&#xff0c;水平中心线将设备分为顶部和底部两侧。clock backbone中的资源镜像到水平相邻区域的两侧&#xff0c;从而将某些时钟资源扩展到水平相邻区域。BUFG不…

考研数据结构——C语言实现小顶堆

数组初始化&#xff1a; 首先&#xff0c;我们有一个整数数组arr&#xff0c;里面包含了一系列需要排序的数字。数组的长度n是通过对数组arr的总字节大小除以单个元素的字节大小得到的。 小顶堆调整函数&#xff1a; adjustHeapMin函数的作用是将数组中的元素从某个节点向下调整…

[001-02-001].第2节:java开发环境搭建

4.1.书籍推荐&#xff1a; 4.2.人机交互方式 1.图形化界面(Graphical User Interface GUI)这种方式简单直观&#xff0c;使用者易于接受&#xff0c;容易上手操作2.命令行方式(Command Line Interface CLI)&#xff1a;需要有一个控制台&#xff0c;输入特定的指令&#xff0c…