软考系统架构师案例-Redis考点

zhangzhijun 94次浏览 0个评论

1.什么是Redis?它主要用来做什么的?

Redis,英文全称是Remote Dictionary Server (远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。与MySQL数据库不同的是,Redis的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过10万次读写操作。因此redis被广泛应用于缓存,另外,Redis也经常用来做分布式锁。除此之外,Redis支持事务、持久化、LUA脚本、LRU驱动事件、多种集群方案。

2.Redis的基本数据结构类型。

2.1Redis的五种基本数据类型。字符串、哈希、列表、集合、有序集合。

2.2Redis的三种特殊数据类型。Geo: Redis3.2推出的, 地理位置定位,用于存储地理位置信息,并对存储的信息进行操作。HyperLogLog:用来做基数统计算法的数据结构,如统计网站的UV。Bitmaps:用一个比特位来映射某个元素的状态,在Redis中,它的底层是基于字符串类型实现的,可以把bitmaps比作一个以比特位为单位的数组。

3.Redis为什么这么快?

3.1基于内存存储实现

3.2高效的数据结构: B+树的数据结构。

3.3合理的数据编码: Redis支持多种数据数据类型,每种基本类型,可能对多种数据结构。什么时候,使用什么样数据结构,使用什么样编码,是redis设计者总结优化的结果。

3.4合理的线程模型IO多路复用: 其实就是一种同步IO模型,它实现了一个线程可以监视多个文件句柄;一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;而没有文件句柄就绪时,就会阻塞应用程序,交出cpu。单线程模型: Redis是单线程模型的,而单线程避免了CPU不必要的上下文切换和竞争锁的消耗。也正因为是单线程,如果某个命令执行过长( 如hgetall命令),会造成阻塞。Redis是 面向快速执行场景的数据库。所以要慎用如smembers和lrange、hgetall等命令。Redis 6.0引入了多线程提速,它的执行命令操作内存的仍然是个单线程。

3.5 虚拟内存机制: Redis直接自己构建了VM机制,不会像一般的系统会调用系统函数处理,会浪费一定的时间去移动和请求。

4.布隆过滤器

应对缓存穿透问题,我们可以使用布隆过滤器。布隆过滤器是什么呢?布隆过滤器是一种占用空间很小的数据结构,它由一个很长的二进制向量和一组Hash映射函数组成,它用于检索一个元素是否在一个集合中,空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

5. Redis底层,使用的什么协议?

RESP,英文全称是Redis Serialization Protocol,它是专i门]为redis设计的一套序列化协议.这个协议其实在redis的1.2版本时就已经出现了,但是到了redis2.0才最终成为redis通讯协议的标准。RESP主要有实现简单、解析速度快、可读性好等优点。

6. 在生成RDB期间,Redis 可以同时处理写请求么?

可以的,Redis提供两个指令生成RDB,分别是save和bgsave。如果是save指令,会阻塞,因为是主线程执行的。如果是bgsave指令,是fork一个子进程来写入RDB文件的,快照持久化完全交给子进程来处理,父进程则可以继续处理客户端的请求。

7. Redis的Hash冲突怎么办?

Redis作为一个K-V的内存数据库,它使用一张全局的哈希来保存所有的键值对。这张哈希表由多个哈希桶组成,哈希桶中的entry元素保存了key和value指针,其中*key指向了实际的键,*value指 向了实际的值。哈希表查找速率很快的,有点类似于Java中的HashMap,它让我们在0(1)的时间复杂度快速找到键值对。首先通过key计算哈希值,找到对应的哈希桶位置,然后定位到entry,在entry找到对应的数据。哈希冲突:通过不同的key,计算出一样的哈希值,导致落在同一个哈希桶中。Redis为了解决哈希冲突,采用了链式哈希。链式哈希是指同一个哈希桶中,多个元素用一个链表来保存,它们之间依次用指针连接。

8. Redis事务机制

Redis通过MULTI、EXEC, WATCH等一组命令集合,来实现事务机制。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。简言之,Redis事务就是顺序性、一次性、排他性地执行一个队列中的一系列命令 。Redis执行事务的流程如下: 开始事务(MULTI)、命令入队、执行事务(EXEC) 、撤销事务(DISCARD)。

9.什么是热Key问题,如何解决热key问题

