1.简述redis以及优缺点
Redis是一个Key-Value类型的非关系型的内存数据库,整个数据库加载在内存当中操作,定期通过异步操作把数据库中的数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value 数据库。
优点:
1)读写性能极高, Redis能读的速度是110000次/s,写的速度是81000次/s。
2)支持数据持久化,支持AOF和RDB两种持久化方式。
3)支持事务, Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
4)数据结构丰富,除了支持string类型的value外,还支持hash、set、zset、list等数据结构。
5)支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
6)丰富的特性 – Redis还支持 publish/subscribe,、通知,、key 过期等特性。
缺点:
数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
2.redis很快的原因
1)内存存储。数据存在内存中,没有磁盘IO上的开销。
2)单线程实现( Redis 6.0以前)。避免了多个线程之间线程切换和锁资源争用的开销。(单线程是指一个线程处理所有网络请求)
3)非阻塞IO。使用多路复用IO技术,将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间。
4)优化的数据结构。有诸多可以直接应用的优化数据结构的实现,应用层可以直接使用原生的数据结构提升性能。
5)使用底层模型不同。建了虚拟内存机制 ,而不是系统调用系统函数。
3.redis与memcached的比较
特点 | memcached | redis |
---|
读写 | 高性能 | 高性能 |
单/多线程读写 | 多线程读写性能更强 | 单线程读写性能更强 |
使用 | 多用户并发,低访问 | 少量用户,多次访问 |
数据类型 | 单一(字符串) | 字符串、哈希表、集合、有序集合、列表 |
数据持久化 | 不支持 | 支持RDB和AOF持久化 |
结构 | 多核 | 单核 |
数据操作 | 在客户端操作,客户端分布式集群,没有原生的集群模式 | 支持服务端操作,主从同步机制,以及 Cluster集群部署能力,能够提供高可用服务 |
内存使用效率 | 仅key-value存储时,更高 | hash结构时,更高 |
网络IO模型 | 多线程非阻塞IO模型 | 单线程多路IO复用模型 |
4.Redis使用场景
1、缓存
几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力。
2、排行榜
3、计数器
如电商网站商品的浏览量、视频网站视频的播放数等。
4、分布式会话
当应用增多相对复杂的系统中,一般都会搭建以Redis等内存数据库为中心的session服务,session不再由容器管理,而是由session服务及内存数据库管理。
5、分布式锁
利用Redis的setnx功能来编写分布式的锁。
6、 社交网络
点赞、踩、关注/被关注、共同好友等社交网站的基本功能,Redis提供的哈希、集合等数据结构能很方便的的实现这些功能。
7、最新列表
8、消息系统
大型网站的必用中间件,如ActiveMQ、RabbitMQ、Kafka等流行的消息队列中间件,主要用于业务解耦、流量削峰及异步处理实时性低的业务。Redis提供了发布/订阅及阻塞队列功能,能实现一个简单的消息队列系统。另外,这个不能和专业的消息中间件相比。
5.Redis的单线程和多线程,以及使用原因。
首先,Redis在4.0版本时引入多线程处理异步任务,此举主要针对那些非常耗时的命令。6.0版本时,正式在网络模型中实现IO多线程。所以,在Redis 6.0之前,其核心网络模型使用的是单线程。
其次,互联网的IO瓶颈十分明显,6.0应用多线程原因如下图。
最后,redis6.0以前使用单线程,可以避免过多的上下文切换开销;避免同步机制的开销;简单可维护。
6.Redis过期键的删除策略
Redis的过期策略和淘汰策略
7.Redis的持久化机制
redis持久化之RDB和AOF比较