前言夏天很热,没有风。从空调房到接近40度的高温,这个过程,缓存预热明白了……为什么要用缓存?因为追求性能,因为追求极致的用户体验。缓存理论1.缓存适用于场景缓存,就是把一些需要读取的数据放在磁盘或者内存中。因为追求速度,所以一般都放在内存中。读取数据时,一般都是从关系型数据库中读取数据,也可以在数据库层面进行各种优化。比如读性能不够,可以增加几个从库,使数据库一主多从;例如如果写性能不够,可以把数据库分表。在某些场景下,因为无法解决读取速度问题,所以使用了缓存。比如count(*)这个操作,在数据库层面无论怎么优化都无法提升;还有一个就是SQL的执行本身就必须消耗大量的资源和时间,比如各种关联查询的子查询,这些时候可以把这些数据放在缓存中,从而大大减轻数据库的压力。2、缓存穿透的问题在使用缓存的时候,第一个问题就是缓存穿透的问题,即使用缓存和不使用缓存是一样的。应用查询缓存中的数据,发现没有数据,再去数据库查询,这里,缓存被穿透了,缓存没有起到保护数据库的作用。爬虫在爬取网页时,会爬取每个页面,而对于缓存的页面数据,一般只缓存热点数据,即缓存前几个页面的数据,如果全部爬取,会造成缓存丢失,导致查询数据库;还有一种就是故意去搜索一些不存在的关键词,而这些搜索的结果是没有数据的,数据库中也没有数据,造成缓存穿透。这种解决方案是:当用户第一次查询发现结果为空时,可以将结果放入缓存,并设置一个较短的过期时间来缓解穿透问题;数据只能监控,访问的IP还是只能缓解,不能彻底解决。3、缓存雪崩问题缓存雪崩是指当缓存失效时,系统性能会急剧下降,导致数据库不可用,系统挂掉。缓存中最关键的部分是内存。当内存满了,就会有各种策略让缓存失效。在分布式环境下,如果一个缓存失效了,恰好这个缓存是一个热点数据,前端有10个应用。都需要访问这个缓存,如果TPS高,那么所有线程都会访问数据库,直接拖垮数据库。应对缓存雪崩的策略有很多种。例如,您可以设置两个具有不同过期时间的缓存键。当key1过期时,访问key2,然后更新key1和key2;可以使用分布式锁,这样当应用程序发现缓存失效后,获取锁的线程会更新缓存;您可以使用消息通知机制。当应用程序发现缓存无效时,会发送消息,然后后台线程会更新缓存。后台线程会检查缓存中是否有缓存。如果它存在,它不会更新它。;专门用一个后台线程来更新缓存,快速检测缓存是否存在,然后更新缓存,也可以解决缓存不一致的问题。4、缓存命名和过期时间使用缓存时,需要一个key,那么key如何命名呢?如果key太长,会占用内存,会减少缓存中可以存放的数据;key的一般命名规则可以是SQL:1782,表示这是缓存一条SQL的结果,然后用冒号隔开,然后表示为缓存的编号,可以是各种hash结果SQL条件。这种命名规则的好处是每次在缓存中查询时都可以使用通配符,这样就可以查询到系统中有多少个缓存。缓存的过期时间与业务强相关。对于一些时效性高的数据,是不能放在缓存中的。对于一些不经常变化的数据,可以放在缓存中。比如某天,缓存主要是为了读。多写应用,让大部分数据,比如搜索结果中的分页数据,不需要太实时,可以放在缓存中。..主要看业务的承受能力,也会影响一部分用户体验。可能我已经放到缓存里了,更新了,刷新了,但是还没有更新。5.缓存预热和缓存热点问题缓存预热,当系统宕机刚启??动时,所有的流量都涌进来,但是此时缓存中没有任何缓存的数据,可能会直接压垮数据库,这样当应用程序启动后,预热缓存最简单的方法就是点击界面,然后搜索结果;最好的方法是编写一个后台线程来预热缓存。在这个后台线程中,所有常用的热点数据都会直接进入缓存。缓存热点,在使用缓存集群时,如果缓存分布出现问题,那么可能有一台缓存服务器承担了大部分压力,而其他缓存服务器没有压力,也可能造成缓存雪崩。摧毁一台缓存服务器,上线,再压垮另一台,死循环。..缓存数据时,需要分析热点数据和缓存数据的大小,否则无论是网络还是内存,都可能造成缓存雪崩的潜在影响点。Redis主备reids是key-value存储的内存缓存或者持久化存储。使用redis作为缓存很简单。而redis此时不需要持久化机制,直接在容器中使用即可。两条命令运行一个redis主从缓存。配置文件使用默认的配置文件。修改master配置文件中的bind即可。在slave配置文件中,修改bind和slaveof。如何检测redis是否正常?使用容器运行测试redis功能,执行效果如下:使用testredis容器运行测试任务。正常情况下,容器的exitcode为0,当redis异常时,容器的exitcode为1,以便在生产中进行功能测试。当然你也可以进行自动修复,比如拉起失效的redis容器。检测脚本内容:运行测试容器时需要注意必须使用宿主机的网络,如下图:以后要运行测试容器时,只需要启动容器即可。对这种流程进行了优化,比如使用脚本直接创建master、slave和test容器,进一步将master和slave分布在不同的机器上,进一步直接创建sentinel进行自动切换和failover,以及直接创建rediscluster模式.使用configrewrite写配置文件时,注意selinux可能会阻止你写配置文件。当使用的缓存策略为noeviction时,一旦可用内存用完,就会显示OOM,内存超过最大使用内存。默认配置不使用LRU算法。检查key数量的时候,记住key是高危指令,会阻塞所有请求,影响生产环境的服务,你信不信?在生产中尝试一下,命令是keys*。查看大量key时,使用scan命令每次返回一个游标,相当于分页查看。dumping的时候不要用save命令,记得用bgsave和bgrewriteaof,这两个虽然不会阻塞服务,实际上会阻塞,但是时间很短,主要花在fork上,400ms了解一下...fork一般需要多少ms?解决八卦缓存命中率?不可能的。..这辈子都不可能撞到……我依稀记得有人挑战我,但我忘了是个什么样的问题。事实上,你是否防守并不重要。如果你不为自己的观点辩护,那就是在暴露对方的无知。如果你为我自己的观点辩护,你就会暴露自己的无知。当然,我通常是先表现出自己的无知,这样才能引入新奇的观点,否则一无所获。再来说说自动化运维。有人说你在尝试为这两个命令编写一个界面和一个按钮。有趣吗?有趣,相当有趣。防止误操作是主要功能。自动化平台承担大部分责任,封装所有高危操作指令,并可进行二次确认。权限控制,这个谁能用谁不能用。一台机器有两条指令,试试三台机器,三百台机器,三千台机器?有时候,觉得思维层次不一样,不想解释。解释是为了掩盖一个缓存系统。我可以玩多久?可以玩很久。一个系统,里面包含了无数个小系统,缓存系统?可以用redis和memcache,怎么选?一个系统包含了无数的知识点。Redis是单进程单线程服务,那么什么会阻塞服务呢?client请求时tcp连接已满怎么办?参数backlop是否响应增加?一个追求高可用和高性能的系统会引入其他组件,比如使用sentinel实现高可用,使用rediscluster搭建,使用各种前端中间件等。系统配置包括各种东西。redis的持久化有两种,一种是rdb,一种是aof。有什么区别,哪个更好?持久化会不会丢失数据?数据丢失多长时间是可以接受的?一个系统的组成,各种方式,如何进行主备复制?sentinel如何检测master是否宕机?为什么哨兵使用3个或5个节点?子子孙孙无穷无尽,也许很多次,你都不会遇到这样的场景吧?高并发,不可能,这辈子不可能,没有风,备用知识命中率,找出来。
