赞
踩
答:
Redis:
Redis是一种基于内存的数据存储,因为它基于内存所以读写速度非常快。而且Redis的命令执行是单线程的,不会存在并发安全问题。
Redis可以用来数据缓存
、分布式锁
、消息队列
等场景。
答:
内存
,内存的访问速度比磁盘快很多;单线程事件循环
和 IO 多路复用
优化过后的数据类型
,性能非常高。通信协议实现简单
且解析高效。答:
Redis 后续版本又支持四种数据类型,它们的应用场景如下:
答:
1、String 类型内部实现
raw
、embstr
、int
raw
:基于简单动态字符串(SDS)实现,存储上限为512mb。RedisObject使用一个指针指向的SDSembstr
:分配的头信息和SDS是一块连续的内存空间。根据SDS存储的字节大小会将raw转为embstrint
:如果字符串存储的是整数值,并且是在8个字节以内,则会采用int编码。会直接将值存放到ptr属性的位置。2、Hash 类型内部实现
ZipList
编码。因为ZipList
不是键值存储,所以使用相邻的两个entry分别保存field和value3、List 类型内部实现
3.2
版本之前,Redis采用ZipList
或LinkedList
来实现List,当元素数量少的时候采用ZipList
编码,多的时候用LinkedList
编码。3.2
版本之后,Redis统一采用QuickList
来实现List4、Set 类型内部实现
Dict
编码,Dict中的key用来存储元素,value统一为null。IntSet
编码(一块连续的内存空间)。5、ZSet 类型内部实现
ZSet底层数据结构必须满足键值存储、键必须唯一、可排序这几个需求。
Dict + SkipList
。Dict 保证键值存储、键必须唯一,SkipList保证可排序。缺点:Dict里面存储一份数据,SkipList中也需要存储一份数据。非常消耗内存。zipList
。为了保证ZSet的需求
答:
网络IO处理
采用了多线程执行。答:
答:
有2种持久化的方式:
1、RDB持久化
RDB持久化是什么: 简单来说就是把内存中的所有数据都记录到磁盘RDB文件中。
什么时候执行RDB:在三种情况下RDB会被执行:
save
命令:主进程去执行RDB,其他命令会被阻塞。bgsave
命令:开启一个子进程去执行RDB,主进程不会受影响。Redis停机
时:Redis停机时会执行一次save命令,实现RDB持久化。RDB执行原理:
bgsave
执行时,主进程会 fork 创建一个子进程。子进程和主进程共享同一块内存区域。copy-on-write
技术。
2、AOF持久化
AOF持久化是什么: 把Redis每一条写操作命令记录在AOF文件中。
什么时候执行AOF:有3种刷盘时机
RDB持久化缺点: RDB恢复数据快,但是最后一次快照之后的数据可能会丢失。
AOF持久化缺点: AOF数据安全性更好,但是恢复数据时需要执行每条命令,恢复速度慢。
在很多场景下,通常是结合使用RDB和AOF。
答:
要想设计一个高可用的 Redis 服务,要从 Redis 的多服务节点来考虑,比如 Redis 的主从集群、哨兵模式、分片集群。
1、主从集群
为什么需要主从集群:单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。
介绍主从集群:主节点负责写操作,从服务器负责读操作。主节点会把信息同步给从节点,保证数据的一致性。
有两种同步方式:
2、哨兵模式
为什么需要哨兵模式:为了保证主从集群能够进行自动故障恢复。
哨兵监控原理:
ping命令
集群故障恢复原理
3、分片集群
主从集群和哨兵模式解决了高并发读、高可用的问题。
分片集群解决的是:海量数据存储和高并发写的问题。
分片集群中有多个主节点,每个主节点保存不同的数据。主节点与主节点通过ping命令检测健康状态。
每个主节点都有自己的从节点。
答:
答:
有两种过期删除策略:
答:
答:
答:
maxmemory
。答:
答:
Redis支持8种不同策略来选择要删除的key:
noeviction
:不淘汰任何key,但是内存满时不允许写入新数据,默认就是这种策略。volatile-ttl
::对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰allkeys-random
:对全体key,随机进行淘汰。也就是直接从db->dict中随机挑选volatile-random
:对设置了TTL的key,随机进行淘汰。也就是从db->expires中随机挑选。allkeys-lru
:对全体key,基于LRU算法进行淘汰volatile-lru
:对设置了TTL的key,基于LRU算法进行淘汰allkeys-lfu
:对全体key,基于LFU算法进行淘汰volatile-lfu
:对设置了TTL的key,基于LFU算法进行淘汰答:
Redis如何实现的LRU和LFU:
LRU:在 Redis 的对象结构体中添加一个字段,用于记录此数据的最后一次访问时间。
LFU:同样也是使用LRU的字段进行记录,统计的并不是真实的访问次数,而是通过计算得到的逻辑访问次数。
答:
答:
热点数据动态缓存的策略总体思路:通过数据最新访问时间来做排名,并过滤掉不常访问的数据,只留下经常访问的数据。
比如需要缓存用户经常访问的Top 1000商品。
答:
答:
改进
答:
当前时间+要延迟的时间
。zadd
向集合中添加消息zrangebysocre key min max
命令(min:0,max:当前时间),循环查询符合相应时间的消息,然后进行业务处理。答:
什么是Big Key
10KB
,对于集合类型的key,建议元素数量小于1000
Big Key的危害
如何发现Big Key
redis-cli --bigkeys
命令查找Bigkey。缺点:该命令只能返回每种类型中最大的那个 bigkey
,对于集合类型,它返回的是个数最多的,而不是占用内存最多的。scan
命令可以自己编写程序扫描,scan每次都是扫描的一部分(相对于扫描全部的key,对线程还友好一点),并且返回下一次的游标位置。如何删除Big Key
unlink
命令hscan
、zscan
,分批次的删除扫描到的元素。答:
大量数据导入时的主要耗时是在:网络传输耗时
命令批处理方案:
M操作
。例如:mset
、hmset
实现批量插入
Pipeline
命令。Pipeline可以执行各种的数据类型的命令,因此如果有对复杂数据类型的批处理需要,建议使用Pipeline功能。
答:
MULTI
开启事务,EXEC
执行事务, DISCARD
取消事务(没有回滚作用)Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。