使用 Redis 可以优化性能,但是存在 Redis 的数据和数据库同步的问题,这是我们需要关注的问题。假设两个业务逻辑都是在操作数据库的同一条记录,而 Redis 和数据库不一致。

Redis 和数据库不一致

在图中,T1 时刻以键 key1 保存数据到 Redis,T2 时刻刷新进入数据库,但是 T3 时刻发生了其他业务需要改变数据库同一条记录的数据,但是采用了 key2 保存到 Redis 中,然后又写入了更新数据到数据库中,此时在 Redis 中 key1 的数据是脏数据,和数据库的数据并不一致。

而上图只是数据不一致的一个可能的原因,实际情况可能存在多种,比如数据库的事务是完善的,而对于 Redis 的事务,通过学习应该清楚它并不是那么严格的,如果发生异常回滚的事件,那么 Redis 的数据可能就和数据库不太一致了,所以要保存数据的一致性是相当困难的。

但是不用沮丧,因为互联网系统显示给用户的信息往往并不需要完全是“最新的”,有些数据允许延迟。举个例子,一个购物网站会有一个用户购买排名榜,如果做成实时的,每一笔投资都会引发重新计算,那么网站的性能就存在极大的压力,但是这个排名榜却没有太大的意义。

同样,商品的总数有时候只需要去实现一个非实时的数据。这些在互联网系统中也是十分常见的,一般而言,可以在某段时间进行刷新(比如以一个小时为刷新间隔),排出这段时间的最新排名,这就是延迟性的更新。但是对于一些内容则需要最新的,尤其是当前用户的交易记录、购买时商品的数量,这些需要实时处理,以避免数据的不一致,因为这些都是对于企业和用户重要的记录。

我们会考虑读/写以数据库的最新记录为主,并且同步写入 Redis,这样数据就能保持一致性了,而对于一些常用的只需要显示的,则以查询 Redis 为主。。

Redis 和数据库读操作

数据缓存往往会在 Redis 上设置超时时间,当设置 Redis 的数据超时后,Redis 就没法读出数据了,这个时候就会触发程序读取数据库,然后将读取的数据库数据写入 Redis(此时会给 Redis 重设超时时间),这样程序在读取的过程中就能按一定的时间间隔刷新数据了。

读取数据的流程

下面写出这个流程的代码:

public DataObject readMethod(args) {// 尝试从Redis中读取数据DataObject data = getRedis(key);if(data != null) {// 读取数据返回为空,失败// 从数据库中读取数据data = getFromDataBase();// 重新写入Redis,以便以后读出writeRedis(key,data);// 设置Redis的超时时间为5分钟setRedisExpire(key,5);}return data;
}

上面的代码完成了图中所描述的过程。这样每当读取 Redis 数据超过 5 分钟,Redis 就不能读到超时数据了,只能重新从 Redis 中读取,保证了一定的实时性,也避免了多次访问数据库造成的系统性能低下的情况。

Redis 和数据库写操作

写操作要考虑数据一致的问题,尤其是那些重要的业务数据,所以首先应该考虑从数据库中读取最新的数据,然后对数据进行操作,最后把数据写入 Redis 缓存中。

写入数据的流程

写入业务数据,先从数据库中读取最新数据,然后进行业务操作,更新业务数据到数据库后,再将数据刷新到 Redis 缓存中,这样就完成了一次写操作。

下面写出这个流程的代码:

public DataObject writeMethod(args) {//从数据库里读取最新数据DataObject dataObject = getFromDataBase(args);//执行业务逻辑ExecLogic(dataObject);//更新数据库数据updateDataBase(dataObject);//刷新Redis缓存updateRedisData(dataObject);
}

上面的代码完成了图中所描述的过程。首先,从数据库中读取最新的数据,以规避缓存中的脏数据问题,执行了逻辑,修改了部分业务数据。然后,把这些数据保存到数据库里,最后,刷新这些数据到 Redis 中。

