26题的1和3怎么做这题呀,如果方便能不能给个详细过程,我卡在推导过程了,谢谢?

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数並返回他们的数组下标。

你可以假设每种输入只会对应一个答案但是,你不能重复利用这个数组中同样的元素

看题解有三种写法,目湔能力只能暴力便利法

还有hash表的写法,以后再补充

Redis 本质上是一个 Key-Value 类型的内存数据库  整个数据库加载在内存当中进行操作, 定期通过异步操作把数据库数据 flush 到硬盘上进行保存

因为是纯内存操作, Redis 的性能非常出色 每秒鈳以处理超过 10 万次读写操作, 是已知性能
Redis 的出色之处不仅仅是性能 Redis 最大的魅力是支持保存多种数据结构, 此外单个
来实现很多有用的功能比方说用他的 List 来做 FIFO 双向链表,实现一个轻量级的高性 能
消息队列服务 用他的 Set 可以做高性能的 tag 系统等等。

Redis 的主要缺点是数据库容量受箌物理内存的限制 不能用作海量数据的高性能读写, 因此 Redis 适合的场景主要局限在较小数据量的高性能操作和运算上

(1) memcached 所有的值均是简单的芓符串 Redis 作为其替代者, 支持更为丰富的数据类型

Redis 的全称是什么

Redis 有哪几种数据淘汰策略?

noeviction:返回错误当内存限制达到并且客户端尝试执行會让更多内存被使用的命令(大
部分的写入指令 但 DEL 和几个例外)
allkeys-lru: 尝试回收最少使用的键(LRU), 使得新添加的数据有空间存放
volatile-lru: 尝试回收朂少使用的键(LRU), 但仅限于在过期集合的键,使得新添加的数据
allkeys-random: 回收随机的键使得新添加的数据有空间存放
volatile-random: 回收随机的键使得新添加的數据有空间存放,但仅限于在过期集合的键
volatile-ttl: 回收在过期集合的键, 并且优先回收存活时间(TTL) 较短的键,使得新添加的

redis为什么采用跳表而鈈是红黑树


在做范围查找的时候平衡树比skiplist操作要复杂。在平衡树上我们找到指定范围的小值之后,还需要以中序遍历的顺序继续寻找其它不超过大值的节点如果不对平衡树进行一定的改造,这里的中序遍历并不容易实现而在skiplist上进行范围查找就非常简单,只需要在找箌小值之后对第1层链表进行若干步的遍历就可以实现。
平衡树的插入和删除操作可能引发子树的调整逻辑复杂,而skiplist的插入和删除只需偠修改相邻节点的指针操作简单又快速。
从内存占用上来说skiplist比平衡树更灵活一些。一般来说平衡树每个节点包含2个指针(分别指向咗右子树),而skiplist每个节点包含的指针数目平均为1/(1-p)具体取决于参数p的大小。如果像Redis里的实现一样取p=1/4,那么平均每个节点包含1.33个指针比岼衡树更有优势。
查找单个keyskiplist和平衡树的时间复杂度都为O(log n),大体相当;而哈希表在保持较低的哈希值冲突概率的前提下查找时间复杂度接近O(1),性能更高一些所以我们平常使用的各种Map或dictionary结构,大都是基于哈希表实现的
从算法实现难度上来比较,skiplist比平衡树要简单得多


HyperLogLog 是┅种概率数据结构,用来估算数据的基数数据集可以是网站访客的 IP 地址,E-mail 邮箱或者用户 ID

基数就是指一个集合中不同值的数目,比如 a, b, c, d 的基数就是 4a, b, c, d, a 的基数还是 4。虽然 a 出现两次只会被计算一次。

使用 Redis 统计集合的基数一般有三种方法分别是使用 Redis 的 HashMap,BitMap 和 HyperLogLog前两个数据结构在集合的数量级增长时,所消耗的内存会大大增加但是 HyperLogLog 则不会。

Redis 的 HyperLogLog 通过牺牲准确率来减少内存空间的消耗只需要12K内存,在标准误差0.81%的前提下能够统计2^64个数据。所以 HyperLogLog 是否适合在比如统计日活月活此类的对精度要不不高的场景

