redis常用知识梳理

1. redis存在的问题(常见):

缓存与数据库双写一致性

缓存穿透

缓存击穿

缓存雪崩

并发竞争问题

2. redis是一个单线程的工作模型,获取数据效率高。

纯内存操作

单线程操作,避免上下文切换

非阻塞I/O多路复用模式(只有单个线程,通过跟踪每个I/O流的状态,来管理多个I/O流。)

3. redis存储的数据类型及对应用法:

String:一般用于做一些复杂的计数等功能

hash:存放结构化的对象,便于操作其中的某个字段,如单点登录、session控制等。

list:类似消息队列的使用时。利用lrange命令,做基于redis的分页功能,性能极佳,用户体    

验好。取行情信息。就也是个生产者和消费者的场景。

set:全局去重。

sorted set:类似排行榜。

4. redis过期策略及淘汰机制:

定期删除+惰性删除机制。

定期删除:redis每隔100ms随机抽样检查是否有过期的KEY。单纯使用此方式可能会导致部分key过期后无法删除。

惰性删除:每次使用到一个KEY时,都检查一下是否过期。如过期则删除。两种删除方式均使用的情况下,仍然会存在一部分KEY过期了且一直未使用,还是无法删除。

配置内存淘汰策略:# maxmemory-policy volatile-lru

noeviction:内存不足时,写入报错。(一般不使用)

allkeys-lru:内存不足时,写入新KEY,移除掉不常使用的。(使用较多)

allkeys-random:内存不足时,写入新KEY,随机删除已有的KEY。(一般不用)

volatile-lru:内存不足时,写入新KEY,删除设置过期时间的KEY空间中最不常使用的。(把redis既当缓存,又做持久化存储的时候才用)

volatile-random:内存不足时,写入新KEY,随机删除设置过期时间的KEY空间中的KEY。

volatile-ttl:内存不足时,写入新KEY,删除设置过期时间的KEY空间中设置了更早过期时间的KEY。

ps:如果没有设置 expire 的key, 不满足先决条件(prerequisites); 那么 volatile-lru, volatile-random 和 volatile-ttl 策略的行为, 和 noeviction(不删除) 基本上一致。

5. redis与数据库的双写一致性:

先更新数据库,再删缓存。其次,因为可能存在删除缓存失败的问题,提供一个补偿措施即可,例如利用消息队列。

6.1 redis缓存穿透:

黑客故意去请求缓存中不存在的KEY,导致所有的请求都怼到数据库上,从而数据库连接异常。

解决方式:

利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试

采用异步更新策略,无论key是否取到值,都直接返回。value值中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。需要做缓存预热(项目启动前,先加载缓存)操作。

提供一个能迅速判断请求是否有效的拦截机制,比如,利用布隆过滤器,内部维护一系列合法有效的key。迅速判断出,请求所携带的Key是否合法有效。如果不合法,则直接返回。

6.2 redis缓存击穿:

黑客故意去请求缓存中的热点key,当KEY失效时,大量请求直接击穿了缓存,到了数据库上。

解决方案:

可以将热点数据设置为永远不过期;或者基于 redis or zookeeper 实现互斥锁,等待第一个请求构建完缓存之后,再释放锁,进而其它请求才能通过该 key访问数据,或可以在凌晨服务器访问量较小的时候进行数据更新进数据库,同时使用linux定时任务写一个脚本来模拟访问热门数据将数据加载回redis。

7. redis缓存雪崩:

缓存同一时间大面积的失效,这个时候又来了一波请求,结果请求都怼到数据库上,从而导致数据库连接异常。

解决方案:

给缓存的失效时间,加上一个随机值,避免集体失效

使用互斥锁,但是该方案吞吐量明显下降了。

双缓存。我们有两个缓存,缓存A和缓存B。缓存A的失效时间为20分钟,缓存B不设失效时间。自己做缓存预热操作。然后细分以下几个小点:

从缓存A读数据库,有则直接返回。

A没有数据,直接从B读数据,直接返回,并且异步启动一个更新线程。

更新线程同时更新缓存A和缓存B。

8. redis并发,竞争KEY:

多个子系统去set一个key。

解决方式:

如果对这个key操作,不要求顺序:准备一个分布式锁,大家去抢锁,抢到锁就做set操作即可

如果对这个key操作,要求顺序:存储数据时存入一个时间戳,后面抢到线程的进程处理时,先根据时间戳判断。

9. redis持久化方式:

快照(rdb-redis database):将存储在内存的数据以快照的方式写入二进制文件中。

每隔一段时间,对内存中的数据进行一次快照,保存到rdb文件中,主从同步可以实现异步。但是,如果间隔时间过短会影响到redis的性能,如果间隔时间过长,在间隔时间段内关闭或重启redis可能导致部分数据丢失。

仅附件文件(AOF-append only file):使用AOF持久时,服务会将每个收到的写命令通过写函数追加到文件中(appendonly.aof)。

随着时间增长,aof文件会越来越大,可能会让进程如同假死一样。

10. redis的主从复制:

主节点:负责写数据,定期同步数据到从节点。

从节点:负责读数据。

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

推荐阅读更多精彩内容

  • NOSQL类型简介键值对:会使用到一个哈希表,表中有一个特定的键和一个指针指向特定的数据,如redis,volde...
    MicoCube阅读 3,958评论 2 27
  • 1.1 资料 ,最好的入门小册子,可以先于一切文档之前看,免费。 作者Antirez的博客,Antirez维护的R...
    JefferyLcm阅读 17,032评论 1 51
  • 一、Redis 1、概述 Redis是速度非常快的非关系型内存键值数据库,可以存储键和物种不同类型的值之间的映射。...
    落地生涯阅读 780评论 0 3
  • 类型常量 对象的名称REDIS_STRING 字符串对象REDIS_LIST 列表对象REDIS_H...
    青城楼主阅读 208评论 0 1
  • 1、没有路费走不了远方,沒有学费进不了课堂,学习不交费,永远学不会! 2、专一,不是一辈孑只爱一个人,而是爱一个人...
    刘聪_979a阅读 49评论 0 0