三点须知:当我们在开发过程中需要用到分布式缓存Redis的时候
当我们在开发过程中需要用到分布式缓存Redis的时候,我们首先要明白缓存在系统中用来做什么?
1. 少量数据存储,高速读写访问。通过数据全部in-momery 的方式来保证高速访问,同时提供数据落地的功能,实际这正是Redis最主要的适用场景。
2. 海量数据存储,分布式系统支持,数据一致性保证,方便的集群节点添加/删除。Redis3.0以后开始支持集群,实现了半自动化的数据分片,不过需要smart-client的支持。
华为云分布式缓存Redis,目前已经进入Redis5.0公测阶段,公测阶段注册既能免费使用,那么我们在开发过程中需要用到Redisde 时候,需要明白哪些问题呢?
下面小编给大家一一道来。
一、为什么使用 Redis?
我觉得在项目中使用 Redis,主要是从两个角度去考虑:性能和并发。
当然,Redis 还具备可以做分布式锁等其他功能,但是如果只是为了分布式锁这些其他功能,完全还有其他中间件,如 ZooKpeer 等代替,并不是非要使用 Redis。因此,这个问题主要从性能和并发两个角度去答。
性能:
如下图所示,我们在碰到需要执行耗时特别久,且结果不频繁变动的 SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。
题外话:忽然想聊一下这个迅速响应的标准。根据交互效果的不同,这个响应时间没有固定标准。
不过曾经有人这么告诉我:"在理想状态下,我们的页面跳转需要在瞬间解决,对于页内操作则需要在刹那间解决。
另外,超过一弹指的耗时操作要有进度提示,并且可以随时中止或取消,这样才能给用户最好的体验。"
那么瞬间、刹那、一弹指具体是多少时间呢?
根据《摩诃僧祗律》记载:
一刹那者为一念,二十念为一瞬,二十瞬为一弹指,二十弹指为一罗预,二十罗预为一须臾,一日一夜有三十须臾。
那么,经过周密的计算,一瞬间为 0.36 秒、一刹那有 0.018 秒、一弹指长达 7.2 秒。
并发:
如下图所示,在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。

这个时候,就需要使用 Redis 做一个缓冲操作,让请求先访问到 Redis,而不是直接访问数据库。
二、使用 Redis 有什么缺点?
大家用 Redis 这么久,这个问题是必须要了解的,基本上使用 Redis 都会碰到一些问题,常见的也就几个。
回答主要是四个问题:
◆缓存和数据库双写一致性问题
◆缓存雪崩问题
◆缓存击穿问题
◆缓存的并发竞争问题
这四个问题,我个人觉得在项目中是常遇见的,具体解决方案,后文给出。
三、单线程的 Redis 为什么这么快?
这个问题是对 Redis 内部机制的一个考察。根据我的面试经验,很多人都不知道 Redis 是单线程工作模型。所以,这个问题还是应该要复习一下的。
回答主要是以下三点:
◆纯内存操作
◆单线程操作,避免了频繁的上下文切换
◆采用了非阻塞 I/O 多路复用机制
题外话:我们现在要仔细的说一说 I/O 多路复用机制,因为这个说法实在是太通俗了,通俗到一般人都不懂是什么意思。
打一个比方:小曲在 S 城开了一家快递店,负责同城快送服务。小曲因为资金限制,雇佣了一批快递员,然后小曲发现资金不够了,只够买一辆车送快递。
经营方式一:
客户每送来一份快递,小曲就让一个快递员盯着,然后快递员开车去送快递。
慢慢的小曲就发现了这种经营方式存在下述问题:
◆几十个快递员基本上时间都花在了抢车上了,大部分快递员都处在闲置状态,谁抢到了车,谁就能去送快递。
◆随着快递的增多,快递员也越来越多,小曲发现快递店里越来越挤,没办法雇佣新的快递员了。
◆快递员之间的协调很花时间。
综合上述缺点,小曲痛定思痛,提出了下面的经营方式。
经营方式二:
小曲只雇佣一个快递员。然后呢,客户送来的快递,小曲按送达地点标注好,然后依次放在一个地方。
最后,那个快递员依次的去取快递,一次拿一个,然后开着车去送快递,送好了就回来拿下一个快递。
上述两种经营方式对比,是不是明显觉得第二种,效率更高,更好呢?
在上述比喻中:
◆每个快递员→每个线程
◆每个快递→每个 Socket(I/O 流)
◆快递的送达地点→Socket 的不同状态
◆客户送快递请求→来自客户端的请求
◆小曲的经营方式→服务端运行的代码
◆一辆车→CPU 的核数
于是我们有如下结论:
经营方式一就是传统的并发模型,每个 I/O 流(快递)都有一个新的线程(快递员)管理。
经营方式二就是 I/O 多路复用。只有单个线程(一个快递员),通过跟踪每个 I/O 流的状态(每个快递的送达地点),来管理多个 I/O 流。
下面类比到真实的 Redis 线程模型,如图所示:

