锁屏面试题百日百刷-Redis篇(一)

锁屏面试题百日百刷-Redis篇(一)

  锁屏面试题百日百刷,每个工作日坚持更新面试题。锁屏面试题app、小程序现已上线,官网地址:https://www.demosoftware.cc/#/introductionPage。已收录了每日更新的面试题的所有内容,还包含特色的解锁屏幕复习面试题、每日编程题目邮件推送等功能。让你在面试中先人一步,吊打面试官!接下来的是今日的面试题:

 

 

====Redis 的特点?

 

 

 

Redis 是由意大利人 Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库。Redis 全称为:Remote Dictionary Server(远程数据服务),该软件使用 C 语言编写,典型的 NoSQL 数据库服务器,Redis 是一个 key-value 存储系统,它支持丰富的数据类型,如:string、list、set、zset(sorted set)、hash。

 

Redis 本质上是一个 Key-Value 类型的内存数据库,很像 memcached,整个 数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据 flush 到硬盘 上进行保存。因为是纯内存操作,Redis 的性能非常出色,每秒可以处理超过 10 万次读写操作,是已知性能最快的 Key-Value DB。

 

Redis 的出色之处不仅仅是性能,Redis 最大的魅力是支持保存多种数据结构,此外单 个 value 的最大限制是1GB,不像 memcached 只能保存 1MB 的数据,另外 Redis 也可以对存入的 Key-Value 设置 expire 时间。

 

Redis 的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此 Redis 适合的场景主要局限在较小数据量的高性能操作和运算上。

 

 

 

====为什么 redis 需要把所有数据放到内存中?

 

 

 

Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以 redis 具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘 I/O 速度为严重影响 redis 的性能。在内存越来越便宜的今天,redis 将会越来越受欢迎。如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。

 

 

 

====Redis 常见的性能问题都有哪些?如何解决?

 

 

 

(1)、Master 写内存快照,save 命令调度 rdbSave 函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以 Master 最好不要写内存快照。

 

(2)、Master AOF 持久化,如果不重写 AOF 文件,这个持久化方式对性能的影响是最小的,但是 AOF 文件会不断增大,AOF 文件过大会影响 Master 重启的恢复速度。Master 最好不要做任何持久化工作,包括内存快照和 AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个 Slave 开启 AOF 备份数据,策略为每秒同步一次。

 

(3)、Master 调用 BGREWRITEAOF 重写 AOF 文件,AOF 在重写的时候会占大量的 CPU 和内存资源,导致服务 load 过高,出现短暂服务暂停现象。

 

(4)、Redis 主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave 和 Master 最好在同一个局域网内。

 

 

 

====Redis 最适合的场景有哪些?

 

(1)、会话缓存(Session Cache)

 

(2)、全页缓存(FPC)

 

(3)、队列

 

(4)、排行榜/计数器

 

(5)、发布/订阅

 

 

 

====Memcache 与 Redis 的区别都有哪些?

 

(1)、存储方式不同,Memcache 是把数据全部存在内存中,数据不能超过内存的大小,断电后数据库会挂掉。Redis 有部分存在硬盘上,这样能保证数据的持久性。

 

(2)、数据支持的类型不同 memcahe 对数据类型支持相对简单,redis 有复杂的数据类型。

 

(3)、使用底层模型不同 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。Redis 直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

 

(4)、支持的 value 大小不一样 redis 最大可以达到 1GB,而 memcache 只有 1MB。

 

 

 

====Redis有哪几种数据结构?以及如何使用?

 

 

 

Redis 的数据结构有五种,分别是:

 

String——字符串

 

String 数据结构是简单的 key-value 类型,value 不仅可以是 String,也可以是数字(当数字类型用 Long 可以表示的时候 encoding 就是整型,其他都存储在 sdshdr 当做字符串)。

 

使用:get 、 set 、 del 、 incr、 decr 等

 

127.0.0.1:6379> set hello world

 

