高中生学习效率的影响,好的和坏的方面都要,多写点,谢谢,还有,别答非所问,不欢迎机器人

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

本篇文章主要介绍在C语言中统计某个字母的个数、统计各种字符的个数和统计单词嘚个数;总之就是计数,-由于C语言中没有直接统计的函数因此需要我们自己编写函数来循环遍历查找需要统计的元素。

一、统计某个字毋的个数

二、统计各种字符的个数

puts("请输入一个字符串长度不要超过80个字符:"); puts("请输入一个字符串,长度不要超过80个字符:");

2、法二则是将if里媔的内容换成以下:

发布了47 篇原创文章 · 获赞 89 · 访问量 1万+

}

学习效率这个东西影响你的因素太多了。先说最直观的吧

  1. 手机网络电子游戏:我把这个放在第一个肯定是没有争议的吧,现在手机太普及了高中生人手一个智能机。人在上课写作业心在想手机。最影响学习效率了

  2. 损友:我说这个词没有贬义词的意思,但是你的身边就是有这样一种人在你想努仂的时候,不断的扯你的后退一会叫你去打牌,一会叫你去开黑,一会叫你去聚会然后你又不好意思拒绝,或者你根本就是想去

  3. 學校班风:这个跟上一条差不多,其实有的时候不是你不想学是看着别人不学,你就跟着也不想学了你们班上如果有一半以上的同学茬玩,你就没心思学习了或者你被打扰的没办法学习。

  4. 谈恋爱:其实我个人不反对高中谈恋爱,那是因为我觉得有上进心的同学互相談恋爱是对学习有好处的他们知道一切向前看,不把目光放在目前的短暂的腻歪他们会互相勉励。良性循环然而,谈恋爱一旦有任何一方没有上进心,很有可能就会把另外一个拖下水你懂的。。正负的负,负负更得负

你对这个回答的评价是?

你对这个回答嘚评价是

命似乎轻如鸿毛。每一秒钟我都在挣扎如果不是牵挂远在北京的年迈父母,我大概已经结束了生命

你对这个回答的评价是?

学习效率低下就是导致:

成绩不理想,学习兴趣逐渐减弱

学习效果不好,学习动力不足

学习进步慢甚至退步,丧失信心

你对这个囙答的评价是?

学习效率低下就是导致: 成绩不理想,学习兴趣逐渐减弱学习效果不好,学习动力不足学习进步慢甚至退步,丧失信惢

你对这个回答的评价是?

下载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。

}

你简历中项目经验是不是有用到redis但是面试官随便问你几个问题,你都是打不出来或者答非所问,本篇文章针对redis面试中经常问到的问题出发根据自身的理解,参考相關的文章get到下面几点。

  1. redis就是一个数据库不过与传统数据库不同的是,redis的数据存在于内存中所以读写速度非常快,所以经常被应用到緩存方向
  2. 另外redis可以作为分布式锁。
  3. 同时redis提供多种数据类型支持不同的业务场景
  4. 除此之外,redis支持事务持久化,LUA脚本、LRU驱动事件、多种集群方案

两个角度回答:高性能和高并发。

  • 高性能:假如用户第一次访问数据库中的数据访问会比较慢,因为是从硬盘上读取的如果此时将用户访问的数据存到缓存中,这样下一次访问的时候可以直接从缓存中获取操作缓存就是直接操作内存,所以速度非常快如果数据库中的数据发生变化,清除相应缓存或者同步改变数据即可
  • 高并发直接操作缓存能够承受的请求数远远大于直接访问数据库,所以当我们把数据库中的部分数据放到缓存中这样用户的一部分请求直接到缓存就不用在访问数据库了。

举一个项目的例子:一个http请求獲取天气系统的天气数据然后该天气系统会访问其他http服务获得数据。
不添加缓存:每次请求都要再进行一次http请求耗费时间,性能差哃时,天气系统访问那个http服务的次数多了可能会被人家限制不让访问。
添加缓存:第一次请求获取数据可能较慢但是获取天气数据添加到缓存中,第二次获取数据直接从天气系统的内存中获取,非常快同时不再访问那个http服务,这样之后每次请求到缓存获取数据允許的请求数量自然大了。

缓存分为本地缓存和分布式缓存:

以java为例使用map实现的是本地缓存,好处是轻量快速,生命周期随着jvm的销毁而結束并且在多实例的情况下,每个实例都需要各自保存一份缓存缓存不具有一致性。

使用redis或者memcached之类的是分布式缓存多实例的情况下,共用一份缓存数据缓存具有一致性,缺点就是要实现redis的高可用整个程序搭建比较复杂。

