文档章节

大话Redis进阶-更新缓存的问题

ZYallers
 ZYallers
发布于 2017/07/25 15:42
字数 1126
阅读 10
收藏 0
点赞 0
评论 0

大话Redis进阶-更新缓存的问题

使用Redis过程中,总是会遇到各种各样问题,这里进行问题的总结,作为Redis 进阶的经验分享。

更新缓存的问题

  • [主动]需要操作人员去操作,或者定时调度
  • [被动]由用户触发更新
  • [预加载]提前加载好数据

方案1

  • [主动]后台点击更新缓存按钮,从DB查找最新数据集合,删除原缓存数据,存储新数据到缓存;
  • 问题:更新过程中删除掉缓存后刚好有业务在查询,那么这个时候返回的数据会是空,会影响用户体验

方案2

  • [被动]前台获取数据时发现没有缓存数据就会去数据库同步数据到缓存
  • 问题:当并发请求获取缓存数据不存在的时候,就会产生并发的查询数据的操作。

方案3

  • [主动]后台点击更新缓存按钮,从DB查找最新数据集合,这里不删除缓存,通过遍历数据覆盖和删除掉无效的数据
  • 问题:逻辑相对麻烦,而且更新机制无法通用;

推荐

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

方案4

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

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

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

需要两块数据:

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

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

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

[缓存]对应Redis Key 规则

  • [ShowingKey]对应的Redis Key

更新逻辑:

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

更新总结

  • 第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 自增数值的机制不会有累加不准确的问题

本文转载自:https://blog.thankbabe.com/2016/08/05/redis-up/

共有 人打赏支持
ZYallers
粉丝 1
博文 59
码字总数 19100
作品 0
佛山
程序员
大话程序猿眼里的高并发架构

前言 高并发经常会发生在有大活跃用户量,用户高聚集的业务场景中,如:秒杀活动,定时领取红包等。 为了让业务可以流畅的运行并且给用户一个好的交互体验,我们需要根据业务场景预估达到的并...

chaun
2016/11/13
25
0
大话程序猿眼里的高并发架构

前言 高并发经常会发生在有大活跃用户量,用户高聚集的业务场景中,如:秒杀活动,定时领取红包等。 为了让业务可以流畅的运行并且给用户一个好的交互体验,我们需要根据业务场景预估达到的并...

落叶追风
2016/11/25
34
0
大话程序猿眼里的高并发架构

前言 高并发经常会发生在有大活跃用户量,用户高聚集的业务场景中,如:秒杀活动,定时领取红包等。 为了让业务可以流畅的运行并且给用户一个好的交互体验,我们需要根据业务场景预估达到的并...

SFLYYQ
2016/11/04
754
1
大叔推荐博客索引