OK

 

127.0.0.1:6379> get hello

 

"world"

 

127.0.0.1:6379> del hello

 

(integer) 1

 

127.0.0.1:6379> get hello

 

(nil)

 

127.0.0.1:6379> get counter

 

"2"

 

127.0.0.1:6379> incr counter

 

(integer) 3

 

127.0.0.1:6379> get counter

 

"3"

 

127.0.0.1:6379> incrby counter 100

 

(integer) 103

 

127.0.0.1:6379> get counter

 

"103"

 

127.0.0.1:6379> decr counter

 

(integer) 102

 

127.0.0.1:6379> get counter

 

"102"

 

Hash——字典

 

在 Memcached 中,我们经常将一些结构化的信息打包成 hashmap,在客户端序列化后存储为一个字符串的值(一般是 JSON 格式),比如用户的昵称、年龄、性别、积分等。

 

使用:所有hash的命令都是  h   开头的     hget  、hset 、  hdel 等

 

127.0.0.1:6379> hset user name1 hao

 

(integer) 1

 

127.0.0.1:6379> hset user email1 hao@163.com

 

(integer) 1

 

127.0.0.1:6379> hgetall user

 

1) "name1"

 

2) "hao"

 

3) "email1"

 

4) "hao@163.com"

 

127.0.0.1:6379> hget user user

 

(nil)

 

127.0.0.1:6379> hget user name1

 

"hao"

 

127.0.0.1:6379> hset user name2 xiaohao

 

(integer) 1

 

127.0.0.1:6379> hset user email2 xiaohao@163.com

 

(integer) 1

 

127.0.0.1:6379> hgetall user

 

1) "name1"

 

2) "hao"

 

3) "email1"

 

4) "hao@163.com"

 

5) "name2"

 

6) "xiaohao"

 

7) "email2"

 

8) "xiaohao@163.com"

 

List——列表

 

List 说白了就是链表(redis 使用双端链表实现的 List),相信学过数据结构知识的人都应该能理解其结构。

 

使用:

 

lpush+lpop=Stack(栈)

 

lpush+rpop=Queue(队列)

 

lpush+ltrim=Capped Collection(有限集合)

 

lpush+brpop=Message Queue(消息队列)

 

127.0.0.1:6379> lpush mylist 1 2 ll ls mem

 

(integer) 5

 

127.0.0.1:6379> lrange mylist 0 -1

 

1) "mem"

 

2) "ls"

 

3) "ll"

 

4) "2"

 

5) "1"

 

Set——集合

 

Set 就是一个集合,集合的概念就是一堆不重复值的组合。利用 Redis 提供的 Set 数据结构,可以存储一些集合

 

使用:命令都是以s开头的  sadd 、srem、scard、smembers、sismember性的数据。

 

127.0.0.1:6379> sadd myset hao hao1 xiaohao hao

 

(integer) 3

 

127.0.0.1:6379> SMEMBERS myset

 

1) "xiaohao"

 

2) "hao1"

 

3) "hao"

 

127.0.0.1:6379> SISMEMBER myset hao

 

(integer) 1

 

ZSet——有序集合

 

和 Set 相比,Zset 是将 Set 中的元素增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,

 

使用: 有序集合的命令都是 以  z  开头    zadd 、 zrange、 zscore

 

127.0.0.1:6379> zadd myscoreset 100 hao 90 xiaohao

 

(integer) 2

 

127.0.0.1:6379> ZRANGE myscoreset 0 -1

 

1) "xiaohao"

 

2) "hao"

 

127.0.0.1:6379> ZSCORE myscoreset hao

 

"100"

 

 

 

更多面试题可关注"demo锁屏面试题"公众号通过小程序或App获取面试题和学习资源

锁屏面试题百日百刷-Redis篇(一)

 

上一篇:SwiftHub项目 之网络层封装的一点见解


下一篇:设置html title标题左侧的小图标