redis相关知识点
1 Redis中key和value存储大小的限制:key和value大小最大不超过512M
2 Redis优化,为何key-value要存byte数组:可以提高存取效率,并且在底层存储中节省空间。(Redis优化,为何key-value要存byte数组)
3 redis是多线程还是单线程?(https://blog.csdn.net/bird73/article/details/79792548)
单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,其他模块仍用了多个线程。
4 redis 可以能够快速执行的原因:
(1) 绝大部分请求是纯粹的内存操作(非常快速)
(2) 采用单线程,避免了不必要的上下文切换和竞争条件
(3) 非阻塞IO - IO多路复用(IO 多路复用是什么意思?)
IO多路复用中有三种方式:select,poll,epoll。需要注意的是,select,poll是线程不安全的,epoll是线程安全的
redis内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间 这3个条件不是相互独立的,特别是第一条,如果请求都是耗时的,采用单线程吞吐量及性能可想而知了。应该说redis为特殊的场景选择了合适的技术方案。
5. Redis关于线程安全问题
redis实际上是采用了线程封闭的观念,把任务封闭在一个线程,自然避免了线程安全问题,不过对于需要依赖多个redis操作的复合操作来说,依然需要锁,而且有可能是分布式锁。
6 使用Redis有哪些好处?
(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
(2) 支持丰富数据类型,支持string,list,set,sorted set,hash
(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除
7. Redis相比memcached有哪些优势?
8 Redis常见性能问题和解决方案:
(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件;(Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照;AOF文件过大会影响Master重启的恢复速度)
(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内
(4) 尽量避免在压力很大的主库上增加从库
(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...;这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。
9. Redis的回收策略
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
注意这里的6种机制,volatile和allkeys规定了是对已设置过期时间的数据集淘汰数据还是从全部数据集淘汰数据,后面的lru、ttl以及random是三种不同的淘汰策略,再加上一种no-enviction永不回收的策略。
使用策略规则:
1、如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用allkeys-lru
2、如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random
10. 五种I/O模型介绍
IO 多路复用是5种I/O模型中的第3种,对各种模型讲个故事,描述下区别: 故事情节为:老李去买火车票,三天后买到一张退票。参演人员(老李,黄牛,售票员,快递员),往返车站耗费1小时。 1.阻塞I/O模型 老李去火车站买票,排队三天买到一张退票。 耗费:在车站吃喝拉撒睡 3天,其他事一件没干。 2.非阻塞I/O模型 老李去火车站买票,隔12小时去火车站问有没有退票,三天后买到一张票。 耗费:往返车站6次,路上6小时,其他时间做了好多事。 3.I/O复用模型 1.select/poll 老李去火车站买票,委托黄牛,然后每隔6小时电话黄牛询问,黄牛三天内买到票,然后老李去火车站交钱领票。 耗费:往返车站2次,路上2小时,黄牛手续费100元,打电话17次 2.epoll 老李去火车站买票,委托黄牛,黄牛买到后即通知老李去领,然后老李去火车站交钱领票。 耗费:往返车站2次,路上2小时,黄牛手续费100元,无需打电话 4.信号驱动I/O模型 老李去火车站买票,给售票员留下电话,有票后,售票员电话通知老李,然后老李去火车站交钱领票。 耗费:往返车站2次,路上2小时,免黄牛费100元,无需打电话 5.异步I/O模型 老李去火车站买票,给售票员留下电话,有票后,售票员电话通知老李并快递送票上门。 耗费:往返车站1次,路上1小时,免黄牛费100元,无需打电话 1同2的区别是:自己轮询 2同3的区别是:委托黄牛 3同4的区别是:电话代替黄牛 4同5的区别是:电话通知是自取还是送票上门
11 redis的持久化开启了RDB和AOF下重启服务是如何加载的?
Redis 持久化之RDB和AOF ;
https://www.jianshu.com/p/9cdf6c6d4cb0
理解Redis的持久化机制:RDB和AOF
Redis 默认开启RDB持久化方式,在指定的时间间隔内,执行指定次数的写操作,则将内存中的数据写入到磁盘中。
RDB 持久化适合大规模的数据恢复但它的数据一致性和完整性较差。
Redis 需要手动开启AOF持久化方式,默认是每秒将写操作日志追加到AOF文件中。
AOF 的数据完整性比RDB高,但记录内容多了,会影响数据恢复的效率。
Redis 针对 AOF文件大的问题,提供重写的瘦身机制。
若只打算用Redis 做缓存,可以关闭持久化。
若打算使用Redis 的持久化。建议RDB和AOF都开启。其实RDB更适合做数据的备份,留一后手。AOF出问题了,还有RDB。
注意点:
SHUTDOWN 和 FLUSHALL 命令都会触发RDB快照,
RDB和AOF可以同时存在,且优先加载AOF文件。
- FLUSHALL 清空整个 Redis 服务器的数据(几乎不用)
- SHUTDOWN 关机走人(很少用)
12 redis如果做集群该如何规划?AKF/CAP如何实现和设计?
13 10万用户一年365天的登录情况如何用redis存储,并快速检索任意时间窗内的活跃用户?
14 redis的5种Value类型你用过几种,能举例吗?
15 100万并发4G数据,10万并发400G数据,如何设计Redis存储方式?
3、redis实现活跃用户/用户统计
4、redis实现秒杀/抢购
5、redis实现排行榜/评论列表
6、redis实现推荐系统/抽奖/商品详情页
1、linux系统的支持:fork、copy on write
2、redis的持久化:RDB、AOF、RDB&AOF混合使用
3、通过redis学AKF划分原则、CAP定理
4、redis vs zookeeper分布式锁的探索
5、redis压力测试、调优点
redis存储对象与对象序列化详解