zoukankan      html  css  js  c++  java
  • redis的优点和缺点

    优点:

    redis是一个key_value存储库,数据保存在内存中,可以承受高并发读写
    redis支持多种特性,如 事务 主从 key过期策略 订阅-发布
    支持多种数据类型
    单线程处理客户端请求,节省了上下文切换时间,但是同样也会不能充分利用多核处理器的优点

    缺点
    因为数据是保存在内存中的,所以会收机器内存大小的限制
    当key过期策略设置不当,或者数据爆发时,可能会导致redis崩溃,需要合理配置key过期策略,哨兵模式以及内存持久化策略
    当增加redis从机时,需要从主机同步全部数据,占用大量io


    key过期策略
      定期删除 每隔指定时间,随机抽取设定了过期的key,如果过期则删除
      惰性删除 当请求是判断key是否过期,过期删除,什么都不返回
    内存持久化策略:
      rdb:在达到 指定的时间间隔和变化次数 将内存中数据持久化存储到硬盘中
      aof:记录redis的每一次变化,并将数据追加到硬盘文件中,因为记录了数据的每一次追加,所以文件会比rdb的要大,性能也要差一些
        对于aof文件大的问题,当文件达到一定大小时,会触发rewrite,即从内存中重新持久化一份最新数据,丢弃之前的变化。
        比如 a:a1;a:a2;a:a3 aof会保存每一个变化指令,重写后,只包含最新数据,不再有变化记录
        因为重写机制的存在,所以要合理配置 文件重写的大小
    哨兵模式:
      redis会启用一个进程监控redis主从库,当redis主库挂掉的时候,会对从库进行选举,选举得分高的从库,将变成主库

    当redis做关系型数据库的缓存时,可能会出现下面问题,
      缓存穿透:当用户请求一个不存在的数据,请求会直接穿过redis,请求到rdb中,redis起不到缓存的作用,当请求很多时,数据库压力会变大
      缓存击穿:当redis中key存在,但是已经过期,大量并发请求也会直接穿透内存,请求到rdb,并缓存到redis,并发量很大时,后端数据库,可能会被压垮
      缓存雪崩:当redis中大量key在同一时间段失效,或者服务重启,也会给后端数据库,带来很大压力


      解决办法:
        1.对后端数据库的请求,加锁和队列,保证即使雪崩出现,也不会把数据库压垮

        2.将热点数据的失效时间 分散开,在原有的失效时间上,再加上随机数,保证不会有大量数据在同一时间段失效

        3.热点数据还可以设置成永不失效

        4.异步更新,即及时缓存中不存在,也返回,另起一个线程定时更新缓存数据库

        5.使用过滤器,进行请求拦截,维护一个很大的队列,保存有数据库中所有可能存在的key,如果请求key不在队列里,直接返回

        6.缓存空数据,请求的key即使为空,也可以缓存到redis中,并设置适当的缓存时间

      

    由于同步的存在,所以 后端数据库和缓存数据库,是不能保证一定一致的,如果业务需求要求强一致性需求的数据,那么就不能使用缓存

  • 相关阅读:
    让程序在后台长久运行的方法
    unrecognized selector sent to instance的定位
    CocoaLumberjack调试的简单使用
    #pragma
    __bridge __bridge_retained __bridge_transfer
    关于c#继承
    C#__ 模拟鼠标单击事件
    C# 调用win api获取chrome浏览器中地址
    认识安卓
    源码解析-Volley(转自codeKK)
  • 原文地址:https://www.cnblogs.com/BigWrite/p/14475760.html
Copyright © 2011-2022 走看看