以下是我的所有推荐文章,其中多半是文章系列,并且这个索引会在以后过程中进行追加,所以,各位看到的,永远都不是最新的,呵呵! 大叔推荐文章系列 DotNetCore跨平台~文章索引~永久更新(...

mcy247
2017/12/05
0
0
大话程序猿眼里的高并发

简单理解下高并发: 高并发是指在同一个时间点,有很多用户同时的访问URL地址,比如:淘宝的双11,双12,就会产生高并发,如贴吧的爆吧,就是恶意的高并发请求,也就是DDOS攻击,再屌丝点的说法...

oschina
2016/05/17
17.2K
23
Guava Cache内存缓存使用实践-定时异步刷新及简单抽象封装

https://www.cnblogs.com/boothsun/p/5848143.html 版权声明:本文为博主原创文章,未经博主允许不得转载。 http://blog.csdn.net/u012859681/article/details/75220605 目录(?)[-] 简单使用...

new_chaos
03/18
0
0
phalapi-进阶篇7(使用缓存以及用redis拓展解决实际问题)

phalapi-进阶篇7(使用缓存以及用redis拓展解决实际问题) 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架. 当我们在开发一个项目时,我们可能会遇到很多问题,比如...

喵了_个咪
2015/12/12
114
0
网站高并发及高并发架构详解

高并发是指在同一个时间点,有很多用户同时的访问URL地址,比如:淘宝的双11,双12,就会产生高并发,如贴吧的爆吧,就是恶意的高并发请求,也就是DDOS攻击,再屌丝点的说法就像玩撸啊撸被ADC...

小麋鹿666
2017/01/06
0
0
ZHENFENGSHISAN/perfect-ssm

Quick Start 项目简介 ssm系列 ssm-demo:Spring+SpringMVC+Mybatis+easyUI整合 perfect-ssm:RESTful API+redis缓存 ssm-cluster:前后端分离+集群部署 ssm-dubbo:dubbo服务化 ssm-micro-se......

ZHENFENGSHISAN
2017/09/18
0
0
支付宝架构师眼里的高并发架构

前言 高并发经常会发生在有大活跃用户量,用户高聚集的业务场景中,如:秒杀活动,定时领取红包等。 为了让业务可以流畅的运行并且给用户一个好的交互体验,我们需要根据业务场景预估达到的并...

java高级分享
01/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CVE-2013-0077 堆溢出分析

找了很久才发现这个环境比较容易搭建分析... 环境: 系统---Win XP SP3 漏洞程序:QQPlayer 3.7.892.400 出错DLL:quartz.dll 6.5.2600.5512 调试工具:x32db+gflag.exe 过程: 首先gflag设置...

Explorer0
18分钟前
6
0
python上传文件

//注意 <form action="/login/" method="post" enctype="multipart/form-data"> f=request.FILES.get('fafa') ff=open(f.name,mode='wb') for i in f.chunks(): ff.write(i) ff.close()......

南桥北木
31分钟前
0
0
CISCO VPN Client Reason 442 WIN8/10错误解决方案

http://jdkleo.iteye.com/blog/2163493 引用 http://my.oschina.net/cloudcoder/blog/220391?p={{currentPage 1}} 在使用cisco VPN 客户端登录时,产生Reason 442:Failedto enable Virtual......

chenfj_fer
34分钟前
0
0
信号量有没有容量限制?

之前一直误以为信号量初始化的时候那个初始化的值是信号量的“容量”,昨天同事指出了我的错误,最初我是不相信的,经过以下代码实践,证明了我的错误: Java版: import java.util.concurr...

锟斤拷烫烫烫
38分钟前
0
0
【RocketMQ】Message存储笔记

概述 消息中间件存储分为三种,一是保存在内存中,速度快但会因为系统宕机等因素造成消息丢失;二是保存在内存中,同时定时将消息写入DB中,好处是持久化消息,如何读写DB是MQ的瓶颈;三是内...

SaintTinyBoy
49分钟前
0
0
Android应用Context详解及源码解析

Android应用Context详解及源码解析 本文定位:优质文章收集 本文转载 1 背景 今天突然想起之前在上家公司(做TV与BOX盒子)时有好几个人问过我关于Android的Context到底是啥的问题,所以就马...

lichuangnk
今天
0
0
PostgreSQL的昨天今天和明天

PostgreSQL 是一种非常复杂的对象-关系型数据库管理系统(ORDBMS), 也是目前功能最强大,特性最丰富和最复杂的自由软件数据库系统。有些特性甚至连商业数据库都不具备。 这个起源于伯克利(...

闻术苑
今天
1
0
Mysql对自增主键ID进行重新排序

1,删除原有主键: ALTER TABLE `table_name` DROP `id`; 2,添加新主键字段: ALTER TABLE `table_name` ADD `id` MEDIUMINT( 8 ) NOT NULL FIRST; 3,设置新主键: ALTER TABLE `table_nam......

niithub
今天
0
0
福利篇:免费csdn vip账号分享

分享一个发布免费csdn vip账号的网站:啰嗦vip www.lostvip.com , 各种软件开发类的视频教程:慕课网、动脑学院、黑马各大培训机构VIP视频教程,非常不错!

在水一方发盐人
今天
1
0
Nginx+Tomcat搭建高性能负载均衡集群

一、 工具   nginx-1.8.0   apache-tomcat-6.0.33 二、 目标   实现高性能负载均衡的Tomcat集群:    三、 步骤   1、首先下载Nginx,要下载稳定版:      2、然后解压两个Tom...

码代码的小司机
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部