简单来说,就是我们的 redis-client 在操作的时候,会产生具有不同事件类型的 Socket。
在服务端,有一段 I/O 多路复用程序,将其置入队列之中。然后,文件事件分派器,依次去队列中取,转发到不同的事件处理器中。
需要说明的是,这个 I/O 多路复用机制,Redis 还提供了 select、epoll、evport、kqueue 等多路复用函数库,大家可以自行去了解。
当然以上三点只是皮毛而已,但却是最基本的,如果想了解更多详细的操作细则,可以去华为云官方论坛与各路大手子交流经验,大咖云集必能学到很多东西。
文中内容来自公众号“程序之心”
三点须知:当我们在开发过程中需要用到分布式缓存Redis的时候的更多相关文章
- C# Azure 存储-分布式缓存Redis在session中的配置
1. 开始 对于分布式的缓存,平常的session的处理是一个用户对应一台分布式的机器,如果这台机器中途挂机或者不能处理这个用户session的情况发生,则此用户的session会丢失,会发生不可预知 ...
- java中常用的几种缓存类型介绍
在平时的开发中会经常用到缓存,比如locache.redis等,但一直没有对缓存有过比较全面的总结.下面从什么是缓存.为什么使用缓存.缓存的分类以及对每种缓存的使用分别进行分析,从而对缓存有更深入的了 ...
- .NET Core应用中使用分布式缓存及内存缓存
.NET Core针对缓存提供了很好的支持 ,我们不仅可以选择将数据缓存在应用进程自身的内存中,还可以采用分布式的形式将缓存数据存储在一个“中心数据库”中.对于分布式缓存,.NET Core提供了针对 ...
- net开发过程中Bin目录net开发过程中Bin目录下面几种文件
.net开发过程中Bin目录下面几种文件格式的解释 在.NET开发中,我们经常会在bin目录下面看到这些类型的文件: .pdb..xsd..vshost.exe..exe..exe.config..v ...
- 项目开发过程中什么是开发环境、测试环境、生产环境、UAT环境、仿真环境?
项目开发过程中什么是开发环境.测试环境.生产环境.UAT环境.仿真环境? 最近在公司项目开发过程中总用到测试环境,生产环境和UAT环境等,然而我对环境什么的并不是很理解它的意思,一直处于开发阶段,出于 ...
- git开发过程中的使用流程
001.创建仓库 002.新建项目 003.初始化仓库 这一步不需要做 git init : 文件夹中会多出一个隐藏的.git文件 004.克隆项目 git clone <项目地址> 0 ...
- 【git】------git开发过程中的使用流程------【巷子】
001.创建仓库 002.新建项目 003.初始化仓库 这一步不需要做 git init : 文件夹中会多出一个隐藏的.git文件 004.克隆项目 git clone <项目地址> 0 ...
- 小程序红包开发跳坑记 微信小程序红包接口开发过程中遇到的问题 微信小程序红包开发
现在做小程序的越来越多,商家推广也是一个瓶颈,谁不发点红包,都很难找到人来用你的微信小程序了.于是不管你开发什么小程序功能,你或多或少都要用到小程序来发红包吧. 我们自己之前做公众号发红包,做了两三 ...
- PHP开发过程中数组汇总 [ 持续更新系列 ]
开发过程中经常会使用到数组函数,故特地总结出来,自己熟悉,同时供大家参考!(实例部分会抽空尽快完成) 一.目录 array_merge(); 合并数组 array_keys(); array_filt ...
随机推荐
- .NET获取IIS7.0及以上版本托管服务信息
近期写了个扫描IIS托管站点然后定期注册到Consul的小工具,随意网上拷贝了个帮助类,搞完本机测试没问题,扔到服务器发现硕大的一个异常.. System.Runtime.InteropService ...
- Python 学习笔记(十五)Python类拓展(一)继承
继承 继承(Inheritance):是面向对象软件技术当中的一个概念.如果一个类别A "继承自" 另一个类B,就把这个A称为“B的子类”,而把B称为“A的父类”,也可以称“B是A ...
- No MyBatis mapper was found in '[com.wuji.springboot]' package. Please check your configuration
No MyBatis mapper was found in '[com.wuji.springboot]' package. Please check your configuration. 这个原 ...
- File、Paths和Files类的使用详解
Paths:通过get()方法返回一个Path对象,Path用于表示文件路径和文件. Files:提供了大量处理文件的方法,例如文件复制.读取.写入,获取文件属性.快捷遍历文件目录等..... Fil ...
- #leetcode刷题之路17-电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合.给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例:输入:"23"输出:["a ...
- centos7添加新网卡实现双IP双网关
问题背景: 业务需要,针对业务需要不同地域的机构访问,所以需要在同一台机器上配置不同IP并配置不同网关,实现不用机构可以访问同一台服务器办理业务. 系统环境: centos linux7 网络环境: ...
- 在js内生成PDF文件并下载的功能实现(不调用后端),以及生成pdf时换行的格式不被渲染,word-break:break-all
在js内生成PDF文件并下载的功能实现(不调用后端),以及生成pdf时换行的格式不被渲染,word-break:break-all 前天来了个新需求, 有一个授权书的文件要点击下载, 需要在前端生成, ...
- laravel when 的用法
当你在使用where语句有前提条件时,比如某值为1的时候才执行where子句,否则不执行,这个时候,laravel5.5新出了一个简便方法when($arg,fun1[,fun2]). 具体用法如下: ...
- ls 的详细使用
ls是list的缩写,list--清单 ls 是显示文件 如查看root下的所有信息 如果要以列表的形式显示文件详细信息可使用ls -all或ls -al(包括以“.“开头的隐藏文件) 如果你想查看某 ...
- 树莓3B+_Raspbian 源使用帮助
https://mirrors.ustc.edu.cn/help/raspbian.html Raspbian 源使用帮助 地址 https://mirrors.ustc.edu.cn/raspb ...