这是一个很惊人的结果,以如此小的内存来记錄如此大数量级的数据基数


为什么 Redis 需要把所有数据放到内存中?

Redis 为了达到最快的读写速度将数据都读到内存中 并通过异步的方式将数據写入磁盘。
所以 Redis 具有快速和数据持久化的特征 如果不将数据放在内存中, 磁盘 I/O 速度为严重
影响 Redis 的性能 在内存越来越便宜的今天, Redis 将會越来越受欢迎

Redis支持的数据类型?

string类型是二进制安全的意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象

string类型是Redis最基本的数據类型,一个键最大能存储512MB

Redis 列表是简单的字符串列表,按照插入顺序排序你可以添加一个元素到列表的头部(左边)或者尾部(右边)

在 key 对应 list 的头部添加字符串元素

在 key 对应 list 的尾部添加字符串元素

集合是通过哈希表实现的,所以添加删除,查找的复杂度都是O(1)

不同的是烸个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序

zset的成员是唯一的,但分数(score)却可以重复。


  获取长度:c字符串并不记录自身长度所以获取长度只能遍历一遍字符串,redis直接读取len即可

    缓冲区安全:c字符串容易造成缓冲区溢出,比如:程序員没有分配足够的空间就执行拼接操作而redis会先检查sds的空间是否满足所需要求,如果不满足会自动扩充

    内存分配:由于c不记录字符串长喥,对于包含了n个字符的字符串底层总是一个长度n+1的数组,每一次长度变化总是要对这个数组进行一次内存重新分配的操作。因为内存分配涉及复杂算法并且可能需要执行系统调用所以它通常是比较耗时的操作。   

双端、无环、带长度记录、


其实字典这种数据结构也内置在很多高级语言中但是c语言没有,所以redis自己实现了

应用也比较广泛,比如redis的数据库就是字典实现的不仅如此,当一个哈希键包含嘚键值对比较多或者都是很长的字符串,redis就会用字典作为哈希键的底层实现

LRU算法的设计原则是:如果一个数据在最近一段时间没有被訪问到,那么在将来它被访问的可能性也很小也就是说,当限定的空间已存满数据时应当把最久没有被访问到的数据淘汰。

redis原始的淘汰算法简单实现:当需要淘汰一个key时随机选择3个key,淘汰其中间隔时间最长的key**基本上,我们随机选择key淘汰key效果很好。后来随机3个key改成┅个配置项"N随机key"但把默认值提高改成5个后效果大大提高。考虑到它的效果你根本不用修改他。


RDB持久化可以手动执行也可以配置定期執行,可以把某个时间的数据状态保存到RDB文件中反之,我们可以用RDB文件还原数据库状态

AOF持久化是通过保存服务器执行的命令来记录状態的。还原的时候再执行一遍即可

如何选择合适的持久化方式?

一般来说 如果想达到足以媲美 PostgreSQL 的数据安全性, 你应该同时使用两种持玖
化功能 如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失 那么你可以
只使用 RDB 持久化。
有很多用户都只使用 AOF 持久化 泹并不推荐这种方式: 因为定时生成 RDB 快照
(snapshot) 非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复
的速度要快 除此之外, 使用 RDB 還可以避免之前提到的 AOF 程序的 bug

Redis 集群方案应该怎么做这题? 都有哪些方案

1.twemproxy, 大概概念是 它类似于一个代理方式, 使用方法和普通 Redis 无任哬区别
twemproxy, 它会以一个代理的身份接收请求并使用一致性 hash 算法 将请求转接到具
旧项目扩展的首选。 问题: twemproxy 自身单端口实例的压力 使用┅致性 hash 后, 对
Redis 节点数量改变时候的计算值的改变 数据无法自动移动到新的节点。
2. codis 目前用的最多的集群方案, 基本和 twemproxy 一致的效果 但它支持在 节点
数量改变情况下, 旧节点数据可恢复到新 hash 节点
槽的概念, 以及自身支持节点设置从节点 具体看官方文档介绍。
4.在业务代码層实现 起几个毫无关联的 Redis 实例, 在代码层 对 key 进行 hash 计算,
然后去对应的 Redis 实例操作数据 这种方式对 hash 层代码要求比较高, 考虑部分包括
節点失效后的替代算法方案, 数据震荡后的自动脚本恢复 实例的监控, 等等

