首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏Kirin博客

    python 文件刷新缓存

    带来的问题是,进程如果是被杀死的时候,最后一条结果总是缺损的,因为缓存的部分还未写入文件。 解决办法是每次写入文件时,都刷新缓存,直接将缓存数据全部写入文件: fi = open('file', 'wb') fi.write('strs') fi.flush() ...

    3.1K10发布于 2021-03-11
  • 来自专栏全栈程序员必看

    缓存穿透、缓存并发、缓存雪崩、缓存抖动、热点缓存缓存一致性等问题…

    对于高并发的业务场景,常用的技术手段包括黑白名单、限流防刷、熔断降级、兜底、线程隔离、多级缓存(客户端、CDN、NGINX、内存缓存、分布式缓存)等等。 本文总结了缓存方案需要考虑的几个问题。 第一,关于缓存穿透,是指大量访问缓存和数据库中都不存在的数据。 第三,关于缓存雪崩,是指某一时刻大量缓存同时失效,导致请求全部打到DB。 可以采用三种方案:缓存过期时间随机化、多级缓存(不同级别缓存对应不同的失效时间)、缓存永不过期; 第四,关于缓存抖动,一般是指由于某个缓存节点故障导致该节点上的缓存数据不可用。 第六、关于缓存一致性问题,是指数据写入请求需要写数据库并更新缓存,需要处理双的一致性问题。

    1K20编辑于 2022-07-19
  • 来自专栏码农编程进阶笔记

    缓存穿透、缓存并发、缓存雪崩、缓存抖动、热点缓存缓存一致性等问题

    对于高并发的业务场景,常用的技术手段包括黑白名单、限流防刷、熔断降级、兜底、线程隔离、多级缓存(客户端、CDN、NGINX、内存缓存、分布式缓存)等等。 本文总结了缓存方案需要考虑的几个问题。 第一,关于缓存穿透,是指大量访问缓存和数据库中都不存在的数据。 第三,关于缓存雪崩,是指某一时刻大量缓存同时失效,导致请求全部打到DB。 可以采用三种方案:缓存过期时间随机化、多级缓存(不同级别缓存对应不同的失效时间)、缓存永不过期; 第四,关于缓存抖动,一般是指由于某个缓存节点故障导致该节点上的缓存数据不可用。 第六、关于缓存一致性问题,是指数据写入请求需要写数据库并更新缓存,需要处理双的一致性问题。

    86960发布于 2021-07-20
  • 来自专栏Java学习录

    缓存淘汰、缓存穿透、缓存击穿、缓存雪崩、数据库缓存一致性

    缓存淘汰 为什么需要缓存淘汰?你需要缓存30G的数据,但是Redis本身只能使用10G的内存,那你就得做个取舍了,毕竟鱼与熊掌不可兼得。为了利益最大化肯定要保留最重要的10个G。 造成这种情况的原因如下: 系统设计不合理,缓存数据更新不及时 爬虫等恶意攻击 解决方案: 如果key在数据库中也不存在,那么就一个空值到Redis中,并设置一个过期时间,避免一直占用内存 查询缓存之前使用布隆过滤器拦截 解决方案: 使用互斥锁,同一时刻只允许一个线程去构建缓存,其他线程等待构建完毕后去缓存取 定时更新,假如缓存过期时间为60分钟,则单独设置一个线程每59分钟去负责更新缓存 缓存雪崩 由于Redis是基于内存的应用 Redis 的持久化机制 数据库缓存一致性 当一个数据需要更新时因为不可能做到同时更新数据库和缓存、那么此时读取数据的时候就一定会发生数据不一致问题,而数据不一致问题在金融交易领域的系统中是肯定不允许的 解决方案: 读的时候,先读缓存缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。 更新的时候,先更新数据库,然后再删除缓存。 参考自公众号:石杉的架构笔记

    2.2K20发布于 2019-05-10
  • 来自专栏波波烤鸭

    shiro教程8(缓存管理)

    缓存 为什么要使用缓存   在没有使用缓存的情况下,我们每次发送请求都会调用一次doGetAuthorizationInfo方法来进行用户的授权操作,但是我们知道,一个用户具有的权限一般不会频繁的修改, 也就是每次授权的内容都是一样的,所以我们希望在用户登录成功的第一次授权成功后将用户的权限保存在缓存中,下一次请求授权的话就直接从缓存中获取,这样效率会更高一些。 xml version="1.0" encoding="UTF-8"? 3 LRU,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。 当调用清空缓存方法后,再次请求的时候因为缓存已经空了,所以会再次授权, 场景: 权限修改生效后,立即刷新清空缓存,则可以实现用户不退出生效新的权限

    1.4K60发布于 2019-04-02
  • 来自专栏linux教程

    CentOS 8 清除 DNS 缓存

    nscd(Name Service Cache Daemon)是一种能够缓存 passwd、group、hosts 的本地缓存服务,分别对应三个源 /etc/passwd、/etc/hosts、/etc 这里利用 nscd 的 hosts 缓存服务来实现 清除 CentOS 8 Linux 下的 DNS 缓存。 清缓存命令: 有可能nscd没装,下面讲解一下,安装,启动,清缓存的命令 1. 启动nscd 服务后,清缓存 开启 nscd 的 hosts 缓存服务后,每次内部接口请求不会都发起 dns 解析请求,而是直接命中 nscd 缓存散列表,从而获取对应服务器 ip 地址,这样可以在大量内部接口请求时减少接口的响应时间

    4.1K10编辑于 2023-04-26
  • 来自专栏java一日一条

    Java也得了解CPU–CPU缓存

    原文出处: cnblogs - macemers CPU,一般认为C/C++的才需要了解,高级语言的(Java/C#/pathon…)并不需要了解那么底层的东西。 我一开始也是这么想的,但直到碰到LMAX的Disruptor,以及马丁的博文,才发现Java的,更加不能忽视CPU。经过一段时间的阅读,希望总结一下自己的阅读后的感悟。 有了上面对CPU的大概了解,我们来看看缓存行(Cache line)。缓存,是由缓存行组成的。一般一行缓存行有64字节(由上图”64-byte line size”可知)。 所以使用缓存时,并不是一个一个字节使用,而是一行缓存行、一行缓存行这样使用;换句话说,CPU存取缓存都是按照一行,为最小单位操作的。 这意味着,如果没有好好利用缓存行的话,程序可能会遇到性能的问题。 64位系统,Java数组对象头固定占16字节(未证实),而long类型占8个字节。所以16+8*6=64字节,刚好等于一条缓存行的长度: ?

    1.3K10发布于 2018-09-19
  • 来自专栏分享干货的你

    仿Spring Boot缓存注解@Cacheable 添加删除

    最近在使用springboot 的缓存注解的时候,发现挺好用的。这里我们就来仿一下。 1, 首先我们分析一下,要参数绑定,要做aop , 还要有redis的客户端。 这是删除redis的缓存, ? 这是添加redis的缓存aop 的 里面的实现 ? ? ? ? 里面很简单,就是根据参数解析器和词法分析器。 拿到参数值。 首先判断有没有,没有在重新set 进去, 有的话就从缓存里面拿。 我们在两个rest 接口测试一下 ? 启动工程,postmain 测试一下添加 ? 多试几次,看一下控制台 ? 在调用删除接口 ? 满足协议我们就能实现自己的redis客户端 , 首先我们这道redis 是底层是socket 通信的,我们一个socket 监听器 public static void main(String[] 我们这边仿一个redis的客户端试一下 public SimpleJedis() { try { socket = new Socket("xxxxxx

    1.2K30发布于 2021-04-06
  • 来自专栏Java后端技术栈cwnait

    缓存击穿!竟然不知道怎么代码???

    在Redis中有三大问题:缓存雪崩、缓存击穿、缓存穿透,今天我们来聊聊缓存击穿。 关于缓存击穿相关理论文章,相信大家已经看过不少,但是具体代码中是怎么实现的,怎么解决的等问题,可能就一脸懵逼了。 这也就是我们所说的缓存中的“缓存击穿”。 其实,你们项目如果并发量不是很高,也不用怕,并且我见过很多项目也就差不多是这么的,也没那么多事,毕竟只是第一次的时候可能会发生缓存击穿。 但,我们也不要抱着一个侥幸的心态去代码,既然是多线程导致的,估计很多人会想到锁,下面我们使用锁来解决。 改进版 既然使用到锁,那么我们第一时间应该关心的是锁的粒度。 第一步、缓存中不存在 第二步、查询数据库 第三步、由于数据库中不存在,以id为key,空对象为value放入缓存中 第四步、执行第一步,此时,缓存就存在了,只是这时候只是一个空对象。 因此他有如下三个使用场景: 网页爬虫对URL的去重,避免爬取相同的URL地址 反垃圾邮件,从数十亿个垃圾邮件列表中判断某邮箱是否垃圾邮箱(垃圾短信) 缓存击穿,将已存在的缓存放到布隆过滤器中,当黑客访问不存在的缓存时迅速返回避免缓存

    1.2K30发布于 2021-07-15
  • 来自专栏素质云笔记

    python︱markdown一样网页,代码快速生成web工具:streamlit 缓存(五)

    系列参考: python︱markdown一样网页,代码快速生成web工具:streamlit介绍(一) python︱markdown一样网页,代码快速生成web工具:streamlit 重要组件介绍(二) python︱markdown一样网页,代码快速生成web工具:streamlit 展示组件(三) python︱markdown一样网页,代码快速生成web工具:streamlit lay-out布局(四) python︱markdown一样网页,代码快速生成web工具:streamlit 缓存(五) python︱markdown一样网页,代码快速生成web工具:streamlit 缓存装饰器,它告诉Streamlit无论何时调用函数都需要检查以下几件事: The input parameters that you called the function with The value - Stores key → (output, output_hash) in the cache. 4 Returns the output. 1 不适用cache的方式 比如求指数,如果不缓存

    85020编辑于 2021-12-07
  • 来自专栏Redis原理与应用

    Redis应用—8.相关的缓存框架

    xml version="1.0" encoding="UTF-8" ? xml version="1.0" encoding="UTF-8"? xml version="1.0" encoding="UTF-8"? xml version="1.0" encoding="UTF-8" ? xml version="1.0" encoding="UTF-8"?

    43900编辑于 2025-03-07
  • 来自专栏北风IT之路

    用Java一个简单的缓存操作类

    前言 使用缓存已经是开发中老生常谈的一件事了,常用专门处理缓存的工具比如Redis、MemCache等,但是有些时候可能需要一些简单的缓存处理,没必要用上这种专门的缓存工具,那么自己一个缓存类最合适不过了 然后再看其中的功能,为了存取方便,缓存应是以键值对的形式存取,为了适应更多的场景,所以在存取的时候可以加一个缓存过期时间,然后再加上其他常见的添加、获取、删除、缓存大小、是否存在key、清理过期缓存等方法 缓存类需要注意的问题: 缓存对象应该是唯一的,也就是单例的; 缓存的操作方法要同步,在多线程并发条件下防止出错; 缓存的容器应该具有较高的并发性能,ConcurrentHashMap是一个不错的选择。 接下来是存入缓存数据put()方法,这里的clearExpiredCache()是清理过期缓存,后面会看到方法体,因为在我项目中存入缓存的情况较少,所以这里我固定了每次存之前先清理一次过期时间缓存,这里可以根据自己项目实际情况进行优化 三、并发测试 普通的实现测试这里就不展示了,肯定是没问题的,读者简单一些测试样例即可,这里主要展示一下并发测试,因为在实际情况中存在并发处理缓存情况,为了确保其正确性,所以并发测试是必须要做的,下面放出我的测试样例

    1.9K20发布于 2019-07-17
  • 来自专栏京程一灯

    8JavaScript代码的小技巧

    a = b b = a // { a: 'world', b: 'world' } // 正确 ✅ [a, b] = [b, a]; // { a: 'world', b: 'hello' } 8.

    80020发布于 2020-09-29
  • 来自专栏Java后端技术栈cwnait

    MySQL 数据库的提速器-缓存(Change Buffer)

    缓存(Change Buffer) 是一种特殊的数据结构,用于在对数据变更时,如果数据所在的数据页没有在 buffer pool 中的话,在不影响数据一致性的前提下,InnoDB 引擎会将对数据的操作缓存在 关于 MySQL 缓存(Change Buffer),我们先来看看 InnoDB 的技术架构图: ? 触发缓存(Change Buffer)持久化操作有以下几种情况: 1、数据库空闲时,后台有线程定时持久化 2、数据库缓冲池不够用时 3、数据库正常关闭时 4、redo log 满时 再单独看看 Change 参数配置 上面就是缓存(Change Buffer)的相关知识,缓存(Change Buffer)我们也是可以使用命令参数来控制,MySQL 数据库提供了两个对缓存(Change Buffer)的参数 这就是缓存(Change Buffer)的巧妙之处,也是缓存(Change Buffer)提高 MySQL 的地方。

    3.8K20发布于 2020-03-11
  • 来自专栏猿人工厂

    猿思考系列8——缓存的套路也就这些

    哈哈,缓存这个话题比较热,有太多的文章聊过它了。今天我们也聊聊缓存,不过可能会有些不一样的地方吧。缓存是什么?缓存其实就是计算结果。那缓存有什么作用? 秒后失效 no-cache: 需要使用对比缓存来验证缓存数据 no-store: 所有内容都不会缓存 需要注意max-age的值哈,是秒级的比如你30,那么超过30秒,客户就需要重新到服务端获取数据了哈 一般来讲,缓存的失效问题,有以下几个常见的方面: 缓存雪崩:缓存同时失效被清除,缓存未更新,请求无法命中缓存,如果要求强制拿到数据,请求会打到数据库。如果频繁发生,数据库压力也大,应用很快挂掉的。 这就是缓存击穿,和缓存雪崩的区别在于击穿是只针对某一缓存缓存,雪崩是针对多个缓存。解决这个问题只用保障在同一时刻,一个key只有一个线程在读/写就好了。 比如当缓存失效的时候,一个标识进去,写完后,其他读取的缓存再进行读取就好了。 ?

    27930发布于 2020-07-28
  • 来自专栏愿天堂没有BUG(公众号同名)

    架构师都必须掌握与学习的缓存层场景实战:缓存的实现思路

    • 图5-1 缓存架构示意图 1)请求与批量落库这两个操作同步还是异步? 2)如何触发批量落库? 3)缓冲数据存储在哪里? 4)缓存层并发操作需要注意什么? 5)批量落库失败了怎么办? 1)每收集一次请求,就插入预约数据到缓存中,再判断缓存中预约的总数是否达到一定数量,达到后直接触发批量落库。 2)开一个定时器,每隔一秒触发一次批量落库。 架构示意图如图5-2所示。 这是因为缓存与Hystrix的请求合并有些不一样,请求合并更多考虑的是读请求的情况,不用担心数据丢失,而请求需要考虑容灾问题:如果服务器宕机,内存数据就会丢失,用户的预约数据也就没有了。 缓存这个解决方案可以缓解数据请求量太大、压垮数据库的问题,但其不足还是比较明显的。 1)此方案缓解的只是短时(活动期间)数据库压力大的问题,当数据量长期非常大时,这个方案是解决不了问题的。 本文给大家讲解的内容是缓存层场景实战,缓存的实现思路 下篇文章给大家讲解的内容是缓存层场景实战,数据收集,业务背景:日亿万级请求日志收集如何不影响主业务 觉得文章不错的朋友可以转发此文关注小编; 感谢大家的支持

    43610编辑于 2022-10-28
  • 来自专栏SH的全栈笔记

    缓存与数据库双一致性

    不想弹好吉他的撸铁狗,不是好的程序员 这几天瞎逛,不知道在哪里瞟到了缓存的双,就突然想起来这块虽然简单,但是细节上还是有足够多我们可以去关注的点。这篇文章就来详细聊聊双一致性。 为了维护 Redis 和 MySQL 中数据的一致性,双的问题的就诞生了。 当收到请求时,会先更新 DB 中的数据,成功之后再将缓存中的数据删除。 注意这里是删除,而不是更新。因为实际生产中,缓存中存放的可能不仅仅是单一的像 true、false或者1、19这种值。 首先是缓存要失效,然后读请求、请求并发的执行,并且读请求要比请求后执行完。为啥说概率不大呢,首先在实际生产中,读请求一般都要比请求快得多。 除此之外,读请求去 DB 请求数据的时间一定要早于请求,并且缓存的时间还要一定晚于请求,比起最开始的那种情况来说,条件已经是非常的严格了。

    1.3K20编辑于 2022-08-17
  • 来自专栏程序IT圈

    字节二面,让一个LFU缓存策略算法 !

    redis还有一个缓存策略叫做LFU, 那么LFU是什么呢? 最少使用(LFU)是一种用于管理计算机内存的缓存算法。 主要是记录和追踪内存块的使用次数,当缓存已满并且需要更多空间时,系统将以最低内存块使用频率清除内存.采用LFU算法的最简单方法是为每个加载到缓存的块分配一个计数器。每次引用该块时,计数器将增加一。 当缓存达到容量并有一个新的内存块等待插入时,系统将搜索计数器最低的块并将其从缓存中删除(本段摘自维基百科) ? LFU的缺陷是:在短期的时间内,对某些缓存的访问频次很高,这些缓存会立刻晋升为热点数据,而保证不会淘汰,这样会驻留在系统内存里面。

    90920发布于 2021-03-24
  • 来自专栏小白晋级大师

    分布式系统架构8:分布式缓存

    hash槽,每个节点上可以存储一个或多个hash槽,也就是说当前Redis Cluster支持的最大节点数就是16384总结下:数据hash分布在不同redis节点实例,主/从切换采用Sentinel缓存风险4.1 缓存穿透缓存风险问题也是面试常考的八股文题目,这里还是简单说明下缓存穿透:查询的数据在数据库里根本不存在,缓存里也不会有,这样的请求每次都不会命中缓存,会请求到末端数据库。 ,则读数据库,再将数据写入缓存中;数据时,先写数据库,然后失效缓存(删除缓存数据);面试可能遇到的两个关于Cache Aside的问题:1.更新先后顺序,为什么先更新数据库再删除缓存? 假设先删除缓存再更新数据库,会有一段时间是缓存已删除,数据库未更新的情况。这时如果有请求进来,缓存中没查到,就会查数据库中旧的数据,再放到缓存里。 造成问题就是:数据库已经是最新数据,缓存中还是旧的,不一致的问题;2.为什么是删除缓存,而不是更新缓存

    71910编辑于 2025-01-20
  • 来自专栏main方法

    数据库跟缓存的双一致性

    缓存旧数据 可发现如果出现网络震荡会导致缓存的数据是旧数据。因此这种方法不可取。并且如果是如下场景也不合适: 场景多而读场景少的业务需求,此时缓存不是经常性的读,却被频繁的更新。 延时双删策略 sleep的时间要根据业务数据逻辑耗时而定,反正目的是确保读请求结束,请求可以删除读请求造成的缓存脏数据。 命中:应用程序从缓存中取数据,取到后返回。 更新:先把数据存到数据库中,成功后,再让缓存失效。 假如此时A、B两个线程同时请求,正常来讲不管你是读写分离还是单机版,读一般比快。 那删除缓存一般是有效的。 ? 先更新数据库再删除缓存 但是也有可能别的原因导致读比还慢,导致我们删了个寂寞,虽然这种情况很少发生。 ? 读比还慢时 该方案相比先删除缓存再更新数据库还是稳妥些的,但是也不是万无一失的。不管是先删缓存再更新数据库还是先更新数据库再删缓存,如果删除缓存失败了都会导致缓存跟数据不一致问题!

    1.3K10发布于 2021-04-26
领券