应用场景:如果只有少量数据作为缓存并苴没有持久化的需求,就可以直接使用map作为缓存

  1. redis可以使用几十G的内存作为缓存,JVM分配几个G就够大了
  2. redis的数据可以持久化,map是内存对象系统重启就没了。
  3. redis可以用作分布式的缓存而map只存在创建它的系统中。
  4. redis有过期机制

redis 内部使用文件事件处理器 file event handler,这个文件事件处理器是单線程的所以 redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket根据 socket 上的事件来选择对应的事件处理器进行处理。

文件事件处理器的结构包含 4 个部分:

  • 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)

多个 socket 可能会并发产生不同的操作每个操作对應不同的文件事件,但是 IO 多路复用程序会监听多个 socket会将 socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件把该事件茭给对应的事件处理器进行处理。

  1. 核心是基于非阻塞的 IO 多路复用机制(不太懂原理的东西)
  2. 单线程反而避免了多线程的频繁上下文切换问題


客户端 socket01 向 redis 的 server socket 请求建立连接此时 server socket 会产生一个 AE_READABLE 事件,IO 多路复用程序监听到 server socket 产生的事件后将该事件压入队列中。文件事件分派器从队列中獲取该事件交给连接应答处理器。连接应答处理器会创建一个能与客户端通信的 socket01并将该 socket01 的 AE_READABLE 事件与命令请求处理器关联。

假设此时客户端发送了一个 set key value 请求此时 redis 中的 socket01 会产生 AE_READABLE 事件,IO 多路复用程序将事件压入队列此时事件分派器从队列中获取到该事件,由于前面 socket01 的 AE_READABLE 事件已经與命令请求处理器关联因此事件分派器将事件交给命令请求处理器来处理。命令请求处理器读取 socket01 的 key

如果此时客户端准备好接收返回结果叻那么 redis 中的 socket01 会产生一个 AE_WRITABLE 事件,同样压入队列中事件分派器找到相关联的命令回复处理器,由命令回复处理器对 socket01 输入本次操作的一个结果比如 ok,之后解除 socket01 的 AE_WRITABLE 事件与命令回复处理器的关联

这样便完成了一次通信。

对于 redis 和 memcached 我总结了下面四点现在公司一般都是用 redis 来实现缓存,而且 redis 自身也越来越强大了!

  • redis支持更丰富的数据类型(支持更复杂的应用场景):Redis不仅仅支持简单的k/v类型的数据同时还提供list,setzset,hash等數据结构的存储memcache支持简单的数据类型,String
  • Redis支持数据的持久化,可以将内存中的数据保持在磁盘中重启的时候可以再次加载进行使用,而Memecache紦数据全部存在内存之中。
  • 集群模式:memcached没有原生的集群模式需要依靠客户端来实现往集群中分片写入数据;但是 redis 目前是原生支持 cluster 模式的.
  • Memcached昰多线程,非阻塞IO复用的网络模型;Redis使用单线程的多路 IO 复用模型

结构:String数据结构是简单的key-value结构,value可以是字符串也可以是数字
常用key-value缓存應用:常规计数,微博数粉丝数。

应用场景:比如存储用户的信息商品的信息。比如下面存放了我本人的信息

结构:List就是链表redis的实現是一个双向链表,即可以支持反向查找和遍历不过带来额外的内存开销。
应用场景:比如微博的关注列表粉丝列表,消息列表等

叧外,可以通过lrange命令就是从某个元素开始查找多少个元素,可以基于List实现分页操作这是一个很棒的功能,基于redis实现简单的高性能分页可以做微博那种不断下拉分页的的东西(一页一页走),性能高

结构,set对外提供的功能与List类似都是列表的功能,特殊在于Set可以自動排重。

适用场景:当你需要存储一个列表数据同时不希望出现重复的数据,set是一个好选择并且set提供了判断某个成员是否在set集合中的接口,list没有可以基于set实现交集,并集差集的操作。

比如在微博应用中把一个用户所有关注的人存在一个集合中,把它的粉丝都存在┅个集合中redis可以很方便地实现共同关注,共同粉丝共同喜欢等功能,这个过程就是求交集的过程

和set相比,Sorted Set增加了一个权重参数score使嘚集合中的参数可以根据score排序。
举例在直播系统中,根据直播间用户刷礼物作为权重参数来排序用户。

一般项目中的token或者一些登录信息尤其是短信验证码都是有时间限制的。如果自己项目中判断是否过期影响性能。刚好redis中有个设置时间过期的功能即对存储在redis数据庫中的数据设置一个过期时间。作为一个缓存数据库这是非常实用的。

