Redis缓存设计

缓存更新策略

策略 一致性 维护成本
LRU、LRF、FIFO 最差
超时剔除 较差 较低
主动更新

低一致性业务:最大内存和淘汰策略的方式,maxmemory-policy

高一致性业务:超时剔除和主动更新

缓存穿透

解决缓存穿透 适用场景 维护成本
缓存空对象 数据命中不高,数据频繁变化实时性高 代码维护简单,需要过多的缓存空间,数据不一致
布隆过滤器 数据命中不高、数据相对固定、实时性低 代码维护复杂,缓存占用空间小

缓存空对象:针对该类对象需设置较短过期时间。

布隆过滤器:将存在的key用布隆过滤器保存起来,如果过滤器认为该信息不存在,那么不会访问存储层。该方法适用于数据命中不高的场景

缓存雪崩

缓存服务器宕机了,或在某一时刻缓存同时到期,导致大量的流量打向后端存储

  1. 保证缓存层的高可用性
  2. 依赖隔离组件为后端限流并降级

热点key重建优化

开发人员使用“缓存+过期时间”的策略既可以加速数据读写,又保证数据的定期更新,这种模式基本能够满足绝大
部分需求。但是有两个问题如果同时出现,可能就会对应用造成致命的危害:
当前key是一个热点key(例如一个热门的娱乐新闻),并发量非常大。
重建缓存不能在短时间完成,可能是一个复杂计算,例如复杂的SQL、多次IO、多个依赖等。在缓存失效的瞬
间,有大量线程来重建缓存,造成后端负载加大,甚至可能会让应用崩溃。
要解决这个问题也不是很复杂,但是不能为了解决这个问题给系统带来更多的麻烦,所以需要制定如下目
标:
减少重建缓存的次数
数据尽可能一致
较少的潜在危险
①互斥锁:此方法只允许一个线程重建缓存,其他线程等待重建缓存的线程执行完,重新从缓存获取数据即
可。

②永远不过期

永远不过期”包含两层意思: 从缓存层面来看,确实没有设置过期时间,所以不会出现热点key过期后产生的问题,也就是“物理”不过期。 从功能层面来看,为每个value设置一个逻辑过期时间,当发现超过逻辑过期时间后,会使用单独的线程去构建缓存。
从实战看,此方法有效杜绝了热点key产生的问题,但唯一不足的就是重构缓存期间,会出现数据不一致的情况,这取决于应用方是否容忍这种不一致。

原文地址:https://www.cnblogs.com/javathinker/p/11148707.html

时间: 2024-10-31 12:49:16

Redis缓存设计的相关文章

基于python+mysql+redis缓存设计与数据库关联数据处理

1.添加表 CREATE TABLE tb_signin( id INT, user_name VARCHAR(10), signin_num INT , signin_time DATETIME , gold_coin INT ); INSERT INTO tb_signin VALUES(1, 'ma', 0, NULL, 0), (2, 'he', 0, NULL, 0), (3, 'yu', 0, NULL, 0), (4, 'hai', 0, NULL, 0), (5, 'fang',

Redis缓存设计与性能优化

Redis我们一般是用作缓存,扛并发:或者用于某些特定的业务场景,比如前面说到redis各种数据类型的使用场景以及redis的哨兵和集群模式. 这里主要整理了下redis用作缓存,存在的一些问题,以及改善方案. 简单的流程就像这个样子,一般请先到缓存区获取,如果缓存没有再到后端的数据库去查询. 1.缓存穿透 缓存穿透是指,是指查询一个根本不存在数据,这样缓存层里面没有,就会去访问后面的存储层了.如果有大量的这种恶意请求过来,都打向后面的存储层.显然我们的存储层是扛不住这样的压力.这样缓存就失去了

Spring Cloud微服务架构实现+Guava缓存+redis+数据库设计+微服务原理改造房产销售

Spring Cloud微服务架构实现+Guava缓存+redis+数据库设计+微服务原理改造房产销售 一.分布式服务框架的发展 1.1 第一代服务框架 代表:Dubbo(Java).Orleans(.Net)等 特点:和语言绑定紧密 1.2 第二代服务框架 代表:Spring Cloud等 现状:适合混合式开发(例如借助Steeltoe OSS可以让ASP.Net Core与Spring Cloud集成),正值当年 1.3 第三代服务框架 代表:Service Mesh(服务网格) => 例如

39、生鲜电商平台-redis缓存在商品中的设计与架构

说明:Java开源生鲜电商平台-redis缓存在商品中的设计与架构. 1. 各种计数,商品维度计数和用户维度计数 说起电商,肯定离不开商品,而附带商品有各种计数(喜欢数,评论数,鉴定数,浏览数,etc),Redis的命令都是原子性的,你可以轻松地利用INCR,DECR等命令来计数. 商品维度计数(喜欢数,评论数,鉴定数,浏览数,etc)  采用Redis 的类型: Hash. 如果你对redis数据类型不太熟悉,可以参考 http://redis.io/topics/data-types-int

使用redis缓存加索引处理数据库百万级并发

使用redis缓存加索引处理数据库百万级并发 前言:事先说明:在实际应用中这种做法设计需要各位读者自己设计,本文只提供一种思想.准备工作:安装后本地数redis服务器,使用mysql数据库,事先插入1000万条数据,可以参考我之前的文章插入数据,这里不再细说.我大概的做法是这样的,编码使用多线程访问我的数据库,在访问数据库前先访问redis缓存没有的话在去查询数据库,需要注意的是redis最大连接数最好设置为300,不然会出现很多报错. 贴一下代码吧 1 2 3 4 5 6 7 8 9 10 1

聊聊从web session的共享到可扩展缓存设计

先从web session的共享说起 许多系统需要提供7*24小时服务,这类系统肯定需要考虑灾备问题,单台服务器如果宕机可能无法立马恢复使用,这必定影响到服务.这个问题对于系统规模来说,从小到大可能面临的难度会相差很大.但对于原理来说其实就是需要准备备份系统随时可以替代正在服务的系统,也就是无论何时都有服务器可以提供服务.也就是灾备系统或者负载均衡. 提供灾备系统或者负载均衡系统都需要面临一个问题,那就是如何解决共享数据的问题.对于web服务器而言首先要解决的就是web session共享问题,

分布式系统缓存设计浅析

1. 分布式缓存面临比较大的三个问题: (1) 数据一致性. 在分布式系统这点显得尤为重要,主要原因有三点: 缓存系统与底层数据的一致性.这点在底层系统是“可读可写”时,写得尤为重要 有继承关系的缓存之间的一致性.为了尽量提高缓存命中率,缓存也是分层:全局缓存,二级缓存.他们是存在继承关系的.全局缓存可以有二级缓存来组成. 多个缓存副本之间的一致性.为了保证系统的高可用性,缓存系统背后往往会接两套存储系统(如memcache,redis等),以上的ppt也主要是讲这方面的内容. (2)缓存雪崩

总结:如何使用redis缓存加索引处理数据库百万级并发

前言:事先说明:在实际应用中这种做法设计需要各位读者自己设计,本文只提供一种思想.准备工作:安装后本地数redis服务器,使用mysql数据库,事先插入1000万条数据,可以参考我之前的文章插入数据,这里不再细说.我大概的做法是这样的,编码使用多线程访问我的数据库,在访问数据库前先访问redis缓存没有的话在去查询数据库,需要注意的是redis最大连接数最好设置为300,不然会出现很多报错. 贴一下代码吧 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1

redis缓存mysql

Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有序集合).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且