redis

2019-11-23  本文已影响0人  蜡笔没了小新_e8c0

1.为什么说redis快?

2.多路I/O复用模型

“多路”指的是多个网络连接,“复用”指的是复用同一个线程。
利用select、poll、epoll可以同时监察多个流的I/O事件的能力,在空闲的时候,会把当前阻塞掉,当有一个或多个流有I/O事件时,就从阻塞态唤醒,于是程序就会轮询一遍所有的流(epoll只轮询那些真正发出了事件的流),并且只依次顺序处理就绪的流。

2.1 select

select(int nfds, fd_set *r, fd_set *w,fd_set *e, struct timeval *timeout)

问题:

2.2 poll

poll(struct pollfd *fds, int nfds, inttimeout)

 

struct pollfd {

    int fd;

    short events;

    short revents;

}

3.redis实现乐观锁?

4.哨兵机制

5.缓存穿透和缓存雪崩

解决方法:
1.采用布隆过滤器,拦截肯定不存在的数据
2.为不存在的数据设置空值

解决方法:
1.加锁排队
2.在原来过期时间添加一个随机时间

6.sorted set 底层实现?

** skiplist和平衡树、哈希表的比较**

7.redis持久化

RDB和AOF

由于Redis是内存数据库,它将自己的数据库状态存储在内存中,如果不想办法将存储在内存中的数据库状态保存到磁盘里面,那么一旦服务器进程退出,服务器中的数据库状态也会消失不见。

RDB

一旦BGSAVE开始执行了,SAVE命令和BGSAVE命令都会被服务器拒绝,避免产生竞争条件。如果BGSAVE命令正在执行,那么客户端发送的BGREWRITEAOF命令会被延迟到BGSAVE命令执行完毕之后执行;如果BGREWRITEAOF命令正在执行,那么客户端发送的BGSAVE命令会被服务器拒绝。避免产生大量的磁盘写入操作。

将某段时间内的所有数据持久化到磁盘中,类似快照的行为。当在进行持久化的过程时有数据的更新,会把这些记录保存到备份文件中,最后会把备份文件拿来替换原文件。

缺点:如果机器发生故障,容易丢失某个时间段内的数据。

AOF

将所有写命令保存到AOF缓冲区中,根据appendfsync的值(默认为everysec)来对AOF文件同步,由于大量的写入命令会导致AOF文件过大,后台就会开启一个子进程对原AOF文件进行重写(合并命令),对文件进行压缩。如果在重写期间执行了写入命令,会将写入命令保存到AOF重写缓冲区中,等到AOF重写结束,再将AOF重写缓冲区中的内容追加到新AOF文件中,此时会对父进程阻塞,最后用新AOF文件替换原AOF文件。

缺点:由于恢复要进行的操作较多,可能会导致主线程阻塞。

8. redis zset底层为啥用skiplist而不用跳表?

跳表:采用多层链表结构,查询、删除、插入时间复杂度都是O(logn)。

在操作时间复杂度差不多的情况下,skiplist的实现简单。

9. redis 查询某一前缀的key

方法一:利用keys查找(不推荐)

keys pattern:查找所有符合给定模式pattern的key

通过这种方式查询可能会导致查询时间过长,导致redis其他服务卡顿。

方法二:利用scan查找(推荐)

scan cursor [MATCH pattern] [COUNT count]

keys命令的时间复杂度为O(n),而scan命令会将遍历操作分解成m次时间复杂度为O(1)的操作来执行,从而解决使用keys命令遍历大量数据而导致服务器阻塞的情况。

10. redis过期删除策略

11. 一致性hash算法

hash算法依赖于现有的机器数目,导致所有的位置都要发生变动。一致性hash算法是采用与2^32取模,形成一个虚拟的圆环,当机器数目发生变动的时候,只有少量的位置变动。由于可能存在数据倾斜问题,引入虚拟节点来使数据分布均匀,只是多了虚拟节点到实际节点的映射。

12. 使用场景?

上一篇下一篇

猜你喜欢

热点阅读