当前位置: 首页 > news >正文

Redis是什么?

Redis

            • [1] 什么是远程字典服务器?
            • [2] 为什么redis是高性能的?
            • [3] 分布式的含义?
            • [4] NoSQL的含义?

Redis (REmote DIctionary Server)是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列,是一个高性能的key-value数据库.
Redis与其他key-value缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用.
  • Redis不仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储.
  • Redis支持数据的备份,即master-slave模式的数据备份.

为什么要用Redis

  • 性能极高 – Redis读的速度是110000次/s,写的速度是81000次/s .
  • 丰富的数据类型 – Redis支持Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作.
  • 原子 – Redis的所有操作都是原子性的,即要么成功执行要么失败完全不执行.单个操作是原子性的.多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来.
  • 丰富的特性 – Redis还支持publish/subscribe, key过期等特性.

总结:

  1. Redis(Remote Dictionary Server远程字典服务器),是一款高性能的分布式数据库,基于内存运行并支持持久化NoSQL数据库.

  2. 它可以储存键(key)与stringhashlistset和sorted set五种不同类型的值(value)之间的映射.

  3. 使用redis可能出现缓存雪崩缓存击穿缓存穿透和数据库和缓存的双写一致性问题等问题.

[1] 什么是远程字典服务器?

远程:有远程的就有本地的.本地的意思就是你自己的电脑,远程就是指别人的电脑.
字典:就像普通的字典一样,数据字典就是用来对数据进行定义和解释的.它可以用作:数据库、缓存和消息中间件.
服务器:服务器就是远程电脑,服务器可以在网络中为其它客户机提供计算或者应用服务.

[2] 为什么redis是高性能的?

1)基于内存实现,完全内存计算;
2)单线程操作,避免了线程上下文切换操作;
3)多路I/O复用的线程模型,实现了一个线程监控多个IO流,及时响应请求;
4)Redis对外部的依赖比较少,属于轻量级内存数据库.

内存: 内存的访问速度是很快的,常用的DDR4内存的读写速度是机械硬盘的30倍;

单线程:避免了线程上下文切换和竞争条件.也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗

什么是线程上下文切换?
即使是单核CPU也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制.时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程时同时执行的,时间片一般是几十毫秒(ms).CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务.但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再次加载这个任务的状态,从任务保存到再加载的过程就是一次上下文切换.
这就像我们同时读两本书,当我们在读一本英文的技术书籍时,发现某个单词不认识, 于是便打开中英文词典,但是在放下英文书籍之前,大脑必须先记住这本书读到了多少页的第多少行,等查完单词之后,能够继续读这本书.这样的切换是会影响读书效率的,同样上下文切换也会影响多线程的执行速度.
I/O多路复用技术是什么,为什么很快?
常见的IO模型有阻塞模型、非阻塞模型、IO多路复用,信号驱动IO,异步.

  1. 阻塞式IO: 使用系统调用,并一直阻塞直到内核将数据准备好,之后再由内核缓冲区复制到用户态,在等待内核准备的这段时间什么也干不了.
  2. 非阻塞式IO:内核在没有准备好数据的时候会返回错误码,而调用程序不会休眠,而是不断轮询询问内核数据是否准备好
  3. IO多路复用:类似非阻塞,只不过轮询不是由用户线程去执行,而是由内核去轮询,内核监听程序监听到数据准备好后,调用内核函数复制数据到用户空间
  4. 信号驱动IO: 应用进程使用 sigaction 系统调用,内核立即返回,应用进程可以继续执行,也就是说等待数据阶段应用进程是非阻塞的.
  5. 异步IO:应用进程执行 aio_read 系统调用会立即返回,应用进程可以继续执行,不会被阻塞,内核会在所有操作完成之后向应用进程发送信号.

不好理解?举例说明:

  1. 阻塞:比如某个时候你在去餐厅吃饭,又想出去逛街.但是你不知道饭菜什么时候来,只好坐在餐厅里面等.直到做好,然后吃完才离开去做逛街.这就是典型的阻塞.
  2. 非阻塞忙轮询:接着上面的例子,如果用忙轮询的方法,出去我们逛一会,然后每分钟回来问一下服务员:“饭菜好了没?”
  3. IO多路复用:餐厅安装了电子屏幕用来显示点餐的状态,逛街一会,回来就不用去询问服务员了,直接看电子屏幕就可以了.
  4. 异步IO:不想逛街,餐厅太吵了,回家好好休息一下.于是我们叫外卖,打个电话点餐,然后我可以在家好好休息一下,饭好了送货员送到家里来.这就是典型的异步,只需要打个电话说一下,然后可以做自己的事情,饭好了就送来了.
  5. 异步 I/O 与信号驱动 I/O 的区别在于,异步 I/O 的信号是通知应用进程 I/O 完成,而信号驱动 I/O 的信号是通知应用进程可以开始 I/O.

阻塞是个什么概念呢?
比如某个时候你在去餐厅吃饭,又想出去逛街.但是你不知道饭菜什么时候来,只好坐在餐厅里面等.直到做好,然后吃完才离开去做逛街.这就是典型的阻塞.

[3] 分布式的含义?

把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给多个计算机进行处理,最后把这些计算结果综合起来得到最终的结果

[4] NoSQL的含义?

NoSQL泛指非关系型的数据库.与之对应的是关系数据库SQL.关系数据库的查询经常会关联两个表的数据,而NoSQL不关联表.

相关文章:

  • C语言中函数返回值的问题
  • 哈夫曼树
  • Redis有哪五种不同类型的值?应用场景有哪些?
  • jvm重要参数分析
  • 使用redis可能出现的问题
  • phpQuery对数据信息的采集进一步学习
  • Redis底层数据结构
  • 用户口令复杂度策略设置银河麒麟
  • Redis的过期策略
  • 第三周作业 产品同质化问题
  • Redis分布式锁
  • LLVM3.8停止了旧Windows版本,取消Autoconf,改进Clang
  • Redis的I/O多路复用
  • mysql之select(一)
  • 多线程的 Redis
  • 【347天】每日项目总结系列085(2018.01.18)
  • 2017 年终总结 —— 在路上
  • android 一些 utils
  • ES6核心特性
  • input的行数自动增减
  • Java比较器对数组,集合排序
  • js面向对象
  • SegmentFault 2015 Top Rank
  • spring boot下thymeleaf全局静态变量配置
  • Spring Cloud中负载均衡器概览
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Vue2 SSR 的优化之旅
  • yii2权限控制rbac之rule详细讲解
  • 大主子表关联的性能优化方法
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 入门到放弃node系列之Hello Word篇
  • 山寨一个 Promise
  • 问题之ssh中Host key verification failed的解决
  • 异步
  • 阿里云API、SDK和CLI应用实践方案
  • #Linux(Source Insight安装及工程建立)
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • (pojstep1.1.2)2654(直叙式模拟)
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (生成器)yield与(迭代器)generator
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (原)Matlab的svmtrain和svmclassify
  • (转) Android中ViewStub组件使用
  • (转)ABI是什么
  • .net 4.0发布后不能正常显示图片问题
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .net 程序发生了一个不可捕获的异常
  • .net和php怎么连接,php和apache之间如何连接
  • .net经典笔试题
  • .net知识和学习方法系列(二十一)CLR-枚举
  • @Transactional 竟也能解决分布式事务?
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • [2669]2-2 Time类的定义