Redis和数据库的结合相关推荐

  1. Redis 缓存数据库

    Redis 缓存数据库 第1章 Redis简介: redis是使用C语言编写的开源的,支持网络,基于内存,可持久性的键值对存储数据库,2013年5月之前,Redis是最流行的键值对存储数据库 Redi ...

  2. Redis缓存数据库服务器

    Redis缓存数据库服务器 Redis是一个开源的科技与内存也可持久化的日志型.Key-Value数据库 Redis的存储分为内存存储.磁盘存储和Log文件三部分,配置文件中有三个参数对其进行配置. ...

  3. Redis和数据库 数据同步问题

    Redis和数据库同步问题 缓存充当数据库 比如说Session这种访问非常频繁的数据,就适合采用这种方案:当然了,既然没有涉及到数据库,那么也就不会存在一致性问题: 缓存充当数据库热点缓存 读操作 ...

  4. redis 和 数据库mysql之间的关系

    https://www.zhihu.com/question/20734566 https://www.zhihu.com/question/19660689 http://blog.csdn.net ...

  5. redis和mysql数据不一致_高并发下为什么 redis 和数据库不一致?怎么解决?

    现在的web架构一般都用redis作为缓存层来减轻数据库的压力,数据在此架构下的读取问题,一般都是先判断redis缓存是否有数据,如果有,直接返回,否则读取数据库的数据,写入redis,返回数据,这是 ...

  6. Redis与数据库同步问题

    缓存数据与持久化数据的一致性,这个问题总结了一下(看到了一个不错的博文),其实就是读和写,还有就是要注意谁先谁后的问题. Redis 是一个高性能的key-value数据库. redis的出现,很大程 ...

  7. Redis与数据库缓存一致性问题

    一.Redis 数据一致性问题产生的原因 对 Redis和数据库的操作有 2 种方案: 1.先操作(删除) Redis,再操作数据库 2.先操作数据库,再操作(删除) Redis 上述二种方案,都希望 ...

  8. redis的数据库通知(notify-keyspace-events)

    redis的数据库通知(notify-keyspace-events) 共分为两类:一类是键空间通知 另一类是键事件通知 概述 数据库通知是redis在2.8之后新增的功能,让客户端可以已发布/订阅模 ...

  9. 项目优化:当使用redis减少数据库压力时,遇到redis写入失败,造成读取数据问题的解决方案

    场景: 我们项目用到了mq,有一个专门的服务在跑异步任务去发mq,这个mq的数据不是从数据库里面查的,而是从redis里面取的,之所以这么做,有两个原因: 1.使用redis减少数据库的压力: 2.本 ...

最新文章

  1. Dynamics AX 2009 升级PreSynchnoize时的无反应的解决
  2. 决策树模型回归可视化分析_Excel进行线性回归模型分析的操作——「杏花开生物医药统计」...
  3. javacript实现不被浏览器拦截打开新窗口
  4. android so readelf.exe,android ndk中的工具使用
  5. Spring Boot 2.3.0——以war方式打包失败[webxml attribute is required]解决方案
  6. java cpu 监控工具_Java自带的GUI性能监控工具Jconsole以及JisualVM简介
  7. 【算法】快速排序/数组第K小的元素
  8. 发现一个厉害的关于html ui的网站 http://amazeui.org以后可能会用机会用!
  9. Go 存储基础 — 内存结构体怎么写入文件?
  10. 【Ubuntu】在Ubuntu 12.04 LTS上安装JDK6
  11. Windows Server 2012 NIC Teaming
  12. Nginx源码分析 - 核心模块初始化顺序,根据ctx创建上下文
  13. 阿里巴巴CTO程立:践行“好科技”,我们正在做这些事
  14. liunx版pgadmin3 source code安装
  15. C语言课程设计 简单的单词学习系统
  16. 支付宝API使用流程
  17. l5630鲁大师跑分_鲁大师安卓3D引擎更新,跑分测试精准度再升级
  18. IT行业人才招聘观察
  19. 数据库 水电费缴费系统
  20. An operation is not implemented: not implemented被坑之路[Kotlin]

热门文章

  1. laravel 异常捕获_Laravel框架捕获各种类型错误
  2. kinux查日志_Linux查看日志常用命令
  3. android白色字体代码,Android实现状态栏白底黑字效果示例代码
  4. windows7怎么清空电脑只剩系统
  5. 腾讯视频网页下载_腾讯视频怎么下载视频
  6. Python二叉树遍历
  7. linux bash 历史记录,Linux Bash History 命令历史记录
  8. centos6.5安装bugzilla超详细教程
  9. linux 文件名带特殊符号,Linux删除含有特殊符号文件名的文件
  10. Linux检查wlan0是否存在,linux - airmon-ng将wlan0更改为wlan0mon但不恢复[​​关闭] - 堆栈内存溢出...