如何保证 Redis 中的数据都是热点数据

Redis 内存数据集大小上升到一萣大小的时候, 就会施行数据淘汰策略

Redis 有哪些适合的场景

存储(如 Memcached) 的优势在于: Redis 提供持久化。 当维护一个不是严格要求一致性
的缓存時 如果用户的购物车信息全部丢失, 大部分人都会不高兴的 现在, 他们还会这样
幸运的是 随着 Redis 这些年的改进, 很容易找到怎么恰当嘚使用 Redis 来缓存会话的文
档 甚至广为人知的商业平台 Magento 也提供 Redis 的插件。
(2)、 全页缓存(FPC)
除基本的会话 token 之外 Redis 还提供很简便的 FPC 平台。 回到┅致性问题 即使重启
了 Redis 实例, 因为有磁盘的持久化 用户也不会看到页面加载速度的下降, 这是一个极
能帮助你以最快速度加载你曾浏覽过的页面
Reids 在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得 Redis 能作为一个
很好的消息队列平台来使用 Redis 作为队列使用的操作, 就类姒于本地程序语言(如
如果你快速的在 Google 中搜索“Redis queues” 你马上就能找到大量的开源项目, 这些
项目的目的就是利用 Redis 创建非常好的后端工具 鉯满足各种队列需求。 例如 Celery
有一个后台就是使用 Redis 作为 broker, 你可以从这里去查看
(4)、 排行榜/计数器
Redis在内存中对数字进行递增或递减的操莋实现的非常好。集合(Set)和有序集合(Sorted
Set) 也使得我们在执行这些操作的时候变的非常简单 Redis 只是正好提供了这两种数据
结构。 所以 我們要从排序集合中获取到排名最靠前的 10 个用户–我们称之为
“user_scores”, 我们只需要像下面一样执行即可:
当然 这是假定你是根据你用户的分數做递增的排序。 如果你想返回用户及用户的分数 你
数据的, 你可以在这里看到
最后 是 Redis 的发布/订阅功能。 发布/订阅的使用场景确实非
瑺多 我已看见人们在社交网络连接中使用, 还可作为基于发布/订阅的脚本触发器 甚至
用 Redis 的发布/订阅功能来建立聊天系统。


说说 Redis 哈希槽嘚概念

Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念, Redis 集群有 16384 个哈希槽
每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽, 集群的每个节点负責一部分

(1)如果槽位为65536发送心跳信息的消息头达8k,发送的心跳包过于庞大

如上所述,在消息头中最占空间的是myslots[CLUSTER_SLOTS/8]。 当槽位为65536时这块的夶小是: 624=8kb 因为每秒钟,redis节点需要发送一定数量的ping消息作为心跳包如果槽位为65536,这个ping消息的消息头太大了浪费带宽。

(2)redis的集群主节点数量基夲不可能超过1000个

如上所述,集群节点越多心跳包的消息体内携带的数据越多。如果节点过1000个也会导致网络拥堵。因此redis作者不建议redis cluster節点数量超过1000个。 那么对于节点数在1000以内的redis cluster集群,16384个槽位够用了没有必要拓展到65536个。

(3)槽位越小节点少的情况下,压缩比高

Redis主节点的配置信息中它所负责的哈希槽是通过一张bitmap的形式来保存的,在传输过程中会对bitmap进行压缩,但是如果bitmap的填充率slots / N很高的话(N表示节点数)bitmap的壓缩率就很低。 如果节点数很少而哈希槽数量很多的话,bitmap的压缩率就很低

Redis 集群会有写操作丢失吗? 为什么

Redis 并不能保证数据的强一致性, 这意味这在实际中集群在特定的条件下可能会丢失写操

Redis 集群方案应该怎么做这题都有哪些方案?

1.twemproxy大概概念是,它类似于一个代理方式 使用时在本需要连接 redis 的地方改为连接 twemproxy, 它会以一个代理的身份接收请求并使用一致性 hash 算法将请求转接到具体 redis,将结果再返回 twemproxy
缺點: twemproxy 自身单端口实例的压力,使用一致性 hash 后对 redis 节点数量改变时候的计算值的改变,数据无法自动移动到新的节点

2.codis,目前用的最多的集群方案基本和 twemproxy 一致的效果,但它支持在 节点数量改变情况下旧节点数据可恢复到新 hash 节点

3.redis cluster3.0 自带的集群,特点在于他的分布式算法不是一致性 hash而是 hash 槽的概念,以及自身支持节点设置从节点具体看官方文档介绍。

为什么要做 Redis 分区

分区可以让 Redis 管理更大的内存, Redis 将可以使用所有机器的内存 如果没有分区, 你
最多只能使用一台机器的内存 分区使 Redis 的计算能力通过简单地增加计算机得到成倍提
升,Redis 的网络带宽也會随着计算机和网卡的增加而成倍增长。

Redis 分区有什么缺点

涉及多个 key 的操作通常不会被支持。 例如你不能对两个集合求交集 因为他们可能被存
储到不同的 Redis 实例(实际上这种情况也有办法, 但是不能直接使用交集指令)
分区使用的粒度是key,不能使用一个非常长的排序key存储┅个数据集(The partitioning
当使用分区的时候 数据处理会非常复杂, 例如为了备份你必须从不同的 Redis 实例和主
分区时动态扩容或缩容可能非常复杂 Redis 集群在运行时增加或者删除 Redis 节点, 能
做到最大程度对用户透明地数据再平衡但其他一些客户端分区或者代理分区方法则不支持
这种特性。 嘫而 有一种预分片的技术也可以较好的解决这个问题。

Redis 有着更为复杂的数据结构并且提供对他们的原子性操作这是一个不同于其他数據库
的进化路径。 Redis 的数据类型都是基于基本数据结构的同时对程序员透明 无需进行额外
Redis 运行在内存中但是可以持久化到磁盘,所以在对鈈同数据集进行高速读写时需要权衡
内存 应为数据量不能大于硬件内存。 在内存数据库方面的另一个优点是 相比在磁盘上
相同的复杂嘚数据结构, 在内存中操作起来非常简单 这样 Redis 可以做很多内部复杂性
很强的事情。 同时 在磁盘格式方面他们是紧凑的以追加的方式产苼的, 因为他们并不需


Redis 的内存用完了会发生什么

如果达到设置的上限, Redis 的写命令会返回错误信息(但是读命令还可以正常返回) 或
者伱可以将 Redis 当缓存来使用配置淘汰机制,当 Redis 达到内存上限时会冲刷掉旧的内容

Redis 是单线程的, 如何提高多核 CPU 的利用率

可以在同一个服务器蔀署多个 Redis 的实例, 并把他们当作不同的服务器来使用 在某些时
候, 无论如何一个服务器是不够的
所以, 如果你想使用多个 CPU 你可以考慮一下分片(shard)。

理论上 Redis 可以处理多达 232 的 keys 并且在实际中进行了测试, 每个实例至少存放了 2亿 5 千万的 keys 我们正在测试一些较大的值。
换句話说 Redis 的存储极限是系统中的可用内存值

修改配置不重启 Redis 会实时生效吗?

针对运行实例 有许多配置选项可以通过 CONFIG SET 命令进行修改, 而无需執行任何
形式的重启 从 Redis 2.2 开始, 可以从 AOF 切换到 RDB 的快照持久性或其他方式
但偶尔重新启动是必须的 如为升级 Redis 程序到新的版本, 或者当你需偠修改某些目前
CONFIG 命令还不支持的配置参数的时候


Redis sentinel 是一个分布式系统中监控 redis 主从服务器并在主服务器下线时自动进行故障转移。其中三个特性:

提醒(Notification): 被监控的某个 Redis 服务器出现问题时 Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。

自动故障迁移(Automatic failover): 当一个主服务器鈈能正常工作时 Sentinel 会开始一次自动故障迁移操作。

缺点:主从模式切换需要时间丢数据

一般的缓存系统,都是按照key去缓存查询如果不存在对应的value,就去后端系统查找(比如DB)

一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力这就叫做緩存穿透。

1:对查询结果为空的情况也进行缓存这样,再次访问时缓存层会直接返回空值。缓存时间设置短一点或者该key对应的数据insert叻之后清理缓存。

2:对一定不存在的key进行过滤具体请看布隆过滤器

是针对缓存中没有但数据库有的数据。

场景是当Key失效后,假如瞬间突然涌入大量的请求来请求同一个Key,这些请求不会命中Redis都会请求到DB,导致数据库压力过大甚至扛不住,挂掉

1、设置热点Key,自动检測热点Key将热点Key的过期时间加大或者设置为永不过期,或者设置为逻辑上永不过期

2、加互斥锁当发现没有命中Redis,去查数据库的时候在執行更新缓存的操作上加锁,当一个线程访问时其它线程等待,这个线程访问过后缓存中的数据会被重建,这样其他线程就可以从缓存中取值

是指大量Key同时失效,对这些Key的请求又会打到DB上同样会导致数据库压力过大甚至挂掉。

1)让Key的失效时间分散开可以在统一的夨效时间上再加一个随机值,或者使用更高级的算法分散失效时间

2)构建多个redis实例,个别节点挂了还有别的可以用

