#### Redis 实际应用中的缓存作用
* * * * *
在软件架构设计时,不但要注重可靠性、安全性、可扩展性以及可维护性等等的一些指标,更要注重用户的体验,用户体验分很多方面,但是有一点非常重要就是对用户操作的响应;怎样提高用户访问的响应速度,这就是摆在架构设计中必须要解决的问题;说到提高服务的响应速度就不得不说缓存了;从系统的层面说,CPU的速度远远高于磁盘IO的速度;所以要想提高响应速度,必须减少磁盘IO的操作,但是有很多信息又是存在数据库当中的,每次查询数据库就是一次IO操作;比如查询用户信息的例子,通常如下图:
![](https://box.kancloud.cn/2b2e4506c0bffa7cf4d570624b627573_661x447.png)
请求响应时间等于网络响应时间和服务器响应时间;网络我们控制不了,服务器响应时间包括CPU计算时间和磁盘IO时间,其中CPU计算时间这个有硬件资源决定的,我们尽量减少算法的复杂度来减少它,磁盘IO时间,这个时间是非常慢的,应该尽量减少;
当客户端调用getUser接口的查询用户信息的时候,执行顺序1、2、3、4;由于用户信息存放在DB中,所以2、3就有一次磁盘IO;这个看似非常简单业务逻辑,但是当你做架构设计的时候往往要考虑最坏的场景,或者当成千上万的用户频繁的调用这个接口应该怎么处理?如果按照上图这样的架构处理,这个看似简单业务的接口会使整个系统变慢,这样用户的请求就会长时间得不到响应;这样的问题怎么解决那,这时候就该缓存登场了;
谈到缓存有几种形式,其中最简单的是在每个进程中开辟一块内存,存放缓存的信息,每次先从内存查… … 但是在一个分布式或者集群的环境中,getUser的接口可能会部署多套,每个进程的的内存是不能共享、相互独立的,这就悲剧了;还有一种使用一个第三方的缓存也叫公共缓存(比如redis、memcache等);不论部署多少个包含getUser接口的服务,都去访问同一套缓存,那结果就不一样了,看一下下面这幅图:
![](https://box.kancloud.cn/fd2c1b9d24ff862fb0dce8b55a5fda59_822x447.png)
当用客户端调用getUser接口查询用户信息的时候,getUser接口直接去redis中查询,如果redis中有该用户信息,直接返回,避免查询DB,从而避免了磁盘IO操作;如果redis中没有该用户信息,则从DB查询,并且把该用户信息存放到redis中;这样在服务接口(getUser)和DB中间,增加了一个缓存层;看似逻辑增加了,其实当面对高并发,频繁查询用户信息的时候,只有第一次查询有磁盘IO操作,以后只要redis中存在就没必要再查询数据库了;redis所有数据都在内存操作,由于没有了磁盘IO操作,所以速度将会大大的提升;
我们上面用到的缓存是redis,其实常用的还有memcache等,它们都提供了集群模式,并且都是直接内存操作,所以速度特别快,也是目前业内使用的比较热门的技术;redis相对于memcache提供了更丰富的数据类型,根据不同的业务场景可以选在不同的数据类型;redis本身也提供了主从模式、集群模式;也有第三方的比如codis提供了redis集群解决方案;这次咱们主要聊缓存在架构设计中的作用,等有机会详细介绍redis的使用;
总之一句话,要想提高系统的性能,尽量减少IO的操作,特别是磁盘IO的操作;使用缓存可以有效的避免这种情况;所以在架构设计过程中,社交到查询数据库的时候,应该考虑一下是不是考虑使用缓存技术来提高系统的性能,并且降低数据库的负载。
* * * * *
转载于:http://blog.csdn.net/weis_2007/article/details/50678281
- 目录
- 安装扩展
- 在 Windows 上安装 PHP 扩展
- 测试Redis扩展函数
- 教程
- 简介
- Redis 安装
- Redis 配置
- 运行
- 测试
- 书籍
- 《Redis开发与运维》
- 《Redis入门指南》
- 《Redis实战》
- 《当 Redis 遇上 ThinkPHP5》
- 参考站点
- 下载
- 命令参考
- 管理工具
- 视频
- 云数据库 Redis 版使用教程
- Redis 深入之道
- Redis高可用教程
- Redis入门
- NoSQL概述
- Redis概述
- Redis安装
- Jedis入门
- PHP命令
- PHP中利用Redis管道加快执行
- Hash操作
- Set操作
- Gearman
- MySQL - Redis配合使用方案
- 应用场景
- 缓存应用
- Redis实现简单的条件查询功能
- 获取网站中点击量最高的前n篇文章
- 显示最新的项目列表
- 排行榜相关
- 设计技巧
- SortedSets
- List列表
- 消息队列
- 最新文章
- Set集合
- 共同好友
- 独立 IP
- Linux教程
- 常用命令
- 哈希命令
- 字符串
- 集合
- 有序集合
- Redis 有序集合命令
- 有序集合命令(中)
- 发布订阅
- 用例
- 列表
- Lindex
- Ltrim
- Rpush
- Lset
- Llen
- Lpush
- 信息
- info memory
- 安装
- 数据类型
- Redis管道(pipeline)
- Memory Command
- 阿里云Redis
- 架构
- 4.0版本
- Redis 4.0 新功能介绍
- Redis Desktop Manager
- 创建hash列表数据
- Lua: 给 Redis 用户的入门指导
- Lua入门
- 乐观锁介绍
- 悲观锁介绍
- 脏数据
- Redis核心概念
- Redis事务
- Lua
- 在Redis中使用lua脚本
- php-redis
- mysql缓存服务器
- redis setnx 实现分布式锁和单机锁
- 为什么分布式一定要有Redis?