Java面试宝典之分布式相关问答详解

160 阅读6分钟

1.Redis和Memcache的区别?

1

、存储方式
Memecache
把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。
Redis
有部份存在硬盘上,
redis
可以持久化其数据

2

、数据支持类型
memcached
所有的值均是简单的字符串,
redis
作为其替代者,支持更为丰富的数据类型 ,提供
list
set
zset
hash
等数据结构的存储

3

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

4

value
值大小不同:
Redis
最大可以达到
1gb
memcache
只有
1mb

5

redis
的速度比
memcached
快很多

6

Redis
支持数据的备份,即
master-slave
模式的数据备份。

2.使用Redis有哪些好处?

(1)

速度快,因为数据存在内存中,类似于
HashMap
HashMap
的优势就是查找和操作的时间复杂度都是
O(1)

(2)

支持丰富数据类型,支持
string
list
set
sorted set
hash

(3)

支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行

(4)

丰富的特性:可用于缓存,消息,按
key
设置过期时间,过期后将会自动删除

3.什么是redis持久化?rdb和aof的比较?

持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。

比较:

1

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

2

aof
rdb
更安全也更大

3

rdb
性能比
aof

4

、如果两个都配了优先加载
AOF

4.Redis最适合的场景?

1
)、会话缓存(
Session Cache

最常用的一种使用
Redis
的情景是会话缓存(
session cache
)。用
Redis
缓存会话比其他存储(如
Memcached
)的优势在于:
Redis
提供持久化。

2
)、全页缓存(
FPC

除基本的会话
token
之外,
Redis
还提供很简便的
FPC
平台。回到一致性问题,即使重启了
Redis
实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似
PHP
本地
FPC

再次以
Magento
为例,
Magento
提供一个插件来使用
Redis
作为
全页缓存后端

此外,对
WordPress
的用户来说,
Pantheon
有一个非常好的插件
wp-redis
,这个插件能帮助你以最快速度加载你曾浏览过的页面。

3
)、队列

Reids

在内存存储引擎领域的一大优点是提供
list
set
操作,这使得
Redis
能作为一个很好的消息队列平台来使用。
Redis
作为队列使用的操作,就类似于本地程序语言(如
Python
)对
list
push/pop
操作。

4
),排行榜
/
计数器

Redis

在内存中对数字进行递增或递减的操作实现的非常好。集合(
Set
)和有序集合(
Sorted Set
)也使得我们在执行这些操作的时候变的非常简单,
Redis
只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的
10
个用户–我们称之为“
user_scores
”,我们只需要像下面一样执行即可:

5
)、发布
/
订阅

最后(但肯定不是最不重要的)是
Redis
的发布
/
订阅功能。发布
/
订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布
/
订阅的脚本触发器,甚至用
Redis
的发布
/
订阅功能来建立聊天系统!

5.redis哈希槽的概念?

Redis

集群没有使用一致性
hash,
而是引入了哈希槽的概念,
Redis
集群有
16384
个哈希槽,每个
key
通过
CRC16
校验后对
16384
取模来决定放置哪个槽,集群的每个节点负责一部分
hash
槽。

6.怎么理解Redis事务?

事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行,事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

7.redis的淘汰策略有哪些?

noeviction:

返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但
DEL
和几个例外)

allkeys-lru:

尝试回收最少使用的键(
LRU
),使得新添加的数据有空间存放。

volatile-lru:

尝试回收最少使用的键(
LRU
),但仅限于在过期集合的键
,
使得新添加的数据有空间存放。

allkeys-random:

回收随机的键使得新添加的数据有空间存放。

volatile-random:

回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。

volatile-ttl:

回收在过期集合的键,并且优先回收存活时间(
TTL
)较短的键
,
使得新添加的数据有空间存放。

8.redis有哪些数据结构?

String

List
Set
Zset(Sorted Set)
hash

9.redis 缓存穿透、缓存雪崩、缓存击穿?

缓存穿透:无效
ID
,在
redis
缓存中查不到,去查询
DB
,造成
DB
压力增大。

解决方法:

  
1
解决方法
1
:布隆过滤器,提供一个很大的
Bit-Map
,提供多个
hash
函数,分别对查询参数值【比如
UUID
】,进行求
hash,
然后分别对多个
hash
结果,在对应位置对比是否全为
1
或者某个位置为
0,
一旦有一个位置标识为
0
,表示本次查询
UUID,
不存在于缓存,再去查询
DB.
起到一个再过滤的效果。

  
2
解决方法
2
:把无效的
ID
,也在
redis
缓存起来,并设置一个很短的超时时间。

缓存雪崩:缓存同一时间批量失效,导致大量的访问直接访问
DB

解决方法:

  在做缓存时候,就做固定失效时间
+
随机时间段,保证所有的缓存不会同一时间失效

缓存击穿:在缓存失效的时候,会有高并发访问失效的缓存【热点数据】

解决方法:

  最简单的解决方法,就是将热点数据设置永不超时!

  第二个解决方法:对访问的
Key
加上互斥锁,请求的
Key
如果不存在,则加锁,去数据库取,新请求过来,如果相同
KEy,
则暂停
10s
再去缓存取值;如果
Key
不同,则直接去缓存取!

10.redis如何实现高并发?

redis

通过一主多从,主节点负责写,从节点负责读,读写分离,从而实现高并发。