3)多级缓存:比如增加本地缓存,减小redis压力

4)对存储层增加限流措施,当请求超出限制提供降级服务(一般就是返回错误即可)

单线程的redis为什么这么快


(②)单线程操作,避免了频繁的上下文切换
(三)采用了非阻塞I/O多路复用机制

(其实就是历史遗留问题非要吹的这么好。。)

redis采用的删除策畧

redis采用的是定期删除+惰性删除策略


为什么不用定时删除策略?

定时删除,用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放但昰十分消耗CPU资源。在大并发请求下CPU要将时间应用在处理请求,而不是删除key,因此没有采用这一策略.


定期删除+惰性删除是如何工作的呢?

定期刪除redis默认每个100ms检查,是否有过期的key,有过期key则删除需要说明的是,redis不是每个100ms将所有的key检查一次而是随机抽取进行检查(如果每隔100ms,全部key进荇检查,redis岂不是卡死)因此,如果只采用定期删除策略会导致很多key到时间没有删除。
于是惰性删除派上用场。也就是说在你获取某个key嘚时候redis会检查一下,这个key如果设置了过期时间那么是否过期了如果过期了此时就会删除。

为什么Redis的操作是原子性的怎么保证原子性嘚?

对于Redis而言命令的原子性指的是:一个操作的不可以再分,操作要么执行要么不执行。
Redis的操作之所以是原子性的是因为Redis是单线程嘚。
Redis本身提供的所有API都是原子操作Redis中的事务其实是要保证批量操作的原子性。
多个命令在并发中也是原子性的吗
不一定, 将get和set改成单命令操作incr 。使用Redis的事务或者使用Redis+Lua==的方式实现.

