精华内容
下载资源
问答
  • 当然,redis还具备可以做分布式锁等其他功能,但是如果只是为了分布式锁这些其他功能,完全还有其他中间件(如zookpeer等)代替,并是非使用redis。因此,这个问题主要从性能和并发两个角度去答。回答:如下所示,...
  • 前两天一个学员来报名,跟我聊天的时候说:“老师,我很想提升自己的气质,但总觉得用处不大,知道为什么。”这句话我听到的时候其实有点懵,因为跟她聊天的过程中我发现,她并没有真正去了解过系统化的形体塑造...

    前两天有一个学员来报名,跟我聊天的时候说:“老师,我很想提升自己的气质,但总觉得用处不大,不知道为什么。”

    这句话我听到的时候其实有点懵,因为跟她聊天的过程中我发现,她并没有真正去了解过系统化的形体塑造,也不知道女性的气质提升要进行哪些训练。

    她只是看了一些视频,跳跳健身操,做几个动作,就以为会像视频里说的一样出现很自己想要的效果,而且在聊天的过程中我发现,她很少去坚持把某一项训练做下来,总是隔几天觉得没效果,就去找其他的视频学习。

    不了解,不坚持,怎么可能会有效果呢?

    但我能看的出来她是真的很想提升自己,我告诉她,如果想要有所改变,就必须要系统化的了解和学习女性的形体塑造,气质的提升可不是那么简单的。

    今天呢,我就和大家分享一些关于形体塑造和训练的小知识,想要提升自己,就一定要看看哦。

    3ad64329d2730f313d5dddca778f7580.png

    1、什么是形体训练

    很多新学员报了名以后都会问我一件事,那就是什么是形体训练。

    大概念上,我们都能理解,形体训练就是通过系统化的训练来提升自身的外在形体美和气质美。也有些学员是有一些健美操和瑜伽的,但都不够完整,他们只是自己学了某些动作,然后进行练习,并没有完整系统化的训练。

    形体训练,是以人体科学理论为基础,用专业的动作和方法,以改变形体为目的的形体素质练习和技巧练习。在这个过程中,我们会有三个方面:基本姿态训练、基本形态控制训练和基本素质训练。

    形体训练是一个需要坚持重复的过程,并不是说这些动作一定都很困难,而是这些动作需要我们不断地去重复,很多人就是因为坚持不了,所以放弃了。

    形体训练是一个全面改变的过程,需要我们去活动全身的解耦和关节,让身体形态达到协调,千万不要认为这个很简单哦,气质可不是那么容易就提升的。

    d9adf8a8c9fae66d0949c4df85e5dffb.png

    2、千万不要忽视形体塑造,外在气质提升与形体有着密不可分的关系

    我在跟一些朋友聊天的时候,有些人觉得我做形体修炼训练意义不大,说女性的魅力在于认真,执着,也有朋友说你看那些长得漂亮的,即使不做形体修炼,不去塑形,也一样很有气质。

    我不否认这个观点,但我们也不得不承认一个客观的事实,那就是一个有魅力的女人,绝对不是你觉得她某一方面很优秀,而是你看到她的第一眼,就觉得她很有气质,那这无疑会增加你对她的好感。

    1、形体的塑造,第一个要点,就是能够增加我们和别人初次见面时的好印象。

    我们举个例子,如果我们平时不太注意自己的形体,走路的时候风风火火,时不时会做出一些不太雅观的动作,或者是不太好看的坐姿,也许这都是我们平时的习惯,我们不会注意到,但如果和别人初次接触,肯定是更好的外在才能留下更好的印象。

    我们常常看到那些模特,感觉他们说不出来哪里更好,但就是身材比例很好,走路姿势很优雅,动作也很协调,这就是形体塑造的优势,我们女性肯定也都想变得更好,那这就需要我们多去努力,改变自己了。

    602535ca32557a10811a61d215031376.png

    2、好的形体,可以大大增加我们的自信力

    我们常常或提到一个词,就是自信,我们会发现那些很有气质的女性,第一眼给人的感觉就是优雅,自信。

    每个人的形体天生都会有差距,有些人天生条件就好,后天保持的也很好。而大多数时候,因为我们长期工作的关系,或者是生活方面的不注意,会导致我们的形体产生一些变化,导致身体形态看起来不太协调。

    比如说我们上班经常坐很久,脊椎就会弯曲,或者是经常低头看电脑,看手机,那么颈椎也会产生变形,这个时候我们就会看到像驼背啊,或者是脖子前倾,又或者是其他的小问题。

    当我们拥有这些问题时,尤其是和别人有对比的时候,我们肯定就会有落差感,那这个时候我们就要知道,我们的自信力不够了,如果我们也能够有一个很优雅的姿态,成为一个有气质的女性,那无论是工作还是生活方面,都会大大提升我们的自信力。

    db5b41ab36ed424f26c81fcb1a67c445.png

    3、做形体训练,有助于我们保持身体的健康

    形体塑造不仅仅是简单的提升气质,在这个过程中我们会矫正身体的很多小问题。

    比如说脊椎变形,或者是颈椎有问题,那在训练的过程中,我们就是通过动作的重复,来慢慢调整,让关节恢复到良好的状态。

    另一方面,在进行形体训练的过程中,我们需要活动到全身的肌肉和骨骼,增加身体的活动量,有时候我们想减肥,或者说想运动,但是又觉得健身太辛苦,那就可以选择进行形体训练,也能拥有让人羡慕的身材。

    03160d4cdbcfa5395455fd4190aae833.png

    3、做形体训练的时候,我们需要注意哪些事情

    1、要把每一个动作都根据老师的指导做到位,不能只做到“差不多”

    我们在形体教学的过程中发现,有些学员会做的很标准,而有些学员做的动作就总是会差一些。

    初期的时候做形体训练的动作会让我们的身体有些不适应,所以可能有些学员就觉得,动作都是这样,那我做到差不多,反正差距也不大,减小动作幅度让身体舒服一些,减少自己的压力。

    形体训练是有很严格的标准的,身材的每一处比例都有着很准确的数据,所以如果总是做到“差不多”,那最后训练出来的效果也总是会比别人差一点,这肯定不是我们想要的结果,这也是为什么很多学员自己在家跟着视频训练,却总是看不到想要的效果的原因。

    f51bc9a87a7ad5f8b6b241f132108490.png

    2、控制饮食,不要再把不好的饮食习惯带到生活中

    有些学员是很喜欢吃油腻的东西或者油炸的东西,又或者会因为经常加班或者是工作忙导致不吃早餐,夜宵又吃很多,或者是白天吃得少,晚上吃得多。

    早形体训练的过程中,我们要保证有合理的用餐,不要再让身体中摄入过多的热量,不然我们想要有一个好的形体,那我们肯定就要比别人做更多的训练,消耗掉身体中不断增加的热量和脂肪。

    8c840fad6a2fc8081b8835437f3a2517.png

    3、习惯不同的训练方式,不要觉得只会了几个动作就可以了

    形体训练是有很多的动作的,包括简单的周期性的训练和复杂一些的非周期性训练,那这个过程中,我们就需要让自己去适应这个过程。

    也有些学员会害羞,觉得有些动作很难做出来,但这都是我们必须要经历的过程,只有按照要求来,我们才能达到想要的结果,等我们看到那个完全蜕变的自己时,就会知道,我们所有的坚持,都是有意义的。

    b17798be227553c49cb9f7de17707e69.png

    当然,一定要记住最重要的一点,如果想要蜕变,就一定要坚持,千万不能半途而废哦。

    坚持训练,让自己变成别人眼中的万人迷,你也一样可以做到。

    展开全文
  • 为什么分布式一定要有redis,redis的一些优缺点

    万次阅读 多人点赞 2018-06-14 16:23:20
    当然,redis还具备可以做分布式锁等其他功能,但是如果只是为了分布式锁这些其他功能,完全还有其他中间件(如zookpeer等)代替,并是非使用redis。因此,这个问题主要从性能和并发两个角度去答。回答:如下所示,...

    阿里云1折优惠链接:https://www.aliyun.com/minisite/goods?userCode=8hemam4l

    1、为什么使用redis

    分析:博主觉得在项目中使用redis,主要是从两个角度去考虑:性能和并发。当然,redis还具备可以做分布式锁等其他功能,但是如果只是为了分布式锁这些其他功能,完全还有其他中间件(如zookpeer等)代替,并不是非要使用redis。因此,这个问题主要从性能和并发两个角度去答。
    回答:如下所示,分为两点


    (一)性能

    如下图所示,我们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。

    题外话:忽然想聊一下这个迅速响应的标准。其实根据交互效果的不同,这个响应时间没有固定标准。不过曾经有人这么告诉我:"在理想状态下,我们的页面跳转需要在瞬间解决,对于页内操作则需要在刹那间解决。另外,超过一弹指的耗时操作要有进度提示,并且可以随时中止或取消,这样才能给用户最好的体验。"

     

    那么瞬间、刹那、一弹指具体是多少时间呢?

    根据《摩诃僧祗律》记载

    一刹那者为一念,二十念为一瞬,二十瞬为一弹指,二十弹指为一罗预,二十罗预为一须臾,一日一夜有三十须臾。

    那么,经过周密的计算,一瞬间为0.36 秒,一刹那有 0.018 秒.一弹指长达 7.2 秒。


    (二)并发
    如下图所示,在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问数据库。

     

    2、使用redis有什么缺点

    分析:大家用redis这么久,这个问题是必须要了解的,基本上使用redis都会碰到一些问题,常见的也就几个。
    回答:主要是四个问题
    (一)缓存和数据库双写一致性问题
    (二)缓存雪崩问题
    (三)缓存击穿问题
    (四)缓存的并发竞争问题
    这四个问题,我个人是觉得在项目中,比较常遇见的,具体解决方案,后文给出。

     

    3、单线程的redis为什么这么快

    分析:这个问题其实是对redis内部机制的一个考察。其实根据博主的面试经验,很多人其实都不知道redis是单线程工作模型。所以,这个问题还是应该要复习一下的。
    回答:主要是以下三点
    (一)纯内存操作
    (二)单线程操作,避免了频繁的上下文切换
    (三)采用了非阻塞I/O多路复用机制

     

    题外话:我们现在要仔细的说一说I/O多路复用机制,因为这个说法实在是太通俗了,通俗到一般人都不懂是什么意思。博主打一个比方:小曲在S城开了一家快递店,负责同城快送服务。小曲因为资金限制,雇佣了一批快递员,然后小曲发现资金不够了,只够买一辆车送快递。


    经营方式一
    客户每送来一份快递,小曲就让一个快递员盯着,然后快递员开车去送快递。慢慢的小曲就发现了这种经营方式存在下述问题

    • 几十个快递员基本上时间都花在了抢车上了,大部分快递员都处在闲置状态,谁抢到了车,谁就能去送快递

    • 随着快递的增多,快递员也越来越多,小曲发现快递店里越来越挤,没办法雇佣新的快递员了

    • 快递员之间的协调很花时间

    综合上述缺点,小曲痛定思痛,提出了下面的经营方式


    经营方式二
    小曲只雇佣一个快递员。然后呢,客户送来的快递,小曲按送达地点标注好,然后依次放在一个地方。最后,那个快递员依次的去取快递,一次拿一个,然后开着车去送快递,送好了就回来拿下一个快递。

    对比
    上述两种经营方式对比,是不是明显觉得第二种,效率更高,更好呢。在上述比喻中:

    • 每个快递员------------------>每个线程

    • 每个快递-------------------->每个socket(I/O流)

    • 快递的送达地点-------------->socket的不同状态

    • 客户送快递请求-------------->来自客户端的请求

    • 小曲的经营方式-------------->服务端运行的代码

    • 一辆车---------------------->CPU的核数

     

    于是我们有如下结论
    1、经营方式一就是传统的并发模型,每个I/O流(快递)都有一个新的线程(快递员)管理。
    2、经营方式二就是I/O多路复用。只有单个线程(一个快递员),通过跟踪每个I/O流的状态(每个快递的送达地点),来管理多个I/O流。

    下面类比到真实的redis线程模型,如图所示

     

    参照上图,简单来说,就是。我们的redis-client在操作的时候,会产生具有不同事件类型的socket。在服务端,有一段I/0多路复用程序,将其置入队列之中。然后,文件事件分派器,依次去队列中取,转发到不同的事件处理器中。
    需要说明的是,这个I/O多路复用机制,redis还提供了select、epoll、evport、kqueue等多路复用函数库,大家可以自行去了解。

     

    4、redis的数据类型,以及每种数据类型的使用场景

    分析:是不是觉得这个问题很基础,其实我也这么觉得。然而根据面试经验发现,至少百分八十的人答不上这个问题。建议,在项目中用到后,再类比记忆,体会更深,不要硬记。基本上,一个合格的程序员,五种类型都会用到。
    回答:一共五种
     

    (一)String
    这个其实没啥好说的,最常规的set/get操作,value可以是String也可以是数字。一般做一些复杂的计数功能的缓存。

    (二)hash
    这里value存放的是结构化的对象,比较方便的就是操作其中的某个字段。博主在做单点登录的时候,就是用这种数据结构存储用户信息,以cookieId作为key,设置30分钟为缓存过期时间,能很好的模拟出类似session的效果。

    (三)list
    使用List的数据结构,可以做简单的消息队列的功能。另外还有一个就是,可以利用lrange命令,做基于redis的分页功能,性能极佳,用户体验好。

    (四)set
    因为set堆放的是一堆不重复值的集合。所以可以做全局去重的功能。为什么不用JVM自带的Set进行去重?因为我们的系统一般都是集群部署,使用JVM自带的Set,比较麻烦,难道为了一个做一个全局去重,再起一个公共服务,太麻烦了。
    另外,就是利用交集、并集、差集等操作,可以计算共同喜好,全部的喜好,自己独有的喜好等功能

    (五)sorted set

    sorted set多了一个权重参数score,集合中的元素能够按score进行排列。可以做排行榜应用,取TOP N操作。另外,参照另一篇《分布式之延时任务方案解析》,该文指出了sorted set可以用来做延时任务。最后一个应用就是可以做范围查找

     

    5、redis的过期策略以及内存淘汰机制

    分析:这个问题其实相当重要,到底redis有没用到家,这个问题就可以看出来。比如你redis只能存5G数据,可是你写了10G,那会删5G的数据。怎么删的,这个问题思考过么?还有,你的数据已经设置了过期时间,但是时间到了,内存占用率还是比较高,有思考过原因么?
    回答:
    redis采用的是定期删除+惰性删除策略。
    为什么不用定时删除策略?
    定时删除,用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源。在大并发请求下,CPU要将时间应用在处理请求,而不是删除key,因此没有采用这一策略.
    定期删除+惰性删除是如何工作的呢?
    定期删除,redis默认每个100ms检查,是否有过期的key,有过期key则删除。需要说明的是,redis不是每个100ms将所有的key检查一次,而是随机抽取进行检查(如果每隔100ms,全部key进行检查,redis岂不是卡死)。因此,如果只采用定期删除策略,会导致很多key到时间没有删除。
    于是,惰性删除派上用场。也就是说在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除。
    采用定期删除+惰性删除就没其他问题了么?
    不是的,如果定期删除没删除key。然后你也没即时去请求key,也就是说惰性删除也没生效。这样,redis的内存会越来越高。那么就应该采用内存淘汰机制。
    在redis.conf中有一行配置

    # maxmemory-policy volatile-lru

    该配置就是配内存淘汰策略的(什么,你没配过?好好反省一下自己)
    1)noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。应该没人用吧。
    2)allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。推荐使用,目前项目在用这种。
    3)allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。应该也没人用吧,你不删最少使用Key,去随机删。
    4)volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。这种情况一般是把redis既当缓存,又做持久化存储的时候才用。不推荐
    5)volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。依然不推荐
    6)volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。不推荐
    ps:如果没有设置 expire 的key, 不满足先决条件(prerequisites); 那么 volatile-lru, volatile-random 和 volatile-ttl 策略的行为, 和 noeviction(不删除) 基本上一致。

     

    6、redis和数据库双写一致性问题

    分析:一致性问题是分布式常见问题,还可以再分为最终一致性和强一致性。数据库和缓存双写,就必然会存在不一致的问题。答这个问题,先明白一个前提。就是如果对数据有强一致性要求,不能放缓存。我们所做的一切,只能保证最终一致性。另外,我们所做的方案其实从根本上来说,只能说降低不一致发生的概率,无法完全避免。因此,有强一致性要求的数据,不能放缓存。
    回答:《分布式之数据库和缓存双写一致性方案解析》给出了详细的分析,在这里简单的说一说。首先,采取正确更新策略,先更新数据库,再删缓存。其次,因为可能存在删除缓存失败的问题,提供一个补偿措施即可,例如利用消息队列。

     

    7、如何应对缓存穿透和缓存雪崩问题

    分析:这两个问题,说句实在话,一般中小型传统软件企业,很难碰到这个问题。如果有大并发的项目,流量有几百万左右。这两个问题一定要深刻考虑。
    回答:如下所示
     

    缓存穿透,即黑客故意去请求缓存中不存在的数据,导致所有的请求都怼到数据库上,从而数据库连接异常。
     

    解决方案:
    (一)利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试
    (二)采用异步更新策略,无论key是否取到值,都直接返回。value值中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。需要做缓存预热(项目启动前,先加载缓存)操作。
    (三)提供一个能迅速判断请求是否有效的拦截机制,比如,利用布隆过滤器,内部维护一系列合法有效的key。迅速判断出,请求所携带的Key是否合法有效。如果不合法,则直接返回。
     

    缓存雪崩,即缓存同一时间大面积的失效,这个时候又来了一波请求,结果请求都怼到数据库上,从而导致数据库连接异常。
     

    解决方案:
    (一)给缓存的失效时间,加上一个随机值,避免集体失效。
    (二)使用互斥锁,但是该方案吞吐量明显下降了。
    (三)双缓存。我们有两个缓存,缓存A和缓存B。缓存A的失效时间为20分钟,缓存B不设失效时间。自己做缓存预热操作。然后细分以下几个小点

    • I 从缓存A读数据库,有则直接返回

    • II A没有数据,直接从B读数据,直接返回,并且异步启动一个更新线程。

    • III 更新线程同时更新缓存A和缓存B。

     

    8、如何解决redis的并发竞争key问题

    分析:这个问题大致就是,同时有多个子系统去set一个key。这个时候要注意什么呢?大家思考过么。需要说明一下,博主提前百度了一下,发现答案基本都是推荐用redis事务机制。博主不推荐使用redis的事务机制。因为我们的生产环境,基本都是redis集群环境,做了数据分片操作。你一个事务中有涉及到多个key操作的时候,这多个key不一定都存储在同一个redis-server上。因此,redis的事务机制,十分鸡肋。
     

    回答:如下所示
    (1)如果对这个key操作,不要求顺序
    这种情况下,准备一个分布式锁,大家去抢锁,抢到锁就做set操作即可,比较简单。
    (2)如果对这个key操作,要求顺序
    假设有一个key1,系统A需要将key1设置为valueA,系统B需要将key1设置为valueB,系统C需要将key1设置为valueC.
    期望按照key1的value值按照 valueA-->valueB-->valueC的顺序变化。这种时候我们在数据写入数据库的时候,需要保存一个时间戳。假设时间戳如下

    系统A key 1 {valueA  3:00}
    系统B key 1 {valueB  3:05}
    系统C key 1 {valueC  3:10}

    那么,假设这会系统B先抢到锁,将key1设置为{valueB 3:05}。接下来系统A抢到锁,发现自己的valueA的时间戳早于缓存中的时间戳,那就不做set操作了。以此类推。

    其他方法,比如利用队列,将set方法变成串行访问也可以。总之,灵活变通。

     

    总结

    本文对redis的常见问题做了一个总结。大部分是博主自己在工作中遇到,以及以前面试别人的时候,爱问的一些问题。另外,不推荐大家临时抱佛脚,真正碰到一些有经验的工程师,其实几下就能把你问懵。最后,希望大家有所收获吧。

    作者:孤独烟

    来自:http://rjzheng.cnblogs.com/

    阿里云1折优惠链接:https://www.aliyun.com/minisite/goods?userCode=8hemam4l

    展开全文
  • 所以,代码一定要有备份控制。每个人都要有自己的备份,然后到达一个可发布或者进行大型测试的版本的时候,要把这个版本朝公司的备份器上上传一份,同时做好说明工作。   然后就是开发环境问题,开发了一个东西,...

    前一段,公司另外一组改代码,开始很顺利,后来发现路走偏了,幸好有SVN,可以从中间某个节点继续前进。所以,代码一定要有备份控制。每个人都要有自己的备份,然后到达一个可发布或者进行大型测试的版本的时候,要把这个版本朝公司的备份器上上传一份,同时做好说明工作。

     

    然后就是开发环境问题,开发了一个东西,然后参与开发人员都不知道开发环境的版本,崩溃……昨天下午实验性地探求公司服务器上的那个版本,结果没找到匹配……朝前要新装一个版本,然后写清楚配置环境的人员名单以及环境的出处,具体版本,官网连接等。不然以后开发还是有问题。目前正在跟客户谈这个问题,因为客户那头用我们的patch给内核打补丁老是出错,所以,版本啊,还是版本问题。一定要先弄清楚了。

    展开全文
  • 东南大学,里边各种图像处理的简介和完整源代码,还有这些代码的处理结果。如 图像变换、边缘检测、图像增强等。。。 还有我们东南大学做的习题,一定要给好评,重复下载扣分
  • 1、为什么使用redis 分析:博主觉得在项目中使用...如下图所示,我们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应..

    1、为什么使用redis

     

    分析:博主觉得在项目中使用redis,主要是从两个角度去考虑:性能并发。当然,redis还具备可以做分布式锁等其他功能,但是如果只是为了分布式锁这些其他功能,完全还有其他中间件(如zookpeer等)代替,并不是非要使用redis。因此,这个问题主要从性能和并发两个角度去答。

     

    回答:如下所示,分为两点


    (一)性能
    如下图所示,我们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应

    题外话:忽然想聊一下这个迅速响应的标准。其实根据交互效果的不同,这个响应时间没有固定标准。不过曾经有人这么告诉我:"在理想状态下,我们的页面跳转需要在瞬间解决,对于页内操作则需要在刹那间解决。另外,超过一弹指的耗时操作要有进度提示,并且可以随时中止或取消,这样才能给用户最好的体验。"


    那么瞬间、刹那、一弹指具体是多少时间呢?


    根据《摩诃僧祗律》记载

    一刹那者为一念,二十念为一瞬,二十瞬为一弹指,二十弹指为一罗预,二十罗预为一须臾,一日一夜有三十须臾。
     

    那么,经过周密的计算,一瞬间为0.36 秒,一刹那有 0.018 秒.一弹指长达 7.2 秒。


    (二)并发


    如下图所示,在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问数据库。

     

    2、使用redis有什么缺点

     

    分析:大家用redis这么久,这个问题是必须要了解的,基本上使用redis都会碰到一些问题,常见的也就几个。


    回答:主要是四个问题
    (一)缓存和数据库双写一致性问题
    (二)缓存雪崩问题
    (三)缓存击穿问题
    (四)缓存的并发竞争问题
    这四个问题,我个人是觉得在项目中,比较常遇见的,具体解决方案,后文给出。

     

     

    3、单线程的redis为什么这么快

     

    分析:这个问题其实是对redis内部机制的一个考察。其实根据博主的面试经验,很多人其实都不知道redis是单线程工作模型。所以,这个问题还是应该要复习一下的。


    回答:主要是以下三点
    (一)纯内存操作
    (二)单线程操作,避免了频繁的上下文切换
    (三)采用了非阻塞I/O多路复用机制

     

    题外话:我们现在要仔细的说一说I/O多路复用机制,因为这个说法实在是太通俗了,通俗到一般人都不懂是什么意思。博主打一个比方:小曲在S城开了一家快递店,负责同城快送服务。小曲因为资金限制,雇佣了一批快递员,然后小曲发现资金不够了,只够买一辆车送快递。


    经营方式一
    客户每送来一份快递,小曲就让一个快递员盯着,然后快递员开车去送快递。慢慢的小曲就发现了这种经营方式存在下述问题

    • 几十个快递员基本上时间都花在了抢车上了,大部分快递员都处在闲置状态,谁抢到了车,谁就能去送快递

    • 随着快递的增多,快递员也越来越多,小曲发现快递店里越来越挤,没办法雇佣新的快递员了

    • 快递员之间的协调很花时间

    综合上述缺点,小曲痛定思痛,提出了下面的经营方式


    经营方式二
    小曲只雇佣一个快递员。然后呢,客户送来的快递,小曲按送达地点标注好,然后依次放在一个地方。最后,那个快递员依次的去取快递,一次拿一个,然后开着车去送快递,送好了就回来拿下一个快递。

     

    对比
    上述两种经营方式对比,是不是明显觉得第二种,效率更高,更好呢。在上述比喻中:

    • 每个快递员---------->每个线程

    • 每个快递------------>每个socket(I/O流)

    • 快递的送达地点------>socket的不同状态

    • 客户送快递请求------>来自客户端的请求

    • 小曲的经营方式------>服务端运行的代码

    • 一辆车--------------->CPU的核数

     

    于是我们有如下结论
    1、经营方式一就是传统的并发模型,每个I/O流(快递)都有一个新的线程(快递员)管理。
    2、经营方式二就是I/O多路复用。只有单个线程(一个快递员),通过跟踪每个I/O流的状态(每个快递的送达地点),来管理多个I/O流。

    下面类比到真实的redis线程模型,如图所示

    参照上图,简单来说,就是。我们的redis-client在操作的时候,会产生具有不同事件类型的socket。在服务端,有一段I/0多路复用程序,将其置入队列之中。然后,文件事件分派器,依次去队列中取,转发到不同的事件处理器中。


    需要说明的是,这个I/O多路复用机制,redis还提供了select、epoll、evport、kqueue等多路复用函数库,大家可以自行去了解。

     

     

    4、redis的数据类型,以及每种数据类型的使用场景

     

    分析:是不是觉得这个问题很基础,其实我也这么觉得。然而根据面试经验发现,至少百分八十的人答不上这个问题。建议,在项目中用到后,再类比记忆,体会更深,不要硬记。基本上,一个合格的程序员,五种类型都会用到。


    回答:一共五种


    (一)String
    这个其实没啥好说的,最常规的set/get操作,value可以是String也可以是数字。一般做一些复杂的计数功能的缓存。


    (二)hash
    这里value存放的是结构化的对象,比较方便的就是操作其中的某个字段。博主在做单点登录的时候,就是用这种数据结构存储用户信息,以cookieId作为key,设置30分钟为缓存过期时间,能很好的模拟出类似session的效果。


    (三)list
    使用List的数据结构,可以做简单的消息队列的功能。另外还有一个就是,可以利用lrange命令,做基于redis的分页功能,性能极佳,用户体验好。


    (四)set
    因为set堆放的是一堆不重复值的集合。所以可以做全局去重的功能。为什么不用JVM自带的Set进行去重?因为我们的系统一般都是集群部署,使用JVM自带的Set,比较麻烦,难道为了一个做一个全局去重,再起一个公共服务,太麻烦了。


    另外,就是利用交集、并集、差集等操作,可以计算共同喜好,全部的喜好,自己独有的喜好等功能


    (五)sorted set
    sorted set多了一个权重参数score,集合中的元素能够按score进行排列。可以做排行榜应用,取TOP N操作。sorted set可以用来做延时任务。最后一个应用就是可以做范围查找

     

    5、redis的过期策略以及内存淘汰机制

     

    分析:这个问题其实相当重要,到底redis有没用到家,这个问题就可以看出来。比如你redis只能存5G数据,可是你写了10G,那会删5G的数据。怎么删的,这个问题思考过么?还有,你的数据已经设置了过期时间,但是时间到了,内存占用率还是比较高,有思考过原因么?
     

    回答:
    redis采用的是定期删除+惰性删除策略。


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


    定期删除+惰性删除是如何工作的呢?
    定期删除,redis默认每个100ms检查,是否有过期的key,有过期key则删除。需要说明的是,redis不是每个100ms将所有的key检查一次,而是随机抽取进行检查(如果每隔100ms,全部key进行检查,redis岂不是卡死)。因此,如果只采用定期删除策略,会导致很多key到时间没有删除。


    于是,惰性删除派上用场。也就是说在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除。


    采用定期删除+惰性删除就没其他问题了么?
    不是的,如果定期删除没删除key。然后你也没即时去请求key,也就是说惰性删除也没生效。这样,redis的内存会越来越高。那么就应该采用内存淘汰机制


    在redis.conf中有一行配置

    # maxmemory-policy volatile-lru
     

    该配置就是配内存淘汰策略的(什么,你没配过?好好反省一下自己)
    1)noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。应该没人用吧。
    2)allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。推荐使用,目前项目在用这种。
    3)allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。应该也没人用吧,你不删最少使用Key,去随机删。
    4)volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。这种情况一般是把redis既当缓存,又做持久化存储的时候才用。不推荐
    5)volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。依然不推荐
    6)volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。不推荐
    ps:如果没有设置 expire 的key, 不满足先决条件(prerequisites); 那么 volatile-lru, volatile-random 和 volatile-ttl 策略的行为, 和 noeviction(不删除) 基本上一致。

     

     

    6、redis和数据库双写一致性问题

     

    分析:一致性问题是分布式常见问题,还可以再分为最终一致性和强一致性。数据库和缓存双写,就必然会存在不一致的问题。答这个问题,先明白一个前提。就是如果对数据有强一致性要求,不能放缓存。我们所做的一切,只能保证最终一致性。另外,我们所做的方案其实从根本上来说,只能说降低不一致发生的概率,无法完全避免。因此,有强一致性要求的数据,不能放缓存。


    回答:首先,采取正确更新策略,先更新数据库,再删缓存。其次,因为可能存在删除缓存失败的问题,提供一个补偿措施即可,例如利用消息队列。

     

     

    7、如何应对缓存穿透和缓存雪崩问题

     

    分析:这两个问题,说句实在话,一般中小型传统软件企业,很难碰到这个问题。如果有大并发的项目,流量有几百万左右。这两个问题一定要深刻考虑。


    回答:如下所示


    缓存穿透,即黑客故意去请求缓存中不存在的数据,导致所有的请求都怼到数据库上,从而数据库连接异常。


    解决方案:
    (一)利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试
    (二)采用异步更新策略,无论key是否取到值,都直接返回。value值中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。需要做缓存预热(项目启动前,先加载缓存)操作。
    (三)提供一个能迅速判断请求是否有效的拦截机制,比如,利用布隆过滤器,内部维护一系列合法有效的key。迅速判断出,请求所携带的Key是否合法有效。如果不合法,则直接返回。


    缓存雪崩,即缓存同一时间大面积的失效,这个时候又来了一波请求,结果请求都怼到数据库上,从而导致数据库连接异常。


    解决方案:
    (一)给缓存的失效时间,加上一个随机值,避免集体失效。
    (二)使用互斥锁,但是该方案吞吐量明显下降了。
    (三)双缓存。我们有两个缓存,缓存A和缓存B。缓存A的失效时间为20分钟,缓存B不设失效时间。自己做缓存预热操作。然后细分以下几个小点

    • I 从缓存A读数据库,有则直接返回

    • II A没有数据,直接从B读数据,直接返回,并且异步启动一个更新线程。

    • III 更新线程同时更新缓存A和缓存B。

     

     

    8、如何解决redis的并发竞争key问题

     

    分析:这个问题大致就是,同时有多个子系统去set一个key。这个时候要注意什么呢?大家思考过么。需要说明一下,博主提前百度了一下,发现答案基本都是推荐用redis事务机制。博主不推荐使用redis的事务机制。因为我们的生产环境,基本都是redis集群环境,做了数据分片操作。你一个事务中有涉及到多个key操作的时候,这多个key不一定都存储在同一个redis-server上。因此,redis的事务机制,十分鸡肋。


    回答:如下所示
    (1)如果对这个key操作,不要求顺序
    这种情况下,准备一个分布式锁,大家去抢锁,抢到锁就做set操作即可,比较简单。
    (2)如果对这个key操作,要求顺序
    假设有一个key1,系统A需要将key1设置为valueA,系统B需要将key1设置为valueB,系统C需要将key1设置为valueC.
    期望按照key1的value值按照 valueA-->valueB-->valueC的顺序变化。这种时候我们在数据写入数据库的时候,需要保存一个时间戳。假设时间戳如下

    系统A key 1 {valueA  3:00}
    系统B key 1 {valueB  3:05}
    系统C key 1 {valueC  3:10}

    那么,假设这会系统B先抢到锁,将key1设置为{valueB 3:05}。接下来系统A抢到锁,发现自己的valueA的时间戳早于缓存中的时间戳,那就不做set操作了。以此类推。

    其他方法,比如利用队列,将set方法变成串行访问也可以。总之,灵活变通。

     

    9 总结

    本文对redis的常见问题做了一个总结。大部分是博主自己在工作中遇到,以及以前面试别人的时候,爱问的一些问题。另外,不推荐大家临时抱佛脚,真正碰到一些有经验的工程师,其实几下就能把你问懵。最后,希望大家有所收获吧。

    展开全文
  • 当然,redis还具备可以做分布式锁等其他功能,但是如果只是为了分布式锁这些其他功能,完全还有其他中间件(如zookpeer等)代替,并是非使用redis。因此,这个问题主要从性能和并发两个角度去答。回答:如下所示,...
  • 最近在尝试阅读各类书籍,学习专业知识,不断给自己施加一定压力并显得有些心急,反思自己收获了多少呢?...没有付出了时间/精力却发现结果不是自己想的?(之所以认为时间如此紧张,因为无论是...
  • 无论是个人还是贷款机构,当初怀着一颗善心去帮助别人,借钱给别人应急,可是结果呢,到了该还钱的时候却不见借钱人还钱的意思,当我们厚着脸皮去旁敲侧击的时候,往往会得到这样的答复:“再等...
  • 付出不一定收获

    2010-04-03 21:43:00
    每一回看到别人感叹付出不一定收获时,我都庆幸自己付出的都得到了收获。然而这一次,我真的觉得:付出不一定收获……我像是与某些东西格格不入,无论我挣扎得多辛苦,最终却落得个被嘲笑的下场。这次数模我...
  • 一、逆推思维VS分解思维-让你的设定的目标结果可以预期 二、换算思维VS成本思维-让你看透一切模式背后的秘密 三、送礼思维VS免费思维-让你更快速搞定最核心资源 四、农耕思维VS打猎思维-先慢后快的稳定盈利模式 五、...
  • 我自学已经半年多了,按道理说正常就应该就业了,现实情况是,我带着简历到处面试,去到哪里都没人收我,我反省了自己的原因,自己连最基本的搭建框架也熟练。 我在网上开始接Java开发的私活,特意挑选了没有...
  • 想要裸辞掉价,一定要这么做!

    千次阅读 2016-08-05 09:54:09
     近期,在前程无忧论坛(bbs.51job.com)上一份“裸辞”原因的调查,调查结果显示:因工资太低的比率占73.68%;因没有发展前景的比率占42.11%;因和上司与同事关系和的比率占21.05%;因上班
  • 我用很多的时间把你照顾好了,我的事业就发展的慢了,在不久的将来我们的结果还是因为我满足了你 的要求而分开。 现在分开了,我就更多的时间来做我的事,希望我的事业发展会比你发展新男朋友快......
  • 可见大家对公平是很看重的,但是为什么生活中很多看似公平的事情,大家却都能心平气和的接受呢? 比如:张三和李四犯了同样的罪,法官说坦白从宽,抗拒从严。张三全部坦白交代,成功减刑,李四就是认罪,...
  • 导语:为什么会碎片化健身的出现呢,因为现在很多人的工作都是办公室...但是这一类的健身方式可能对于缓解疲劳亚健康是有一定的效果的,但是想真正减肥,增加肌肉的健身人士来说,碎片化减肥的方式用处并是...
  • 很多小伙伴想学好python,但是又知道如何下手,这里,我这边给小伙伴们推荐一本书,希望可以帮到大家, 今天,我跟大家介绍一本专门针对数据预处理的书籍,书名是《数据预处理从入门到实战:基于SQL、R、Python》...
  • 一句妈卖批,我一定要讲。

    千次阅读 2017-03-02 10:53:27
    故事从一个bug开始,客户反应很多网页打开。就像下面这个样子。为了这个bug,整个团队都在测试。症状就是:同样的地址,PC能打开...结果今天又一个网页出现这种情况,于是我开始抓包,发现了很多原来网页没有的请求
  • 一则报道,美国一家调查机构在全世界20个国家调查人们的快乐水平,结果是美国人的快乐水平最高,46%的人对基本生活感到快乐,其次是印度,37%印度人乐呵呵生活着。中国人的快乐水平最低位列榜尾,只有9%的人感到...
  • 好久没写东西了,生病了什么都想做,想工作想背单词想出门想动弹想写Blog想说话。。。。这两天终于好一点了,生活也...发烧腹泻都没有了,但是嗓子一直难受,怎么疼了但是一直痰堵着,很舒服,

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,984
精华内容 2,393
关键字:

不一定要有结果