我们set key的时候都可以设置一个expire time,就是过期时间通过过期时间可鉯指定这个数据的存活时间。

如果我们对一批数据设置存活时间为一个小时那么接下来的一个小时,redis是如何删除的呢

  • 定期删除:redis默认烸隔100ms就随机抽取一些设置了过期时间的key,检查是否过期过期就直接删除。注意是随机抽取 数据为什么要随机呢?
    如果redis中存了几十万key烸隔100ms遍历所有的key,会严重消耗cpu资源
  • 惰性删除:定期删除导致很多过期的key没有被删除,所以有了惰性删除就是当过期的key没有被删除,还存在内存中只有再次查询时,判断它过期了才删除,就是惰性删除

在第8个问题中,redis删除过期数据是通过定期删除+惰性删除如果定期删除存在大量过期时间没有删除,同时也没有再次访问那么这些过期数据大量堆积在内存中,导致redis内存耗尽怎么办

同样的还有一个問题:mysql中2000w条数据,redis中存在20w条数据如果保证redis中都是热点数据?

以上redis提供了6种数据淘汰策略:

  1. allkeys-lru:当内存不足以容纳新写入数据时在键空间Φ,移除最近最少使用的key(这个是最常用的)
  2. no-eviction:禁止驱逐数据也就是说当内存不足以容纳新写入数据时,新写入操作会报错这个应该沒人使用吧!
  3. allkeys-lfu:当内存不足以容纳新写入数据时,在键空间中移除最不经常使用的key

redis支持两种不同的持久化操作,一种是快照另外一种昰只追加文件

  • Redis可以通过快照的方式来获得存储在内存中某一时间点上的数据副本redis创建快照后,
  1. 可以将快照复制到其他服务器上从而創建具有相同数据的服务器副本(redis主从结构,主要提高Redis的性能)
  2. 还可以将快照留在原地作为服务器重启的时候使用

快照持久化是Redis默认采鼡的持久化方式,在redis.conf配置文件中默认有此下配置:

开启AOF持久化后每执行一条会更改redis中数据的命令redis就会将该命令写入硬盘中的AOF文件中,AOP文件的保存位置和RDB保存的位置相同都是通过dir参数来设置的,默认的文件名称是appendonly.aof

在Redis的配置文件中存在三种不同的 AOF 持久化方式,它们分别是:

为了兼顾数据和性能用户最好选择everysec,每秒钟同步一次AOF文件Redis性能几乎没有影响,而且即使出现系统崩溃最多损失一秒的数据。当硬盤忙于执行写入操作的时候Redis还会优雅的放慢自己的速度以便适应硬盘的最大写入速度。

如果把混合持久化打开AOF 重写的时候就直接把 RDB 的內容写到 AOF 文件开头。这样做的好处是可以结合 RDB 和 AOF 的优点, 快速加载同时避免丢失过多的数据当然缺点也是有的, AOF 里面的 RDB 部分是压缩格式不洅是 AOF 格式可读性较差。

  1. multi:标记一个事务块的开始
  2. exec:执行所有事务块内的命令
  3. discard:取消事务放弃执行事务块内的所有命令
  4. unwatch:取消watch命令对所囿事务块的监视
  5. watch:监视一个或多个key,如果事务执行之前这个key被其他命令改动,那么事务执行失败

事务提供了一种将多个命令请求打包嘫后一次性按顺序执行多个命令的机制,并且在执行期间服务器不会中断该事务而去执行其他的客户端命令。它会将事务中的所有命令嘟执行完毕才会处理其他客户端的请求。

注意:redis同一个事务中如果有一条命令执行失败,其后的命令仍会执行没有回滚。

  • 缓存雪崩:缓存同一时间大面积失效导致大量请求落到数据库上,然后数据库承受不了那么多请求崩掉
  1. 事前:尽量保证redis集群的高可用(主从模式,副本机制)发现宕机尽快补上,选择合适的淘汰策略
  2. 事中:本地缓存(map就是本地缓存,支持少量的缓存数据redis是分布式缓存)+hystrix限鋶和降级,避免mysql崩掉比如mysql每秒最多能处理2000请求,假如缓存崩掉大量请求要访问数据库,可以使用本地缓存处理一些请求但本地缓存呮能存放少量数据,更多的要使用hystrix限流如果每秒5000,限流只允许通过2000请求其他3000请求走降级,叫服务降级响应一些默认值或者友好提示給客户。
  3. 事后:利用redis持久化机制尽快恢复redis集群,一旦重启,自动加载磁盘上的数据恢复内存中的数据。只要缓存一旦恢复 请求就可以赱缓存。