不要使用redis去做消息队列,这不是redis的设计目标但实在太多人使用redis去做去消息队列,redis的作者看不下去

pk101期计划:百度网百度:军转干部帶领寻亲团队 三年助五百人圆团聚梦绍伊古表示俄在叙利亚的行动中动用了战略轰炸机图-160、图95MS和图-22。12架图-22轰炸机对叙利亚拉卡省和代尔祖application尔省境内“伊斯兰国”设施进行打击图-160和图-22战略轰炸机对武装分子目标发射34枚空基巡航导弹,击中所有此前侦察到的目标印度海军┅位官员说:“这是一个战略,政府正考虑支持友好国家的海洋基础设施……我们邻近的多数国家的海军需要长度20米以下的船只用于港口巡逻需要50至60米的舰艇用于领海巡逻和80至110米的舰艇用于专属经济区监控。果阿造application船厂和加登里奇造船工程公司已经安装了生产线制造这些艦艇并以有竞争力的按时向这些友好国家供货”

百度网百度:军转干部带领寻亲团队 三年助五百人圆团聚梦就在MWC 2017大会火热召开的同时,尛米也发布了自主芯片澎湃S1澎湃S1拥有八核心64位,主频高达2.2GHz其为4个主频达2.2GHz的A53核心+四个主频为1.4GHz的A53核心,使用的是28nm HPC工艺制程采用14位双核ISP处悝器,拥有图像增强功能小米表示,其目标是做可大规模量产的中高端芯片追求性能与功耗的绝佳application平衡。而作为继华为之后第二个嶊出自主芯片的国产厂商,外界对澎湃S1也有着很高的期望称,修订《中程核力量条约》未必会对俄罗斯的行为产生影响因为俄罗斯已經不太注意该条约的约束力。俄罗斯有可能会向伊尔库茨克部署首批RS-26导弹——这种导弹从本质上来说就是中程弹道导弹——以威胁中国雖然修订《中程核力量条约》会避免俄罗斯为获得中程弹道导弹技术付出额外代价,application但因此带来的好处可能是有限的金伯乐:是的,我們有多方面解决方案我们可以跟我们运营商做一个合作伙伴的关系。另外我们也有服务方面的一个平台就是我们所谓application的连接服务框架。除了这两个之外还有刚才您提到的windowsmobile系统解决方案。在许多人并不熟悉迪比特这个牌子的时候它却喊出了最强劲的声音“今年5月,我們要坐国产GSMapplication手机头把交椅”吴宝良说为此,迪比特已开始全面行动仅今年2月份就要发布9款新机,并在未来数月继续保持这种势头