什么是热Key呢?在Redis中,我们把访问频率高的key,称为热点key。如果某一热点key的请求到服务器主机时,由于请求量特别大,可能会导致主机资源不足,甚至宕机,从而影响正常的服务。而热点Key是怎么产生的呢?主要原因有两个:用户消费的数据远大于生产的数据,如秒杀、热点新闻等读多写少的场景。请求分片集中,超过单Redis服务器的性能,比如固定名称key, Hash落入同一台服务器,瞬间访问量极大,超过机器瓶颈,产生热点Key问题。如何解决热key问题?Redis集群扩容: 增加分片副本,均衡读流量;将热key分散到不同的服务器中;使用二级缓存,即JVM本地缓存,减少Redis的读请求。

10.Redis的常用应用场景

10.1 缓存:我们一提到redis, 自然而然就想到缓存,国内外中大型的网站都离不开缓存。合理地利用缓存,比如缓存热点数据,不仅可以提升网站的访问速度,还可以降低数据库DB的压力。并且,Redis相比于memcached,还提供了丰富的数据结构,并且提供RDB和AOF等持久化机制。

10.2排行榜:当今互联网应用,有各种各样的排行榜,如电商网站的月度销量排行榜、社交APP的礼物排行榜、小程序的投票排行榜等等。Redis提供的zset数据类型能够实现这些复杂的排行榜。以下是针对ZSet的常用操作命令:

  • ZADD key score member [score member ..]将一个或多个成员元素及其分数值加入到有序集合中。
  • ZCARD key返回有序集合中的成员数量。
  • ZSCORE key member返回有序集合中指定成员的分数。
  • ZRANGE key start stop [WITHSCORES]返回有序集合中指定索引范围内的成员,可选择返回成员的分数。
  • ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]返回有序集合中分数范围内的成员,可选择返回成员的分数,并可指定返回结果的偏移量和数量。
  • ZREM key member [member ..移除有序集合中的一个或多个成员。
  • ZINCRBY key increment member将有序集合中指定成员的分数增加增量increment。
  • ZCOUNT key min max计算有序集合中分数范围内的成员数量。
  • ZREVRANGE key start stop [WITHSCORES]返回有序集合中指定逆序索引范围内的成员,可选择返回成员的分数。
  • ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]返回有序集合中指定逆序分数范围内的成员,可选择返回成员的分数,并可指定返回结果的偏移量和数量。

10.3计数器应用:各大网站、APP应用经常需要计数器的功能,如短视频的播放数、电商网站的浏览数。这些播放数、浏览数一般要求实时的,每一次播放和浏览都要做加1的操作,如果并发量很大对于传统关系型数据的性能是一种挑战。Redis天然支持计数功能而且计数的性能也非常好,可以说是计数器系统的重要选择。

10.4共享Session:如果一个分布式Web服务将用户的Session信息保存在各自服务器,用户刷新一次可能就需要重新登录了,这样显然有问题。实际上,可以使用Redis将用户的Session进行集中管理,每次用户更新或者查询登录信息都直接从Redis中集中获取。

10.5 分布式锁:几乎每个互联网公司中都使用了分布式部署,分布式服务下,就会遇到对同一个资源的并发访问的技术难题,如秒杀、下单减库存等场景。可以用Redis的setnx来实现分布式的锁。

10.6 社交网络: 赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等是社交网站的必备功能,由于社交网站访问量通常比较大,而且传统的关系型数据不太适保存这种类型的数据, Redis提供的数据结构可以相对比较容易地实现这些功能。

10.7 消息队列:是大型网站必用中间件,如ActiveMQ、 RabbitMQ、 Kafka等流行的消息队列中间件,主要用于业务解耦、流量削峰及异步处理实时性低的业务。Redis提供了发布/订阅及阻塞队列功能,能实现一个简单的消息队列系统。另外,这个不能和专业的消息中间件相比。

10.8 位操作: 用于数据量上亿的场景下,例如几亿用户系统的签到,去重登录次数统计,某用户是否在线状态等等。腾讯10亿用户,要几个毫秒内查询到某个用户是否在线,能怎么做?这里要用到位操作—使用setbit、getbit、 bitcount命令。原理是: redis内构建一个足够长的数组,每个数组元素只能是0和1两个值,然后这个数组的下标index用来表示用户id (必须是数字哈),那么很显然,这个几亿长的大数组就能通过下标和元素值(0和1)来构建一个记忆系统。 

 

版权申明:

本博客所有文章除特别声明外均采用 BY-NC-SA 4.0 许可协议。依据 BY-NC-SA 4.0 许可协议,转载请附上原文出处链接及本声明。

原文链接: https://zhangzhijun.life/ruankaoxitongjiagoushianli-rediskaodian.html

Default Avatar

客官,说点什么吧!

此字段内容将保密,不会被其他人看见。