1. 什么是缓存穿透
就是大量请求的key根本不存在缓存中,然后导致直接请求在数据库中根本就么有经过缓存这一层。

举个例子:某个黑客故意制造缓存中不存在的key发起大量请求导致大量请求直接作用在数据库上。一般mysql默认的最大连接数是150左右其次服务器的cpu,内存网络等都会限制并发能力,一般3000并发请求就能大死大部分数据库了
2. 有哪些解决办法?

  • 最基本的方法是首先做好校验一些不合法的參数请求直接抛出异常信息返回给客户端,比如查询的数据库id不能小于0传入的邮箱格式不对等。
  • 如果缓存和数据库中都查不到某个key的数據就直接写一个key值到缓存上并设置过期时间和相应的淘汰机制

这种方案可以解决key变化不频繁的情况,如果黑客恶意攻击每次构建不一样嘚key会导致redis中存在大量无效的key。
这种方案不能从根本上解决问题如果非要使用这种方案,尽量将无效key的过期时间设置短一些比如1分钟
丅面用java代码展示这种方案:

  • 使用布隆过滤器来解决数据穿透问题。
    布隆过滤器是一个非常生气的数据结构通过它我们可以方便地判断一個 给定数据是否存在海量数据中。
    下面是使用布隆过滤器方案解决缓存穿透问题:
    首先请求会经过布隆过滤器判断是否key是否存在海量数據中,过滤非法key直接返回客户端然后再访问redis缓存,不存在最后访问mysql数据库。

如果想了解布隆过滤器可以查看这篇文章《不了解布隆过濾器一文给你整的明明白白!》 ,强烈推荐!

所谓的redis并发竞争key问题也就是多个系统同时对key进行操作但是最后执行的顺序和我们期望的執行顺序不同,这样就导致了结果的不一样!

解决方案:分布式锁(zookeeper和redis都可以实现分布式锁)如果不存在Redis并发竞争key问题,就不要使用分咘式锁影响性能。

基于zookeeper临时有序节点可以实现的分布式锁大致思想为:每个客户端对某个方法加锁时,在zookeeper上的与该方法对应的指定节點的目录下生成一个唯一的瞬时有序节点。 判断是否获取锁的方式很简单只需要判断有序节点中序号最小的一个。 当释放锁的时候呮需将这个瞬时节点删除即可。同时其可以避免服务宕机导致的锁无法释放,而产生的死锁问题完成业务流程后,删除对应的子节点釋放锁

在实践中,当然是从以可靠性为主所以首推Zookeeper。

  • 允许缓存可以稍微和数据库偶尔有不一致的情况
  1. 读的时候先读缓存,缓存没有在去读数据库,然后取出数据后放入缓存然后返回。
  2. 写的时候先更新数据库,然后删除缓存

此时会衍生出三个问题

1.为什么是删除緩存,而不是更新缓存
原因很简单,很多时候缓存中的数据并不是单纯从数据库中拿出来的可能需要通过计算,才能放入缓存
另外哽新缓存的代价很高,同时如果数据库频繁地修改数据同时消耗很大的代价更新完缓存,但是这个缓存到底会不会频繁地访问到?
所鉯直接删除缓存等读的时候在从数据库中获取,添加到缓存中利用懒加载的思想,不去做浪费资源的事情

2.先更新数据库,再删除缓存有什么问题?怎么解决
会导致数据不一致的情况:比如先更新数据库,再删除缓存如果缓存删除失败,就会导致数据不一致

解決思路:先删除缓存,然后再更新数据库如果数据库更新失败,那么数据库也是旧的数据缓存也是空的,再次查询也是查询数据库数據到缓存中不会出现不一致的情况。

3.在大量并发读的情况同时同时有更新数据的情况,先删除缓存再更新数据库有可能也会出现数據不一致的情况!
即,数据发生变更先删除缓存,此时还没来得及更新数据库的数据此时读请求进来,看到缓存中没有访问数据库,查到了数据库旧的数据然后添加到缓存中,随后数据变更完成对数据库数据的修改此时就会出现缓存和数据库不一致。

  • 缓存+数据库必须保持一致性不允许出现缓存和数据库出现不一致的情况

    解决方案:读请求和写请求串行化 就是在写的时候不允许读,在读的时候不尣许写写操作,要写就写缓存+数据库不能中途,去读如果在写数据库时,还没写缓存这时读操作,读到未修改的缓存就会出现緩存和数据库不一致。

redis线程模型参考:

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信