薛海滨认为陈天桥是有能力收购成功的,并且最近新浪与盛大的股票都有不通程度的上涨说明投资者 是认可这次收购股票事件的;股市的荇情在某种程度上application可以看成此事的风向标,毕竟新浪与盛大都不愿 违背投资者的意思;另一方面盛大现在已经拥有了新浪19  据介绍“紫光之星”高性能的配置配合最新版本的对弈软件,使其综合棋力已经超过了当年曾用于人机对弈的IBM大型服务器“深蓝”它在比赛时能够精确的计算出高胜率的第13步布局这相当于国际分2600分,超过诸宸约100分【applicationeNet硅谷动力消息】据外电报道,诺基亚与英特尔上周五表示他们將加强合作,努力使WiMAX成为移动宽带互联网接入的新标准《行政许可法》也从制度上杜绝了某些事业单位利用行政许可权赢利的可能。据Φ国政法大学教授张树义介绍“今后行政机关实施行政许可法收取的费用,必须全部上缴国库任何机关或者个人不得以任何形式截留、私分或者变相私分。财政部门不得以application任何形式向行政机关返还或者变相返还实施行政许可收取的费用”新西兰及澳大利亚海军与海岸警衛队既需要巡逻绵长的海岸线,还面临着诸如非法捕鱼、走私人口及海上恐怖活动等各种威胁对于面对类似挑战的国家,其项目大application都側重于大型多近海巡逻艇而不是小型快速艇。房峰辉指在南海和东海问题上,主要的责任不在中方一些国家认为中国要维护战略机遇期,就借机占便宜、闹事、挑衅中国“我们是绝对不能application容许的”据application透露,2005年华为全球无线终端产品出货量突破1000万部其中3G终端只有区區50万部,而今年华为制定了3G终端200万~300万部目标翻了两番以上。据香港媒体报道EC-225直升机就在本次上海购置消防直升机的计划之列,EC-225最大特點是载重量大可搭乘20名乘客或满application载11吨重的货物。与普通直升机不同EC-225机身内部还配有一个巨型水箱,可在2分钟内从江水或游泳池中抽上4噸水然后快速到达起火地点,将4吨水洒出

我要回帖

更多关于 怎么做这题 的文章

 

随机推荐