您好、欢迎来到现金彩票网!
当前位置:2019欢乐棋牌 > 转移延迟槽 >

redis原理总结(很全面)

发布时间:2019-06-15 22:41 来源:未知 编辑:admin

  能表达3中类型:字符串、整数和浮点数。根据场景相互间自动转型,并且根据需要选取底层的承载方式

  value内部以int、sds作为结构存储。int存放整型数据,sds存放字节/字符串和浮点型数据

  用buf数组存储字符串的内容,但数组的长度会大于所存储内容的长度。会有一格专门存放”\0”(C标准库)作为结尾,还有预留多几个空的(即free区域),当append字符串的长度小于free区域,则sds不会重新申请内存,直接使用free区域

  扩容:当对字符串的操作完成后预期的串长度小于1M时,扩容后的buf数组大小=预期长度*2+1;若大于1M,则buf总是会预留出1M的free空间

  value对象通常具有两个内存部分:redisObject部分和redisObject的ptr指向的sds部分。创建value对象时,通常需要为redisObject和sds申请两次内存。单对于短小的字符串,可以把两者连续存放,所以可以一次性把两者的内存一起申请了

  map又叫hash。map内部的key和value不能再嵌套map了,只能是string类型:整形、浮点型和字符串

  map主要由hashtable和ziplist两种承载方式实现,对于数据量较小的map,采用ziplist实现

  主要分为三层,自底向上分别是dictEntry、dictht、dict

  dictEntry:管理一个key-value对,同时保留同一个桶中相邻元素的指针,一次维护哈希桶的内部连

  哈希表的核心结构是dictht,它的table字段维护着hash桶,它是一个数组,每个元素指向桶的第一个元素(dictEntry)

  set值的流程:先通过MurmurHash算法求出key的hash值,再对桶的个数取模,得到key对应的桶,再进入桶中,遍历全部entry,判定是否已有相同的key,如果没有,则将新key对应的键值对插入到桶头,并且更新dictht的used数量,used表示hash表中已经存了多少元素。由于每次插入都要遍历hash桶中的全部entry,所以当桶中entry很多时,性能会线性下降

  扩容:通过负载因子判定是否需要增加桶数。负载因子=哈希表中已有元素/哈希桶数的比值。有两个阈值,小于1一定不扩容;大于5一定扩容。扩容时新的桶数目是现有桶的2n倍

  扩/缩容通过新建哈希表的方式实现。即扩容时,会并存两个哈希表,一个是源表,一个是目标表。通过将源表的桶逐步迁移到目标表,以数据迁移的方式实现扩容,迁移完成后目标表覆盖源表。迁移过程中,首先访问源表,如果发现key对应的源表桶已完成迁移,则重新访问目标表,否则在源表中操作

  redis是单线程处理请求,迁移和访问的请求在相同线程内进行,所以不会存在并发性问题

  和list的ziplist实现类似。不同的是,map对应的ziplist的entry个数总是2的整数倍,奇数存放key,偶数存放value

  ziplist实现下,由哈希遍历变成了链表的顺序遍历,复杂度变成O(N)

  set以intset或hashtable来存储。hashtable中的value永远为null,当set中只包含整数型的元素时,则采用intset

  由于元素有序排列,所以set的获取操作采用二分查找方式实现,复杂度O(log(N))。进行插入时,首先通过二分查找得到本次插入的位置,再对元素进行扩容,再将预计插入位置之后的所有元素向右移动一个位置,最后插入元素,插入复杂度为O(N)。删除类似

  每一次请求的发送都依赖于上一次请求的相应结果完全接收,同一个连接的每秒吞吐量低

  redis对单个请求的处理时间通常比局域网的延迟小一个数量级,所以串行模式下,单链接的大部分时间都处于网络等待

  适用于批量的独立写入操作。即可将请求数据批量发送到服务器,再批量地从服务器连接的字节流中一次读取每个响应数据,减少了网络延迟,所以单连接吞吐量较串行会提高一个数量级

  客户端通过和redis服务器两阶段的交互做到批量命令原子执行的事务效果:入队操作(即服务器端先将客户端发送过来的连接对象暂存在请求队列中)和执行阶段(依次执行请求队列中的所有请求)

  redis的事务不是一致的,没有回滚机制。如果中途失败,则返回错误信息,但已经成功执行的命令不会回滚

  事务里面有可能会带有读操作作为条件,由于批量请求只会先入队列,再批量一起执行,所以一般读操作不会跟批量写请求一起执行,这时候就有可能会导致批量写之前和之后读到的数据不一致,这种可以通过乐观锁的可串行化来解决,redis通过watch机制实现乐观锁。具体实现过程看下一题

  channel的订阅关系,维护在reids实例级别,独立于redisDB的key-value体系。所有的channel都由一个map维护,键是channel的名字,value是它所有订阅者client的指针链表

  redis协议位于TCP层之上,即客户端和redis实例保持双工的连接,交互的都是序列化后的协议数据

  redis服务器对命令的处理都是单线程的,但是I/O层面却面向多个客户端并发地提供服务,并发到内部单线程的转化通过多路复用框架来实现

  首先从多路服用框架(epoll、evport、kqueue)中select出已经ready的文件描述符(fileDescriptor)

  对于上一步已经ready的fd,redis会分别对每个fd上已ready的事件进行处理,处理完相同fd上的所有事件后,再处理下一个ready的fd。有3中事件类型

  对来自客户端的命令执行结束后,接下来处理定时任务(TimeEvent)

  aeApiPoll的等待时间取决于定时任务处理(TimeEvent)逻辑

  本次主循环完毕,进入下一次主循环的beforeSleep逻辑,后者负责处理数据过期、增量持久化的文件写入等任务

  默认开启,会按照配置的指定时间将内存中的数据快照到磁盘中,创建一个dump.rdb文件,redis启动时再恢复到内存中。

  redis会单独创建fork()一个子进程,将当前父进程的数据库数据复制到子进程的内存中,然后由子进程写入到临时文件中,持久化的过程结束了,再用这个临时文件替换上次的快照文件,然后子进程退出,内存释放。

  需要注意的是,每次快照持久化都会将主进程的数据库数据复制一遍,导致内存开销加倍,若此时内存不足,则会阻塞服务器运行,直到复制结束释放内存;都会将内存数据完整写入磁盘一次,所以如果数据量大的话,而且写操作频繁,必然会引起大量的磁盘I/O操作,严重影响性能,并且最后一次持久化后的数据可能会丢失;

  以日志的形式记录每个写操作(读操作不记录),只需追加文件但不可以改写文件,redis启动时会根据日志从头到尾全部执行一遍以完成数据的恢复工作。包括flushDB也会执行。

  因为AOF采用追加的方式,所以文件会越来越大,针对这个问题,新增了重写机制,就是当日志文件大到一定程度的时候,会fork出一条新进程来遍历进程内存中的数据,每条记录对应一条set语句,写到临时文件中,然后再替换到旧的日志文件(类似rdb的操作方式)。默认触发是当aof文件大小是上次重写后大小的一倍且文件大于64M时触发;

  当两种方式同时开启时,数据恢复redis会优先选择AOF恢复。一般情况下,只要使用默认开启的RDB即可,因为相对于AOF,RDB便于进行数据库备份,并且恢复数据集的速度也要快很多。

  开启持久化缓存机制,对性能会有一定的影响,特别是当设置的内存满了的时候,更是下降到几百reqs/s。所以如果只是用来做缓存的话,可以关掉持久化。

  keys命令:获取到所有的key,再根据key获取所有的内容。缺点是如果key数量特别多,则会导致redis卡住影响业务

  aof:通过aof文件获取到所有数据。缺点是有一些redis实例写入频繁,不适合开启aof,并且文件可能特别大,传输、解析效率差

  rdb:使用bgsave获取rdb文件,然后解析。缺点是bgsave在fork子进程时有可能会卡住主进程。当对于其他两种,在低峰期在从节点做bgsave获取rdb文件,相对安全可靠。

  基础的数据类型:sds、dict、intset、zipmap、adlist、quicklist、skiplist

  举例:以key为hello,value为world,类型是string,它的内存使用:

  一个dictEntry的消耗(有2个指针,一个int64的内存消耗),RedisDB就是一个大dict,每对kv都是其中的一个entry;

  一个robj的消耗(有1指针,一个int,以及几个使用位域的字段共消耗4字节),robj是为了在同一个dict内能够存储不同类型的value,而使用的一个通用的数据结构,全名是RedisObject;

  存储key的sds消耗(存储header以及字符串长度+1的空间,header长度根据字符串长度不同也会有所不同),sds是Redis中存储字符串使用的数据结构;

  存储过期时间消耗(也是存储为一个dictEntry,时间戳为int64);

  前四项基本是存储任何一个key都需要消耗的,最后一项根据value的数据结构不同而不同;

  redis3以后,节点之间提供了完整的sharding(分片)、replication(主备感知能力)、failover(故障转移)的特性

  配置一致性:每个节点(Node)内部都保存了集群的配置信息,存储在clusterState中,通过引入自增的epoch变量来使得集群配置在各个节点间保持一致

  将所有数据划分为16384个分片(slot),每个节点会对应一部分slot,每个key都会根据分布算法映射到16384个slot中的一个,分布算法为slotId=crc16(key)%16384

  当一个client访问的key不在对应节点的slots中,redis会返回给client一个moved命令,告知其正确的路由信息从而重新发起请求。client会根据每次请求来缓存本地的路由缓存信息,以便下次请求直接能够路由到正确的节点

  分片迁移:分片迁移的触发和过程控制由外部系统完成,redis只提供迁移过程中需要的原语支持。主要包含两种:一种是节点迁移状态设置,即迁移钱标记源、目标节点;另一种是key迁移的原子化命令

  故障发现:节点间两两通过TCP保持连接,周期性进行PING、PONG交互,若对方的PONG相应超时未收到,则将其置为PFAIL状态,并传播给其他节点

  故障确认:当集群中有一半以上的节点对某一个PFAIL状态进行了确认,则将起改为FAIL状态,确认其故障

  slave选举:当有一个master挂掉了,则其slave重新竞选出一个新的master。主要根据各个slave最后一次同步master信息的时间,越新表示slave的数据越新,竞选的优先级越高,就更有可能选中。竞选成功之后将消息传播给其他节点。

  普通哈希:也称硬哈希,采用简单取模的方式,将机器进行散列,这在cache环境不变的情况下能取得让人满意的结果,但是当cache环境动态变化时,这种静态取模的方式显然就不满足单调性的要求(当增加或减少一台机子时,几乎所有的存储内容都要被重新散列到别的缓冲区中)。

  一致性哈希:将机器节点和key值都按照一样的hash算法映射到一个0~2^32的圆环上。当有一个写入缓存的请求到来时,计算Key值k对应的哈希值Hash(k),如果该值正好对应之前某个机器节点的Hash值,则直接写入该机器节点,如果没有对应的机器节点,则顺时针查找下一个节点,进行写入,如果超过2^32还没找到对应节点,则从0开始查找(因为是环状结构)。为了更可能的满足平衡性,可以引入虚拟节点,即一个实体节点映射到多个虚拟节点。

  缓存雪崩:可能是因为数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。解决思路:

  加锁计数(即限制并发的数量,可以用semphore)或者起一定数量的队列来避免缓存失效时大量请求并发到数据库。但这种方式会降低吞吐量。

  分析用户行为,然后失效时间均匀分布。或者在失效时间的基础上再加1~5分钟的随机数。

  缓存穿透:指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库中查询。解决思路:

  如果查询数据库也为空,直接设置一个默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库。设置一个过期时间或者当有值的时候将缓存中的值替换掉即可。

  可以给key设置一些格式规则,然后查询之前先过滤掉不符合规则的Key。

  缓存并发:如果网站并发访问高,一个缓存如果失效,可能出现多个进程同时查询DB,同时设置缓存的情况,如果并发确实很大,这也可能造成DB压力过大,还有缓存频繁更新的问题。解决思路:

  对缓存查询加锁,如果KEY不存在,就加锁,然后查DB入缓存,然后解锁;其他进程如果发现有锁就等待,然后等解锁后返回数据或者进入DB查询。

  FIFO算法:First in First out,先进先出。原则:一个数据最先进入缓存中,则应该最早淘汰掉。也就是说,当缓存满的时候,应当把最先进入缓存的数据给淘汰掉。

  LFU算法:Least Frequently Used,最不经常使用算法。

  LRU算法:Least Recently Used,近期最少使用算法。

  LRU和LFU的区别。LFU算法是根据在一段时间里数据项被使用的次数选择出最少使用的数据项,即根据使用次数的差异来决定。而LRU是根据使用时间的差异来决定的。

  setnx key val。当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。

  expire key timeout。为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。

  使用setnx加锁,如果返回1,则说明加锁成功,并设置超时时间,避免系统挂了,锁没法释放。在finally中delete删除锁释放。

  如果需要设置超时等待时间,则可以加个while循环,在获取不到锁的情况下,进行循环获取锁,超时了则退出。

  0.redis是什么?redis是nosql(也是个巨大的map)单线w的并发(数据都在内存中)使用java对redis进行操作类似jdbc接口标准对mysql,有各类实现他的实...博文来自:zlc3323的博客

  知道了Redis的各种数据结构,对象结构,那么Redis是如何保存数据的,又是如何操作数据的呢,Redis里面的命令是怎么实现的呢?这一系列问题值得我们思考一.Redis维护多个数据库Redis内部维...博文来自:Felix_阳的博客

  Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。同时redis也是一个key-value存储系统。Redis,更...博文来自:java、c++、机器学习方向King

  转自:架构的问题Memcached采用客户端-服务器的架构,客...博文来自:jinfeiteng2008的专栏

  Redis是一种面向“key-value”类型数据的分布式NoSQL数据库系统,具有高性能、持久存储、适应高并发应用场景等优势。它虽然起步较晚,但发展却十分迅速。 近日,Redis的作者在博客中写到,...博文来自:逍遥飞鹤的专栏

  2.使用redis计数器防止并发请求需求描述    最近项目中有个需求,短信发送的并发请求问题:业务需求是需要限制一个号码一分钟内只能获取一次随机码,之前的实现是短信发送请求过来后,先去数据库查询发送...博文来自:waeceo的专栏

  1、Sentinel哨兵Sentinel(哨兵)是Redis的高可用性解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,...博文来自:yaooch的专栏

  [b]Redis是一个开源的key-value存储系统。[/b]与memcached类似,Redis将大部分数据存储在内存中,[b]支持的数据类型包括:字符串、哈希表、列表、集合、有序集合[/b]以及...博文来自:iteye_9921的博客

  数据类型Redis最为常用的数据类型主要有以下五种:StringHashListSetSortedset在具体描述这几种数据类型之前,我们先通过一张图了解下Redis内部内存管理中是如何描述这些不同数...博文来自:gb4215287的博客

  Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集合和有序集合。支持在服务器端计算集合的并,交和补集(diffe...博文来自:soyo的专栏

  一、Redis的服务器端和客户端是如何进行通讯的?(1)带着问题我们来学习Redis底层是如何实现的,大家知道Redis的持久化有两种方式:1.第一种是RDB的方式来实现的持久化:RDB持久化是指在指...博文来自:王伟的博客

  一、问题:      数据库表数据量极大(千万条),要求让服务器更加快速地响应用户的需求。 二、解决方案:   1.通过高速服务器Cache缓存数据库数据   2.内存数据库  (这里仅从数据缓存方面...博文来自:chensi16114的博客

  一、概述Redis哨兵(以下称哨兵)是为Redis提供一个高可靠解决方案,对一定程序上的错误,可以不需要人工干预自行解决。哨兵功能还有监视、事件通知、配置功能。以下是哨兵的功能列表:监控:不间断的检查...博文来自:MingoJiang

  一、Redis提供了不同级别的持久化方式:Redis提供了两种方式对数据进行持久化,分别是RDB和AOF。 RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储。 AOF持久化方式记录每次对服...博文来自:wolf

  全面剖析RedisCluster原理和应用1.RedisCluster总览1.1设计原则和初衷在官方文档ClusterSpec中,作者详细介绍了Redis集群为什么要设计成现在的样子。最核心的目标有三...博文来自:西代零零发

  原创作品,转载请标明:源码剖析系列文章汇总:传送门今天为大家带来Redis中事务...博文来自:上善若水,人淡如菊

  2018年开年知识盛会——NoSQL数据库直播大讲堂峰会,将于1月19日、23日、25日与大家见面,阿里云Redis、MongoDB、HBase的15位技术专家、产品专家将给大家带来深度的技术及产品分...博文来自:京庐空间

  Redis集群设计包括2部分:哈希Slot和节点主从,本篇博文通过3张图来搞明白Redis的集群设计。想扩展并发读就添加Slaver,想扩展并发写就添加Master,想扩容也就是添加Master,任何...博文来自:yejingtao703的专栏

  Redis是一个基于key-value的高速缓存系统,类似于memcached,但是支持更复杂的数据结构List、Set、SortedSet,并且有持久化的功能。由于近期工作很多地方都用到了它,所以花...博文来自:Liyiming

  Redis技术学习,更多资源请访问 存储机制分成两种Snapshot和AOF。无论是那种机制,Redis都是将数据存储在内存中。 Snapshot工...博文来自:Cowboy

  总体架构RedisCluster采用无中心结构,每个节点都保存数据和整个集群的状态每个节点都和其他所有节点连接,这些连接保持活跃使用gossip协议传播信息以及发现新节点redis节点不作为clien...博文来自:define_us的专栏

  一、原理Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis客户端可以订阅任意数量的频道。下图展示了频道channel1,以及订阅这个...博文来自:yswKnight的博客

  转载:Redis数据同步机制分析一、数据全同步机制Redis的主从同步机制可以确保redis的master和slave之间的数据同步。按照同步内容的多少可以分为全同步和部分同步;按照同步的时机可以分为...博文来自:Invokers Tower

  一、前言因为近期项目中开始使用Redis,为了更好的理解Redis并应用在适合的业务场景,需要对Redis设计与实现深入的理解。我分析流程是按照从main进入,逐步深入分析Redis的启动流程。同时根...博文来自:Gods blog

  一、Redis介绍Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作...博文来自:那是完全的覺悟丶 的博客

  Redis 的使用流程是怎么样?Redis是不是自动集成了异步处理?论坛

  今天早上由于zookeeper和redis集群不在同一虚拟机导致出了点很小错误(人为),所以这里总结一下redis集群的搭建以便日后所需同时也希望能对你有所帮助。笔主这里使用的是Centos7.如果你...博文来自:不忘初心

  1.为什么使用redis?redis是一种典型的no-sql即非关系数据库像python的字典一样存储key-value键值对工作在memory中所以很适合用来充当整个互联网架构中各级之间的cache...博文来自:MayMatrix 的博客

  一、关于分布式锁关于分布式锁,可能绝大部分人都会或多或少涉及到。 我举二个例子: 场景一:从前端界面发起一笔支付请求,如果前端没有做防重处理,那么可能在某一个时刻会有二笔一样的单子同时到达系统后台。场...博文来自:zhangjin123go的博客

  redis-cluster槽道的原理:本文配图是为了便于理解,如果图片影响了您的阅读,翻到博客末尾,笔者copy了无图版1redis服务如何判断key对应的槽道号,是否由本节点管理?每一个节点都有一个...博文来自:F_xzzzzz的博客

  1、持久化数据库的缺点  1)存储在部署数据库的硬盘上       平时我们使用的关系型数据库有MySql,Oracle以及SqlServer等,通常通过数据驱动来链接数据库进行增删改查。     那...博文来自:lixiao1003的专栏

  RESP(REdisSerializationProtocol )协议:redis客户端和服务端是通过RESP协议来进行交互的,RESP协议是基于TCP协议的,将客户端命令以某种形式传递给服务端,服务...博文来自:的博客

  说到redis就会联想到memcached,反之亦然。了解过两者的同学有那么个大致的印象:redis与memcached相比,比仅支持简单的key-value数据类型,同时还提供list,set,zs...博文来自:的博客

  知道了Redis的各种数据结构,对象结构,那么Redis是如何保存数据的,又是如何操作数据的呢,Redis里面的命令是怎么实现的呢?这一系列问题值得我们思考一.Redis维护多个数据库Redis内部维...博文来自:刘阳的博客

  redis底层是用什么结构来存储数据的呢?我们从源码上去理解就会容易的多:  redis底层是使用C语言来编写的,我们可以看到它的数据结构声明。一个dict有两个dictht,一个dictht有一个d...博文来自:weixin_34220623的博客

  实现字典的方法有很多种:最简单的就是使用链表或数组,但是这种方式只适用于元素个数不多的情况下;要兼顾高效和简单性,可以使用哈希表;如果追求更为稳定的性能特征,并且希望高效地实现排序操作的话,则可以使用...博文来自:yangstarss的专栏

  从事IT行业的都知道一个开发者的水平基本取决于你做过多少项目,唯有见多才能识广,这次收集的34套Java经典项目主要包括26套Java web项目,6套Java swing项目,2套Java控制台项目...博文来自:明礼馨德的博客

  一、适用场景内存属于稀缺资源,不能随意浪费。如果在一个系统中有很多个完全相同或相似的对象,我们就可以使用享元模式,让他们共享一份内存即可,不必每个都去实例化对象,从而节省内存空间。二、模式核心 享...博文来自:小小本科生成长之路

  一、前言最近由于研究需要,要用到线性判别分析(LDA)。于是找了很多资料来看,结果发现大部分讲的都是理论知识,因此最后还是看的一知半解,后来终于找到了个英文的文档,作者由PCA引入LDA,看过后豁然开...博文来自:jnulzl的专栏

  相信学习编程的同学,或多或少都接触到算法的时间复杂度和空间复杂度了,那我来讲讲怎么计算。        常用的算法的时间复杂度和空间复杂度 一,求解算法的时间复杂度,其具体步骤是: ⑴ 找出算法...博文来自:杨威的博客

  从trust zone之我见知道,支持trustzone的芯片会跑在两个世界。 普通世界、安全世界,对应高通这边是HLOS,QSEE。 如下图: 如下是HLOS与QSEE的软件架...博文来自:邓永坚的blog

  公司产品之前使用xmpp作为底层库,之前同事编译自己的sdk静态库想生成.a库,但是各种编译问题(其实耐心修改配置都能解决),但是从百度找到方案用framework可以解决,所以最终使用的是frame...博文来自:mingming24的专栏

  本篇文章是根据我的上篇博客,给出的改进版,由于时间有限,仅做了一个简单的优化。相关文章:将excel导入数据库2018年4月1日,新增下载地址链接:点击打开源码下载地址十分抱歉,这个链接地址没有在这篇...博文来自:Lynn_Blog

  偶然间发现各路大牛的一些python创作,不得不说python是一个比较全面的语言,附上网址以后可能需要用到python视觉处理,爬虫数据分析的时候可以用的上吧2333 python小项目: ht...博文来自:王甲评的博客

  docx4j官方提供了一些例子,本文只是其中一部分应用的简单例子。需要注意的地方是页眉和页脚,必须创建对应关系才能起作用。页眉和页脚添加图片的时候,第二个参数sourcePart是必须的,调用的cre...博文来自:偶尔记一下

  扫二维码关注,获取更多技术分享 本文承接之前发布的博客《 微信支付V3微信公众号支付PHP教程/thinkPHP5公众号支付》必须阅读上篇文章后才可以阅读这篇文章。由于最近一段时间工作比较忙,...博文来自:Marswill

  jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...博文来自:Websites

  安装cadence之前对操作系统需要进行一些必要的配置。博文来自:maxwell2ic的博客

  强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Ti...博文来自:九野的博客

  一、代理模式为某个对象提供一个代理,从而控制这个代理的访问。代理类和委托类具有共同的父类或父接口,这样在任何使用委托类对象的地方都可以使用代理类对象替代。代理类负责请求的预处理、过滤、将请求分配给委托...博文来自:小小本科生成长之路

  在MATLAB中,可以注释一段程序。 使用“%{”和“%}”。 例如 %{ 。。。 %} 即可。 经典方法是用 if 0,但缺点是不够直观,注释掉的内容仍然保持代码的颜色。现在可以用 ...博文来自:知识小屋

http://femi-speaks.com/zhuanyiyanchicao/36.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有