redis缓存功能结合实际项目面试之问题与解析

在项目中Redis的作用

1、将user缓存到Redis中,获取user时,先从Redis获取。取不到时,则从数据库中查询,再缓存到Redis中。因为很多界面都要用到user信息,并发时,频繁的访问数据库,会导致数据库崩溃。变更数据库时,先更新数据库,再清空缓存;

2、验证码,原本添加到session中,减轻服务器压力。将验证码存到Redis中,方便查询检验;

3、登录凭证:原本添加到MySQL中,为减轻每次登录都去查询数据库的压力,将登录凭证ticket缓存在Redis中,防止每次都要进行数据库的查询,提高并发能力。退出登录时,原本要修改数据库中的登录凭证,现在只需要修改Redis即可。

4、Redis缓存帖子分数统计,用set,去重的添加有变动的帖子,在新建帖子,点赞帖子,评论帖子,加精帖子处,添加Redis对分数列表的更新,最后取出帖子分数进行比较计算,实现热帖功能;

5、Redis缓存用户点赞数用String类型,以用户ID为key,点赞时,自增,取消赞时,自减;

缓存实体点赞数,set类型,用户给实体点赞时添加进列表,取消赞时则移除,最后用size统计;

原因:嗯嗯,主要还是第二点把?主要考虑到这个entityType(帖子还是评论)和 entityId(这个类型下的目标)确定redis的键值, 而redis的值使用set类型而不是一个简单的整数类型,这主要是为了可能需求发生变化,我们存的是点赞人的userid,这样我就可以看到谁给我点了赞,同时set有去重功能,能够统计多少人点了赞。如果用string的话就不好处理。

6、缓存粉丝列表,使用zset,存入粉丝的id和关注的时间戳,使用zCard获得粉丝数量。利用reverseRange的时间抽反向排序,按关注时间加载粉丝列表。

Redis:一站式高性能存储方案

·Redis是一款基于键值对的NoSQL(Not only sql:非关系型数据库)数据库,它的值支持多种数据结构;

字符串(String)、哈希(hashes)、列表(lists)、集合(zset)、有序集合(sorted sets)

·Redis将所有的数据都存放在内存中,读写能力惊人;

同时,Redis还可以将内存中的数据以快照(将内存中的数据原封原样的存放到硬盘上,但是效率较低,可能会有阻塞,不适合实时的做)或日志(存的是Redis的操作命令,可以实时存储,但是恢复时很慢)的形式保存在硬盘上,以保证数据的安全性,不会因为关闭系统而丢失数据;

·Redis的典型应用场景包括:缓存(访问频繁的数据)、排行榜(热贴排行:访问频繁的帖子的访问量高)、计数器(帖子的计数器:计数器的值变化很快)、社交网络(点赞、关注)、消息队列等。

·点赞------考虑到可能同时有多个人对帖子点赞,需要考虑到性能的问题

-支持对帖子、评论点赞

-第一次点赞,第二次取消点赞

·首页点赞数量

-统计帖子的点赞数量

·详情页面点赞数量

-统计点赞数量

-显示点赞状态

为了使Redis的key可以反复的复用:在util包下创建工具类来生成需要的key

根据不同的实体来拼接key

Redis的使用场景

1、缓存

缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站的访问速度,还能大大降低数据库的压力。

2、排行榜

很多网站都有排行榜应用,如京东的月度销售榜单,商品按时间上新排行榜等。Redis提供有序集合数据结构能够实现复杂的排行榜应用;

3、计数器

什么是计数器:如电商网站商品的浏览量,视频网站的播放量等等,为了保证数据实时有效,每次浏览都会+1,并发量高时,如果每次都请求数据库操作无疑是巨大的压力。Redis提供incr(increment、decrement)命令来实现计数器功能,内存操作,性能非常好,适用于这些计数器场景。

4、分布式会话

集群模式下,在应用不多的情况下一般使用容器自带的session复制功能就能满足,当应用增多相对复杂的系统中,一般都会搭建以Redis等内存数据库为中心的session服务,session不再由容器管理,而是由session服务以及内存数据库管理,可以实现集群中不同服务器对消息响应的一致性。

5、社交网络

点赞、踩、关注、共同好友等是社交网站的基本功能,社交网站的访问量通常较大,而且传统的关系型数据库不适合存储这种类型的数据,Redis提供的哈希、集合等数据结构能很方便的使用这些功能;

单线程的Redis

Redis为什么这么快?

  1. 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速,数据存储在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
  2. 数据结构简单,对数据操作也简单,Redis中的数据结构是专门设计的;
  3. 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗CPU,不用去考虑各种锁的问题,不存在加锁和释放锁的操作,没有因为可能出现死锁而导致的性能消耗;
  4. 使用多路I/O复用模型,非阻塞I/O;

Redis为什么是单线程的?

因为Redis是基于内存的操作,CPU不再是瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。所以对于Redis来说,单线程和多线程的结果都差不多,还不如使用单线程减少线程切换的消耗。

Redis单线程有什么安全风险吗?

