缓存预热 + 缓存雪崩 + 缓存击穿 + 缓存穿透缓存预热什么是预热?缓存预热就是系统上线后,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!解决方法使用 @PostConstruct 初始化白名单数据缓存雪崩缓存雪崩就是瞬间过期数据量太大,导致对数据库服务器造成压力。发生redis 主机挂了, Redis全盘崩溃,偏硬件运维redis 中有大量key 同时过期大面积失效,偏软件开发如何预防redis中key设置为永久不过期or过期时间错开redis缓存集群实现高可用主从 + 哨兵Redis 集群开启Redis 持久化机制 aof / rdb,尽快恢复缓存集群多缓存结合预防雪崩ehcache 本地缓存 + redis缓存服务降级Hystrix或者阿里sentinel限流&降级缓存穿透缓存穿透 就是请求去查询一条数据,先查redis,redis里面没有,再查mysql,mysql里面无,都查询不到该条记录,但是请求每次都会打到数据库上面去,导致后台数据库压力暴增解决方案空对象缓存或者缺省值 ---但是还
布隆过滤器什么是布隆过滤器由一个初值为零的bit数组和多个哈希函数构成,用来快速判断集合中是否存在某个元素布隆过滤器是一种类似set的数据结构,只是统计结果在巨量数据下有点小瑕疵,不够完美特点高效地插入和查询,占用空间少,返回的结果是不确定性+不够完美。重点:一个元素如果判断结果:存在时,元素不一定存在(存在hash冲突),但是判断结果为不存在时,则一定不存在。布隆过滤器可以添加元素,但是不能删除元素,由于涉及hashcode判断依据,删除元素会导致误判率增加。底层原理添加key时使用多个hash函数对key进行hash运算得到一个整数索引值,对位数组长度进行取模运算得到一个位置,每个hash函数都会得到一个不同的位置,将这几个位置都置1就完成了add操作。查询key时只要有其中一位是0就表示这个key不存在,但如果都是1,则不一定存在对应的key。查询某个变量的时候我们只要看看这些点是不是都是1,就可以大概率知道集合中有没有它了如果这些点,有任何一个为零则被查询变量一定不在,如果都是1,则被查询变量很可能存在,为什么说是可能存在,而不是一定存在呢?那是因为映射函数本身就是散列函数,散
Redis的双写一致性问题你只要用缓存,就可能会涉及到redis缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,谈谈自己对双写一致性的理解!双写一致性的了解。如果redis中有数据----需要和数据库中的值相同如果redis中无数据----需要数据库中的值要是最新值,且准备回写redis缓存按照操作分,细分2种----只读缓存||读写缓存同步直写策略---写数据库后也同步写redis缓存,缓存和数据库中的数据一致;对于读写缓存来说,要想保证缓存和数据库中的数据一致,就要采用同步致谢策略。异步缓写策略---正常的业务运行中,mysql数据变动了,但是可以在业务上容许出现一定时间后才作用于redis,比如仓库,物流系统;异常情况出现了,不得不将失败的动作重新修补,有可能需要借助kafka或者RabbitMQ等消息中间件,实现重视重写。那么你如何解决一致性问题?双检加锁策略多个线程同时去查询数据库的这条数据,那么我们可以在第一个查询数据的请求上使用一个互斥锁来锁住它。其他的线程走到这一步拿不到锁就等着,等第一个线程查询到了数据,然后做缓存。后面的线程进来发现已经有缓存了,就
BigKey100w数据导入redis生产中不允许Key *生产上限制keys */flushdb/flushall等危险命令以防止误删误用?通过配置设置禁用这些命令,redis.conf在SECURITY这一项中可以用 scan命令-----Scan命令用于迭代数据库中的数据库键语法SACN cursor [MATCH pattern] [COUNT count]cursor-游标 pattern-匹配的模式 count-指定从数据表返回多少元素,默认值为10 基于游标的迭代器,需要基于上一次的游标延续之前的迭代过程以O作为游标开始一次新的迭代,直到命令返回游标0完成一次遍历不保证每次执行都返回某个给定数量的元素,支持模糊查询一次返回的数量不可控,只能是大概率符合count参数什么算大KeyString 是value 最大512MB但是≥10KB就是BigKeylsit、hash、set和zset,个数超过5000就是bigKey带来的危害内存不均,集群迁移困难超时删除,大Key删除作梗网络流量阻塞如何发现MEMORY USAGE 键如何删除---阿里巴巴开发手册渐
Redis到底是单线程还是多线程?这种说法有些不严谨!!! 考虑到版本上的问题版本3.x最早的版本:redis是单线程!redis4.x之后才支持多线程,直到redis6/7才稳定Redis是单线程 主要是指Redis的网络IO和键值对读写是由一个线程来完成的,Redis在处理客户端请求时包括获取(socket读)、解析、执行、内容返回(socket写)等都是由一个顺序串行的主线程处理,这就是所谓的"单线程"。这也是Redis对外提供键值对存储服务的主要流程。但Redis的其他功能,比如持久化RD、AOF、异步删除、集群数据同步等等,其实是由额外的线程执行的。Redis命令工作线程是单线程的,但是,整个Redis来说,是多线程的;Redis3.x单线程时代性能依旧快的原因基于内存操作:Redis的所有数据都存在内存中,因此所有的运算都是内存级别的,所以它的性能比较高。数据结构简单:Redis的数据结构时专门设计的,而这些简单的数据结构的查找和操作的时间大部分复杂度都是O(1),因此性能比较高。多路复用和非阻塞IO:Redis使用I/O的多路复用功能来监听第一个Socket连接客
ZzRG
状态 统计 图床 • •