分布式中间件之Redis

what is Reids?

redis是一个内存式数据库,它支持五种数据类型string、hash、list、set、zset

why use the Redis?(从性能和并发两个角度出发)

性能:碰到执行时间久且sql变化不大的操作,适合放进redis中redis一秒能进行十几万的I/O大大缩短了请求时间。

并发:大并发情况下,所有请R求直接访问数据库会导致数据库压力大,可能导致系统崩溃或者宕机,redis可以减少数据库的压力。

    redis缺点

                1.缓存和数据库双写一致性问题

                2.缓存雪崩问题

                3.缓存穿透问题

                4.缓存的并发竞争问题

    为什么redis这么快

                1.纯内存操作

                2.单线程操作,避免了频繁的上下文切换

                3.采用了非阻塞I/O多路复用机制

    redis主从复制:主节点负责写操作,从节点负责读数据,定期主节点会同步数据给子节点

    主从的缺点

                1.主从复制,若主节点出现问题,则不能提供服务,需要人工修改配置将从变主

                2.主从复制主节点的写能力单机,能力有限

                3.单机节点的存储能力也有限

       哨兵机制:解决主从的缺点

    哨兵机制的高可用:当节点出现故障时,由哨兵自动完成故障发现和转移,并通知应用方实现高可用,整个过程只需要一个哨兵完成(采用选举算法选举出来一个哨兵来完成转移和通知)

    无磁盘复制分析:将redis的数据生成一个RDB文件,服务器会将这个文件发送给slave服务器,slave服务器将读取这个RDB文件最终做到数据一致性

    Redis管道技术:一种异步接收请求方式,客户端发送多条请求不用像同步那样等待其返回结果,管道对请求进行压缩在进行处理大大提高了系统性能

    Redis缓存与数据库一致性问题解决方案

              1.采用延时双删策略:在写数据库之前先删缓存并设置合理的超时时间,具体步骤是:先删除缓存,再写数据库,休眠500毫秒、再次删除缓存

                            缺点:在超时时间内数据存在不一致,而且又增加了写请求的耗时

              2.异步更新缓存(基于订阅binlog的同步机制):读取mysql的binlog进行分析得到写入数据,把写入数据发送给订阅消息中间件,得到最新数据进行更新redis

    redis持久化机制

            1.AOF持久化:对每条写入命令作为日志,以append-only模式写入一个日志中,在redis重启时通过AOF来构建数据

                    优点:

                            a)AOF能更好的保护数据不丢失,AOF会每隔1s执行一次fsync操作

                            b)AOF以append-only的模式,没有任何磁盘寻址的开销,写入性能能高

                            c)AOF日志文件可进行读写的(如果数据被flushall的话,没有执行rewrite可以通过修改AOF日志来恢复数据)

                    缺点:

                            a)同一份文件AOF的文件比RDB大,AOF大到一定程度会做rewrite生成一个小文件将大文件删除

                            b)AOF比RDB支持的写的QPS低

                            c)恢复数据慢,不适合冷备份

            2.RDB持久化:对redis中数据执行周期性的持久化

                    优点:

                            a)每个时候redis的数据,RDB都会生成一个数据文件存储,这种方式适合做冷备

                            b)RDB对redis对外提供读写服务影响很小,redis主进程只需要fork一个子进程出来对磁盘IO进行RDB持久化

                            c)在恢复大数据集时RDB比AOF的速度快

                    缺点:

                            a)redis故障时RDB的丢失数据量比AOF大

                            b)RDB每次fork出子进程来执行生成文件时,如果文件大可能会导致客户端暂停服务

    RDB和AOF到底改如何选择?

                1)不要只使用RDB会丢失大量文件

                2)不要只使用AOF,RDB生成的快照更加健壮,AOF做冷备没有RDB做的冷备恢复数据快

                3)结合两者的优点进行使用, 使用AOF做数据不丢失和恢复数据,使用RDB做不同程度的冷备,在AOF丢失或者损坏不可用时使用RDB进行快速的数据恢复

    Redis使用常见问题及性能优化思路

                1)fork耗时导致高并发请求延时:RDB和AOF时会生成RDB快照,AOF rewrite消耗磁盘IO的过程,fork在拷贝父进程的空间内存页表会消耗一定的时间

                        优化思路:fork耗时跟redis主进程的内存有关,redis尽量控制在10GB以内

                2)AOF的阻塞问题:redis将数据写入AOF缓存每秒开一个fsync操作,主线程会检查两次fsync如果两者时间相差超过两秒,整个redis将被拖慢

                        优化思路:采用SSD提高硬盘写入速度

                3)主从复制延迟问题

                        优化思路:主从复制会导致超时严重,需要做好良好的监控和报警机制

                4)主从复制风暴问题:让多个slave从master去执行全量复制,一份大的RDB同时发送到多个slave会导致网络带宽被严重占用

                        优化思路:master挂载多个slave尽量使用树状结构,不使用星型结构

    缓存击穿,缓存雪崩,缓存穿透的概念及其预防措施

        缓存击穿:数据库和缓存没有数据,用户还不断发起请求。(ex:发送id特别大但不存在数据或者id为-1的数据,这样会导致数据库压力过大)

                解决方案:

                        1.接口校验请求的参数是否合法

                        2.缓存取不到数据,数据库也没有取到,将key-value改为key-null,缓存设置较短的超时时间

        缓存雪崩:缓存中数据大批量到过期时间,请求的查询数据量巨大,引起数据库压力过大甚至down机

                解决方案:

                        1.针对数据的需求设置不同的到期时间

                        2.对于长期使用且数据基本不变的进行永久性保存

                        3.缓存服务集群部署

        缓存击穿:大并发对一个key持续访问,当这个key失效的瞬间,大并发将击穿缓存直接访问数据库

                解决方案:

                        1.热点数据实现缓存永远有效

                        2.采用互斥锁来缓存数据

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容

  • 一、Redis高可用概述 在介绍Redis高可用之前,先说明一下在Redis的语境中高可用的含义。 我们知道,在w...
    空语阅读 1,596评论 0 2
  • 企业级redis集群架构的特点 海量数据 高并发 高可用 要达到高可用,持久化是不可减少的,持久化主要是做灾难恢复...
    lucode阅读 2,202评论 0 7
  • NOSQL类型简介键值对:会使用到一个哈希表,表中有一个特定的键和一个指针指向特定的数据,如redis,volde...
    MicoCube阅读 3,963评论 2 27
  • 昨晚做了一个梦,梦里我在尿尿,尿了好久就是尿不出来。然后我残存的一丝大脑理智告诉我,等我真的要尿的时候,我的身体会...
    草全世界阅读 225评论 0 2
  • 不算是什么技术点,但防止下次忘记安装流程又到处搜,因此贴出来mark一下 大致流程homebrew->RVM->R...
    AlenChen阅读 590评论 0 51