使用redis缓存数据需要注意的问题以及个人的一些思考和理解
之前我有博客也尝试过使用redis,在实际的项目中确实作用挺大的。至少对于数据的频繁读取来说都起着至关重要的作用。
但是随着技术的学习,慢慢的业务要复杂起来,以后也许会用到redis集群,所以在这边查询了一些资料,做了一些思考和理解。
如果有问题,请提出,虚心接受,认真学习。
一般的redis逻辑
请求过来,redis里面有没有?有就给用户
没有查询数据库
数据库里面有没有?没有告诉用户没有
有就查询出来,给用户,并且存放到redis
redis缓存会出现什么问题?
redis缓存数据库的数据,有一点就显得特别重要,那就是数据一致性的问题。
单个数据库在多线程操作的时候如果不是数据库锁的限制会出现很多数据不一致的问题,ACID这里我就不多说了。
redis缓存也会有这样的问题,就是数据库的数据更新到redis是会有时间差的,这样的时间差就会导致数据不一致。
比如一件商品价格在数据库里面是500,然后redis也是500,但是突然数据库修改成了600,如果所有用户都是读入数据库的话,数据库会加锁,然后避免用户读出之前那个500,但是redis的更新怎么说都是有时间差的,所以用户就有可能读取到500这个数据。
这就是数据不一致的问题。
redis适合缓存怎么样的数据?
这里的数据分为两块,第一是数据库的数据,第二是页面的一些静态数据。
这里说的是数据库的数据。
页面的一些静态数据不适合存放在缓存中。
然后对于上面提出的数据不一致的问题,所以缓存的数据也有要求。
不要缓存那些对于数据一致性要求很高的数据。
如果这个数据存在被修改的可能性,那么最好不要存缓存,要么,就不要放数据库,只放缓存。
那些对于数据一致性不高的数据,都是可以放的。
强调一点是,如果这个数据放了,但是对于这个数据的操作不是修改,而是只有删除的话,也是可以存放缓存的,因为在实际操作中,如果一个删除操作被执行的时候,缓存可以先进行删除,这样就能确保没有用户能够读取到删除之后的数据,然后再对数据库进行删除。
redis集群
redis集群,这边我给出的建议是使用redis的主从复制功能,这个功能和mysql的主从复制是一个道理,都能很好的确保数据的一致性。
具体redis集群的配置以及实验我会在后面新的博客中给出的。
总结一下:具体的使用过程中,使用redis的超时可以对数据进行一些持久化管理,对于一些数据一致性不高的数据进行缓存,使得读取速度提高,使用redis集群时可以是用主从复制功能,Redis集群没有中心节点,并且带有复制和故障转移特性,这可以避免单个节点成为性能瓶颈,或者因为某个节点下线而导致整个集群下线。
本人的经验也不多,希望有经验的师傅们能提供多一些的建议。
使用redis缓存数据需要注意的问题以及个人的一些思考和理解的更多相关文章
- 基于 abp vNext 和 .NET Core 开发博客项目 - 使用Redis缓存数据
上一篇文章(https://www.cnblogs.com/meowv/p/12943699.html)完成了项目的全局异常处理和日志记录. 在日志记录中使用的静态方法有人指出写法不是很优雅,遂优化一 ...
- 4-11 CS后台项目-4 及 Redis缓存数据
使用Redis缓存数据 使用Redis可以提高查询效率,一定程度上可以减轻数据库服务器的压力,从而保护了数据库. 通常,应用Redis的场景有: 高频查询,例如:热搜列表.秒杀 改变频率低的数据,例如 ...
- 在NodeJS中使用Redis缓存数据
Redis数据库采用极简的设计思想,最新版的源码包还不到2Mb.其在使用上也有别于一般的数据库. node_redis redis驱动程序多使用 node_redis 此模块可搭载官方的 hiredi ...
- PHP Redis 缓存数据
// 注:只是在此做下记录,有兴趣的可以参考,不做实际教程文档// 配置文件define('CONFIG', [ 'redis-server' => '127.0.0.1', 'redis-po ...
- Redis缓存数据之简单逻辑
并发不高的情况: 读: 读redis->没有,读DataBase->把DB数据写回redis,有的话直接从redis中取: 写: 写DataBase->成功,再写redis: 并发高 ...
- redis缓存数据架构实战
redis命令参考:http://redisdoc.com/ 与memcache对比 redis安装配置 yum安装 yum -y install redis 源码安装 PS:make报错**问题:* ...
- redis缓存数据表
直观上看,数据库中的数据都是按表存储的:更微观地看,这些表都是按行存储的.每执行一 次select查询,数据库都会返回一个结果集,这个结果集由若干行组成.所以,一个自然而然 的想法就是在Redis中找 ...
- spring + redis 实现数据的缓存
1.实现目标 通过redis缓存数据.(目的不是加快查询的速度,而是减少数据库的负担) 2.所需jar包 注意:jdies和commons-pool两个jar的版本是有对应关系的,注意引入jar包是要 ...
- [转]在nodejs使用Redis缓存和查询数据及Session持久化(Express)
本文转自:https://blog.csdn.net/wellway/article/details/76176760 在之前的这篇文章 在ExpressJS(NodeJS)中设置二级域名跨域共享Co ...
随机推荐
- C#:判断当前程序是否通过管理员运行
原文:C#:判断当前程序是否通过管理员运行 public bool IsAdministrator() { WindowsIdentity current = WindowsIdentity.GetC ...
- Knockout应用开发指南
Knockout应用开发指南 第一章:入门 2011-11-21 14:20 by 汤姆大叔, 20799 阅读, 17 评论, 收藏, 编辑 1 Knockout简介 (Introductio ...
- sql datalength与len区别用法
原文:sql datalength与len区别用法 len ( string_expression )参数:要计算的字符串 len() 函数len 函数返回文本字段中值的长度. sql len() 语 ...
- CSS知识点:font小细节
font是用来设置网页字体属性的关键字,使用频率非常高,大家也比较熟悉.它有两种写法,一种是简写,一种分开写. 简写--font:italic bold 12px/20px arial,sans-se ...
- java中数据库通用层
/** * 数据库通用类 * */ public class ConnDB { /** * 获取数据库连接对象 * @return 数据库连接对象 * */ public static Connect ...
- Javascript技巧实例精选(4)—FTP网站登录的Javascript实现
FTP网站登录的Javascript实现 >>点击这里下载完整html源码<< 这是最后的截图 这是核心Javascript源码 function goFtpSite() { ...
- (转载)Log4Net 在多层项目中的使用小记
(原创)Log4Net 在多层项目中的使用小记 这几天刚好在调整一个项目,把一些自己不是很清楚的东西先试验一下,这篇文章主要是对我在项目中需要使用Log4Net的一些记录.网上有很多相关的教程,但是各 ...
- WCF入门教程(图文)VS2012
WCF入门教程(图文)VS2012 上一遍到现在已经有一段时间了,先向关注本文的各位“挨踢”同仁们道歉了.小生自认为一个ITer如果想要做的更好,就需要将自己的所学.所用积极分享出来,接收大家的指导和 ...
- Amazon前技术副总裁解剖完美技术面试
Amazon前技术副总裁解剖完美技术面试 投递人 itwriter 发布于 2014-03-03 14:30 评论(0) 有1729人阅读 原文链接 [收藏] « » 英文原文:The Anat ...
- json序列化NHibernate的实体
在使用nhibernate时,想将实体对象序列化成json字符串,然后打印在日志中. 序列化时会出现问题,应该是因为这个实体被hibernate管理的原因.具体原因没有分析. 解决方案:为实体创建一个 ...