因为Redis是单线程的,所以很大程度上避免了线程安全的风险。

Redis的持久化机制----持久化:将内存的数据同步到硬盘上

RDB----快照

将内存的内容完全复制到磁盘上,但效率较低,而且可能会导致阻塞,不能实时同步

AOF----日志

保存Redis操作的指令到日志中,效率很高,可以实时同步,将来还原数据时只需要将Redis指令重新执行一遍即可;

1)aof文件比rdb更新频率高,优先使用aof还原数据;

2)aof比rdb更安全也更大;

3)rdb性能比aof好

4)如果两个都配了优先使用aof

Redis的主从架构

单机模式

特点:简单

问题:

1、内存容量有限;2、处理能力有限;3、无法高可用;

主从复制

Redis的复制功能允许用户根据一个Redis服务器来创建任意多个该服务器的复制品,其中被复制的服务器为主服务器(master),

而通过复制创建出来的服务器复制品则为从服务器(slave)。只要主从服务器之间的网络连接正常,主从服务器两者会具有相同的数据,主服务器就会一直将发生在自己身上的数据更新同步给从服务器,从而一直保证主从服务器的数据相同。

特点:

1、master/slave角色

2、master/slave数据相同

3、降低master读压力再转交从库

问题:

无法保证高可用

没有解决master写的压力

哨兵

Redis sentinel是一个分布式系统中监控Redis主从服务器,并在主服务器下线时自动进行故障转移。

其中三个特性:

监控(monitoring):sentinel会不断地检查你的主服务器和从服务器是否正常运行;

提醒(Notification):当被监控的某个Redis服务器出现问题时,sentinel可以通过API向管理员或者其他应用程序发送通知;

自动故障迁移(Automatic failover):当一个主服务器不能正常工作时,sentinel会开始一次自动故障迁移操作。

特点:

1、保证高可用

2、监控各个节点

3、自动故障迁移

缺点:主从模式,切换需要时间丢数据,没有解决master的写压力;

集群(proxy型)

Twemproxy是一个Twitter开源的一个Redis和memecache快速/轻量级代理服务器;Twemproxy是一个快速的单线程代理程序,支持Memcached ASCll协议和Redis协议。

特点:1、多种哈希算法:MD5、CRC16、CRC32、CRC32

2、支持失败节点自动删除

3、后端Sharding分片逻辑对业务透明,业务方的读写方式和操作单一Redis一致

缺点:增加了新的proxy,需要维护其高可用。

Redis的穿透和雪崩

缓存穿透

缓存穿透是指缓存和数据库中都没有的数据

一般缓存系统,都是按照key去查询缓存,如果不存在对应的value,就应该去后端系统查找(比如数据库)。一些恶意的请求会故意的查询不存在的key,当key不存在时会去数据库查找,导致大量的数据库操作,对系统的后端压力巨大,这就是缓存穿透:

如何避免?

1、对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert之后清理缓存;

2、对一个不存在的key进行过滤。可以把所有可能存在的key放大一个大的map中,查询时通过该map进行过滤;

缓存击穿

一般指缓存中没有,但是数据库中有该数据,缓存击穿一般是在同一段时间内访问同一个数据,该数据在缓存中超时失效,导致大量的请求直达数据库,导致数据库压力增大。

缓存雪崩

当服务器重启或者大量缓存集中在某一个时间段内失效,这样在失效的时候,如果有大量的请求访问缓存,由于缓存中的数据都失效了,就会到数据库中进行查找,导致数据库瞬间的访问量飙升,导致系统崩溃。

解决方法:

1.在缓存失效后,通过加锁或者队列来控制读数据库写缓存线程数量。比如对某一个key只允许一个线程查询数据和写缓存,其他线程等待;

2.做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期;

3.不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀.

相关推荐
岁岁种桃花儿1 小时前
一文了解什么是短网址以及他的做用是什么
网络·nginx·dns·短网址
老蒋新思维1 小时前
创客匠人峰会复盘:AI 赋能 IP 创新增长,知识变现的 4 大实战路径与跨行业案例
大数据·网络·人工智能·tcp/ip·创始人ip·创客匠人·知识变现
大隐隐于野1 小时前
SMC-R透明加速TCP技术,在Redis场景下的应用实践
网络
阿蔹1 小时前
Selenium---控制窗口、manage()方法
java·selenium·测试工具·面试
北方的流星1 小时前
园区网络综合实训
网络·智能路由器
LeeZhao@1 小时前
【狂飙全模态】狂飙AGI-智能图文理解助手
数据库·人工智能·redis·语言模型·机器人·agi
kkk_皮蛋1 小时前
WebRTC 核心技术:P2P 打洞原理
网络·网络协议·p2p
xixixi777771 小时前
讲一下卫星移动通信网络(系统架构、核心技术与协议挑战及应用场景和战略价值)
网络·学习·安全·信息与通信·通信·卫星通信
chuxinweihui1 小时前
传输层协议UDP,TCP
网络·网络协议·tcp/ip·udp