精华内容
下载资源
问答
  • Redis 更新缓存问题解决

    千次阅读 2019-03-21 16:47:39
    [主动]需要操作人员去操作,或者定时调度 ... 问题:更新过程中删除掉缓存后刚好有业务在查询,那么这个时候返回的数据会是空,会影响用户体验 方案2 [被动]前台获取数据时发现没有缓存数据...

    [主动]需要操作人员去操作,或者定时调度

      [被动]由用户触发更新

      [预加载]提前加载好数据

    • 方案1

      • [主动]后台点击更新缓存按钮,从DB查找最新数据集合,删除原缓存数据,存储新数据到缓存;

      • 问题:更新过程中删除掉缓存后刚好有业务在查询,那么这个时候返回的数据会是空,会影响用户体验

    • 方案2

      • [被动]前台获取数据时发现没有缓存数据就会去数据库同步数据到缓存

      • 问题:当并发请求获取缓存数据不存在的时候,就会产生并发的查询数据的操作。

    • 方案3

      • [主动]后台点击更新缓存按钮,从DB查找最新数据集合,这里不删除缓存,通过遍历数据覆盖和删除掉无效的数据

      • 问题:逻辑相对麻烦,而且更新机制无法通用;

    推荐

      以上的几种更新方案我都遇到过,因为产生了各种问题,所以我想到了一个相对好的方案,类似预加载功能,先把数据加载到缓存中,缓存成功后再切换显示最新的数据,将旧数据设置过期;

    • 方案4

        [主动][预加载]前台获取缓存的时候需要先得到缓存数据对应的Redis Key(简称:[ShowingKey]),然后根据[ShowingKey]去读取缓存数据(简称:[缓存];

      • [ShowingKey](可以是最近一次更新缓存的时间戳或者根据自己规则自定义)

      • [缓存](需要缓存的数据,如:DB数据等)

      • 需要两块数据:

    • 举个栗子:

        我们现在有个业务需要缓存今日上新商品数据,缓存到Hash中

        更新逻辑:

        后台编辑人员操作完数据的时候点击更新按钮,获取服务器当前时间=1469938351000=[更新时间戳],然后获取DB数据,缓存到Goods:Todays:1469938351000中,添加缓存数据成功后,获取Goods:Todays:ing中的时间戳1449538371020=[上一次更新时间戳],更新Goods:Todays:ing值=[更新时间戳]=1469938351000,更新成功后可以把[上一次更新时间戳]对应的缓存设置过期时间,我一般是设置5秒后过期。(注意旧数据一定要设置过期时间,不能直接删除,因为在切换[ShowingKey]的过程中可能还有业务在使用)

      • Key string key=Goods:Todays:ing 内容=最近一次的更新时间戳

      • Hash Key=Goods:Todays:{0} {0}=时间戳

      • [缓存]对应Redis Key 规则

      • [ShowingKey]对应的Redis Key

    更新总结

    • 第1种更新方案影响用户体验一般不推荐使用

    • 第2种更新方案可以通过程序锁,锁住更新操作只能有一个进入DB查询,可以避免问题

    • 第3种更新方案不会有第1,2 的问题,但是更新逻辑写起来比较麻烦,而且更新方案不能抽象通用

    • 第4种更新方案使用提前加载到缓存,然后在切换需要显示的缓存数据,可以完美解决1,2,3中的问题

    redis内存不足,滥用

    • 问题

      1. 数据不断累加,无效数据未清理,缓存未设置过期时间

      2. 存储数据中包含未使用到字段,整个对象序列化到redis中

      3. 冷数据,或者根本不会再去使用的无效数据没有清理

    • 解决

      1. 数据区分无效时间,设置过期时间,使无效数据过期;(如:通过日期后缀命名Key)

      2. 区分冷数据,清理掉冷数据;

      3. 缓存数据从简,redis key命名从简,数据字段命名从简,无效字段不添加在缓存中;

    键命名规范

    • 内存数据库,键名长度影响有限内存空间,所以命名应该控制长度,简短易懂;

    • 大小写规范

    • 根据业务命名,相同业务统一的Key前缀

    其他经验

    • 数值累加,get,set+1并发导致累加不准确

      • 使用redis increment 自增数值的机制不会有累加不准确的问题

    • .net 类库 ServiceStack 3.9.71.0 的一个问题

        SetEntryInHash 返回 bool,只有第一次新增的时候返回的是true,后面修改成功了也都是返回false

        源码:SetEntryInHash 方法,读取hset的结果 判断是否等于1,返回bool

        

        我们通过命令: hset 第一次sflyq key不存在,添加成功返回的执行结果是:1 hset 第一次sflyq key已经存在,修改成功购返回结果:0

        

        所以结果很明显,通过SetEntryInHash 判断hash是否key value 是否设置成功是有问题的,只有第一次设置会返回 ture

    展开全文
  • Redis更新缓存策略

    千次阅读 2019-03-28 11:04:03
    [主动]需要操作人员去操作,或者定时调度  [被动]由用户触发更新  [预加载]提前加载好...问题:更新过程中删除掉缓存后刚好有业务在查询,那么这个时候返回的数据会是空,会影响用户体验 方案2 [被动]前台...

     [主动]需要操作人员去操作,或者定时调度

      [被动]由用户触发更新

      [预加载]提前加载好数据

    • 方案1

      • [主动]后台点击更新缓存按钮,从DB查找最新数据集合,删除原缓存数据,存储新数据到缓存;

      • 问题:更新过程中删除掉缓存后刚好有业务在查询,那么这个时候返回的数据会是空,会影响用户体验

    • 方案2

      • [被动]前台获取数据时发现没有缓存数据就会去数据库同步数据到缓存

      • 问题:当并发请求获取缓存数据不存在的时候,就会产生并发的查询数据的操作。

    • 方案3

      • [主动]后台点击更新缓存按钮,从DB查找最新数据集合,这里不删除缓存,通过遍历数据覆盖和删除掉无效的数据

      • 问题:逻辑相对麻烦,而且更新机制无法通用;

    推荐

      以上的几种更新方案我都遇到过,因为产生了各种问题,所以我想到了一个相对好的方案,类似预加载功能,先把数据加载到缓存中,缓存成功后再切换显示最新的数据,将旧数据设置过期;

    • 方案4

        [主动][预加载]前台获取缓存的时候需要先得到缓存数据对应的Redis Key(简称:[ShowingKey]),然后根据[ShowingKey]去读取缓存数据(简称:[缓存];

      • [ShowingKey](可以是最近一次更新缓存的时间戳或者根据自己规则自定义)

      • [缓存](需要缓存的数据,如:DB数据等)

      • 需要两块数据:

    • 举个栗子:

        我们现在有个业务需要缓存今日上新商品数据,缓存到Hash中

        更新逻辑:

        后台编辑人员操作完数据的时候点击更新按钮,获取服务器当前时间=1469938351000=[更新时间戳],然后获取DB数据,缓存到Goods:Todays:1469938351000中,添加缓存数据成功后,获取Goods:Todays:ing中的时间戳1449538371020=[上一次更新时间戳],更新Goods:Todays:ing值=[更新时间戳]=1469938351000,更新成功后可以把[上一次更新时间戳]对应的缓存设置过期时间,我一般是设置5秒后过期。(注意旧数据一定要设置过期时间,不能直接删除,因为在切换[ShowingKey]的过程中可能还有业务在使用)

      • Key string key=Goods:Todays:ing 内容=最近一次的更新时间戳

      • Hash Key=Goods:Todays:{0} {0}=时间戳

      • [缓存]对应Redis Key 规则

      • [ShowingKey]对应的Redis Key

    更新总结
    • 第1种更新方案影响用户体验一般不推荐使用

    • 第2种更新方案可以通过程序锁,锁住更新操作只能有一个进入DB查询,可以避免问题

    • 第3种更新方案不会有第1,2 的问题,但是更新逻辑写起来比较麻烦,而且更新方案不能抽象通用

    • 第4种更新方案使用提前加载到缓存,然后在切换需要显示的缓存数据,可以完美解决1,2,3中的问题

    redis内存不足,滥用
    • 问题

      1. 数据不断累加,无效数据未清理,缓存未设置过期时间

      2. 存储数据中包含未使用到字段,整个对象序列化到redis中

      3. 冷数据,或者根本不会再去使用的无效数据没有清理

    • 解决

      1. 数据区分无效时间,设置过期时间,使无效数据过期;(如:通过日期后缀命名Key)

      2. 区分冷数据,清理掉冷数据;

      3. 缓存数据从简,redis key命名从简,数据字段命名从简,无效字段不添加在缓存中;

    键命名规范
    • 内存数据库,键名长度影响有限内存空间,所以命名应该控制长度,简短易懂;

    • 大小写规范

    • 根据业务命名,相同业务统一的Key前缀

    其他经验
    • 数值累加,get,set+1并发导致累加不准确

      • 使用redis increment 自增数值的机制不会有累加不准确的问题

    • .net 类库 ServiceStack 3.9.71.0 的一个问题

        SetEntryInHash 返回 bool,只有第一次新增的时候返回的是true,后面修改成功了也都是返回false

        源码:SetEntryInHash 方法,读取hset的结果 判断是否等于1,返回bool

        

        我们通过命令: hset 第一次sflyq key不存在,添加成功返回的执行结果是:1 hset 第一次sflyq key已经存在,修改成功购返回结果:0

        

        所以结果很明显,通过SetEntryInHash 判断hash是否key value 是否设置成功是有问题的,只有第一次设置会返回 ture

    展开全文
  • Redis更新缓存同步数据库的理解

    千次阅读 2018-09-27 10:01:43
    问题:当数据库有数据更新时,怎样保证redis缓存中的数据与数据库数据一致?   Redis更新的正确方法 原文(缓存更新的套路):看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作...

    问题:当数据库有数据更新时,怎样保证redis缓存中的数据与数据库数据一致?

     

    Redis更新的正确方法

    原文(缓存更新的套路):看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。试想,两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中,然后更新操作更新了数据库。于是,在缓存中的数据还是老的数据,导致缓存中的数据是脏的,而且还一直这样脏下去了。

    视图分析:

    写流程(更新策略)

    1. 先淘汰 cache(删除缓存);
    2. 再写 DB(更新数据库)。

    读流程

    1. 先读 cache,如果数据命中 hit 则返回;
    2. 如果数据未命中 miss 则读 DB;
    3. 将 DB 中读取出来的数据入缓存。

    什么情况下可能出现缓存和数据库不一致呢?

    在分布式环境下,数据的读写都是并发的,上游有多个应用,通过一个服务的多个部署(为了保证可用性,一定是部署多份的),对同一个数据进行读写,在数据库层面并发的读写并不能保证完成顺序,也就是说后发出的读请求很可能先完成(读出脏数据):

    1. 发生了写请求 A,A 的第一步淘汰了 cache(如上图中的1);
    2. A 的第二步写数据库,发出修改请求(如上图中的2);
    3. 发生了读请求 B,B 的第一步读取 cache,发现 cache 中是空的(如上图中的步骤3);
    4. B 的第二步读取数据库,发出读取请求,此时 A 的第二步写数据还没开始,读出了一个脏数据放入 cache(如上图中的步骤4)。

    最终导致缓存与数据库不一致。

    先更新数据库,后删除缓存(建议,使用场景最多),但是,是不是这个就不会有并发问题了?不是的,比如,一个是读操作,但是没有命中缓存,然后就到数据库中取数据,此时来了一个写操作,写完数据库后,让缓存失效,然后,之前的那个读操作再把老的数据放进去,所以,会造成脏数据。

    展开全文
  • springboot整合redis缓存

    万次阅读 多人点赞 2018-09-13 13:39:33
    之前的项目中,用到过redis,主要是使用redis缓存redis在web开发中使用的场景很多,其中缓存是其中一个很重要的使用场景,之所以用作缓存,得益于redis的读写数据,尤其是在读取数据的时候是直接走内存的,这样...

    之前的项目中,用到过redis,主要是使用redis做缓存,redis在web开发中使用的场景很多,其中缓存是其中一个很重要的使用场景,之所以用作缓存,得益于redis的读写数据,尤其是在读取数据的时候是直接走内存的,这样在高并发访问数据的时候,和查询数据库相比,redis读取数据的高效性、快速性的优势可见一斑,据说新浪单是每天的所有内容的统计的总的访问数量可以达到上百亿次,这种场景下,如果没有redis做数据缓存,根本无法支撑这么大的数据访问量,redis使用的时候可以单独利用客户端引入jar包操作即可,实际项目中都是和框架进行整合的比较多,此处演示利用springboot整合redis做缓存的简单过程。

    1、搭建redis服务器,为简化搭建过程,这里是在windows下使用redis3.2进行模拟,redis的下载可到github上,

    这里写图片描述

    下载压缩包,解压到本地的目录,解压完毕,直接在目录下启动服务端和客户端即可,

    展开全文
  • 关于redis作为缓存时出现的击穿,穿透,雪崩问题1.击穿2.穿透3.缓存雪崩 redis有两种使用方式一是作为数据库使用,二是作为缓存使用。 将redis作为缓存,当你新增数据时,让它自动地回收旧数据是件很方便的事情。这...
  • ssm redis里面缓存更新

    2017-11-21 13:38:52
    (当我第一次查询数据库数据,缓存redis里面,再往数据库插入数据,此时再查询会查询到redis里面的缓存,怎么设置xml使数据库数据有更新redis会跟着重新缓存,或设置时间定时连接数据库缓存
  • redis缓存

    万次阅读 2020-09-28 08:25:51
    天气接口,调用限制4000次每天,用户请求次数过多会造成次数上限,使用redis缓存过滤请求 实现思路 用户调用----查redis中是否有该城市天气数据存在,若不存在,调用接口并存到redis里面,有效期2小时,若存在2...
  • Redis系列 - Redis更新数据库还是先更新缓存? 先更新数据库再失效缓存
  • Redis缓存机制是:当有查询操作时,会先查询Redis,如果Redis中没有该key,那么就会去查询数据库,并把查询结果写入到Redis中,当下一次查询的时候,就会直接从Redis中查询 缓存雪崩:由于内存的有限,我们一般会...
  • 今天小编就为大家分享一篇关于SpringBoot AOP控制Redis自动缓存更新的示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • redis清空缓存

    万次阅读 2016-12-02 09:55:13
    redis清空缓存 进入redis命令行 首先启动redis服务 redis-server /home/redis/redis_7901.conf redis-cli -p 7901(指定进入端口号为7901的redis数据库) ...2.清空整个redis缓存FLUSHALL flushall
  • redis缓存雪崩,redis缓存穿透,redis缓存击穿 redis应对高并发造成的雪崩、穿透、击穿
  • 主要介绍了nodejs使用redis作为缓存介质实现的封装缓存类,涉及nodejs操作redis进行缓存设置相关操作技巧,需要的朋友可以参考下
  • public class RedisConfig extends CachingConfigurerSupport{ @Resource private LettuceConnectionFactory lettuceConnectionFactory; //@description 自定义的缓存key的生成策略,若想使用这个key 只需要将...
  • 带上你的问题来学redis:什么是redis?redis缓存穿透?redis缓存雪崩?redis缓存击穿?如何处理? 还有:redis与数据库之间的数据一致性问题!
  • 本文介绍Spring boot 如何使用redis做缓存,如何对redis缓存进行定制化配置(如key的有效期)以及spring boot 如何初始化redis做缓存。使用具体的代码介绍了@Cacheable,@CacheEvict,@CachePut,@CacheConfig等注解...
  • Redis作为缓存

    千次阅读 2015-08-28 17:42:07
    redis缓存服务器笔记  redis是一个高性能的key-value存储系统,能够作为缓存框架和队列  但是由于他是一个内存内存系统,这些数据还是要存储到数据库中的 作为缓存框架:  create/updae/delete---同时存到...
  • 配置Redis作为缓存

    千次阅读 2017-08-15 19:00:52
    Redis 用作缓存时, 如果内存空间用满, 就会自动驱逐老的数据。 默认情况下 memcached 就是这种方式, 大部分开发者都比较熟悉。 LRU是Redis唯一支持的回收算法. 本文详细介绍用于限制最大内存使用量的 maxmemory ...
  • redis缓存手动更新

    千次阅读 2018-08-12 08:41:38
    server11:redis缓存服务器 server12:mysql服务器:client serever13:ngnx+php-fpm,gearmand server,worker server11: 首先安装redis服务器 server13: rpm包安装nginx+php-fpm vim /etc/php.ini 946 date....
  • redis 同步更新缓存数据

    千次阅读 2019-02-11 11:47:26
    问题场景 练习项目写后台的时候,在后台对前端...出现问题:实际数据更新redis缓存中数据未更新 解决思路 在实际更新数据库操作的同时,对 redis 的缓存数据进行更新处理 具体步骤:删除原有的 redis 中的缓存...
  • 怎么用redis实现分页缓存,比如有1000页数据,只缓存当前页的后两页,点击到其他页时再缓存当前页的后两页。
  • Redis缓存

    千次阅读 2020-06-26 09:09:05
    Redis简介 什么是Redis ...与传统数据库不同的是, Redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Valu
  • Redis面试常问,缓存穿透,缓存击穿,缓存雪崩你理解了吗?
  • Redis缓存更新的套路

    千次阅读 2018-09-06 10:20:58
    看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。试想,两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,...
  • redis 作为缓存总结

    千次阅读 2017-01-16 18:46:42
    redis缓存服务器笔记 redis是一个高性能的key-value存储系统,能够作为缓存框架和队列 但是由于他是一个内存内存系统,这些数据还是要存储到数据库中的作为缓存框架: create/updae/delete—同时存到redis和...
  • 基于redis缓存框架

    2016-12-16 11:35:13
    想要做一个基于redis缓存 比 spring cache好用 但是这个只局限于redis 有兴趣的大家一起来研究学习 代码还没有写完
  • 这里进行redis作为缓存框架,进行一个缓存的配置。配置前需要先了解一些基本的知识 在Spring中缓存主要有一个缓存接口(Cache)与缓存管理接口(CacheManager)。可以通过扩展这两个接口实现对应的缓存管理。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 270,419
精华内容 108,167
关键字:

redis更新缓存

redis 订阅