Redis是什么?架构是怎么样的?

打印 上一主题 下一主题

主题 1764|帖子 1764|积分 5292

目录
媒介
一,Redis架构
1.1 本地缓存
1.2 长途缓存
二,强盛的Redis长处
2.1 支持多种数据类型
2.2 内存过期策略
2.3 内存镌汰策略
2.4 长期化
三,Redis是什么


媒介

我是一个程序员,维护了一个商品服务,它的背后直连Mysql数据库,假设商品服务对外每秒必要提供1万次查询,但背后的mysql每秒只能提供每秒5K次的查询,那mysql肯定顶不住,分分钟压垮,这种大流量场景很常见,好比双十一购物,春节抢车票.

那么题目来了?有没有什么办法在Mysql不被压垮的同时,让商品服务支持每秒!万次的查询?当然有!没有什么是加一层中间层不能解决的,假如有,那就再加一层,这次我们要加的中间层就是Redis.

一,Redis架构

我们知道查询内存的速度要比查询磁盘要快,Mysql的数据主要存放在磁盘里,假如能将Mysql的数据放在内存里,完全不走磁盘,那必然能大大提拔查询性能

1.1 本地缓存

对于上面的题目,我们很容易想到,在我们商品服务中申请一个内存字典,python中就是dict,java中就是map,此中Key是商品ID,value是商品数据,通过商品ID就能查到商品数据

当我们发生查询时,优先去查询内存字典,没有结果再跑到Mysql的数据库里查询,并将查询到的结果放在我们的数据字典里面,并返回给用户,这样下次就能从内存里面查出来啦,像这种在服务内存放数据的内存,就是所谓的本地缓存,有了本地缓存的加持,真正打到Mysql的查询就会少许多

1.2 长途缓存

为了保证服务高可用,商品服务经常不止一个实例,假如每个实例都重复缓存一份本地内存,那就有些浪费内存条,以是更好的解决方案就是,将这部门字典内存抽出来,单独做一个服务,他就是长途缓存服务.

但题目又来了,多个商品服务,去读写同一分长途缓存,会存在并发题目,那怎么办?很简单,对外我们不管有多少个网络毗连,收到读写下令后,都同一塞到一个线程上,再一个线程上对字典举行读写,这样什么并发题目,线程切换开销,完全不存在

这个长途缓存服务足以满足大部门场景,但是他过于大略,下来我们看如何优化它!!!
二,强盛的Redis长处

2.1 支持多种数据类型

如上面所说的长途缓存服务里只有一个字典类型,key和value都是字符串,但是我们平时写代码的时候还会用到其他内存里的数据布局,例如python的list,set,因此在Redis中对value举行了扩展
        1,支持先进先出的队列List
        2,支持去重的Set
        3,支持排序的ZSet
这样缓存服务就更强了
2.2 内存过期策略

当我们的缓存服务支持的数据布局类型变多了之后,塞到内存里的数据就会越来越多,内存又小又贵,那该怎么办呢?

我们可以给缓存里的数据加一个过期时间,一旦数据过期就从内存里删掉,可以很大程度上延缓内存增长速度,那么那些数据该设置多长时间过期?这个就交给用户方去做判定,让用户通过EXPIRED下令来指定那些数据多久过期
2.3 内存镌汰策略

但假如大家都不设置过期时间,内存还是会爆炸!这该如何解决?就是在内存接近上限的时候,根据一些策略删除一些内存,好比可以将近来最少利用的内存删掉,这样不但解决了内存题目,还能让缓存里面的数据都是热点数据,一箭双雕
2.4 长期化

MySql之以是过得这么惬意,那是由于前面有个缓存服务挡住了大部门流量,一旦缓存服务重启,那内存数据就丢了,这时候流量就会全部打到Mysql身上,这时候Mysql又就原地爆炸了.

因此我们还必要给内存服务加入最大程度的长期化保证,确保服务重启后什么数据都没有,于是可以在缓存服务里面加一个异步子进程,定期将全量内存数据长期化到磁盘文件里,当重启服务的时候就会加载之前的内存数据

三,Redis是什么

上面我们说了这么多,再回头来看看Redis到底是什么?我们从开始的一个大略的缓存服务慢慢就变成了一个高性能,高可用,支持多种数据类型,支持各种缓存镌汰策略,并提供肯定长期化本领的超强缓存服务,这就是我们常说的Redis




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

温锦文欧普厨电及净水器总代理

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表