1、简述redis特点及其应用场景

 

1.1 redis特点

速度快: 10W QPS,基于内存,C语言实现

单线程

持久化

支持多种数据结构

支持多种编程语言

功能丰富: 支持Lua脚本,发布订阅,事务,pipeline等功能

简单: 代码短小精悍(单机核心代码只有23000行左右),单线程开发容易,不依赖外部库,使用简单。

主从复制

支持高可用和分布式

 

 

1.1.1速度快

说到Redis的速度快,大家的第一反应一定是内存读取,那是肯定的,但如果面试的时候仅仅说到这点,那还是远远不够的,至少还有以下三点要补充:

Redis是用C语言实现的,而众所周知,C语言是“距离”操作系统最近的的编程语言,执行速度快

Redis采用了单线程的架构(这点很容易遗忘,但是是Redis的最重要特性),避免了多线程的资源竞争问题

Redis的源码非常精简,可以说是集性能和优雅于一身的代码

 

1.1.2

Redis 6.0版本前一直是单线程方式处理用户的请求。

 

单线程为何如此快?

纯内存

非阻塞

避免线程切换和竞态消耗

 

注意事项:

一次只运行一条命令

拒绝长(慢)命令:keys, flushall, flushdb, slow lua script, mutil/exec, operate big value(collection)

其实不是单线程: 早期版本是单进程单线程,3版本后实际还有其它的线程, 实现特定功能,如: fysnc file descriptor,close file descriptor

 

 

1.1.3持久化

Redis还支持两种方式的持久化,即将数据写入磁盘的方法,RDB和AOF,两种方法各有利弊,这里就不详细介绍了。

 

 

1.2.4 丰富的功能

除了数据结构的强大,另外就是Redis所提供的丰富的功能了:

提供了key过期的功能,这能运用于实现缓存

提供了发布订阅的功能,可运用于消息队列,如celery

支持lua脚本功能,当觉得Redis的命令实现功能不够时,就能利用lua来创建新的功能

提供了简单的事务功能,不过不能支持回滚,但也能一定程度上保持事务的特性

提供了pipeling功能,这样客户端可以将多条命令一次io,减少了网络的开销

 

1.1.5 简单稳定

Redis的简单表现在两方面,一方面是在3.0版本之前源代码仅3万行,后面3.0加入了集群后代码加到了5万行,而5万行的源代码对于开发人员来说,要理解掌握它也显得并不是那么难;另一方面就是Redis是单线程的结构,这使得Redis的服务端处理模型变得简单,客户端开发也显得简单。

Redis虽然代码少,并且是单线程的,但是它又非常的稳定,很少会出现因为自身bug而down掉的情况。

 

1.1.6 客户端语言多

Redis目前基本可以说和MySQL的知名度一样高了,太多的运用场景,太多的支持语言,常见的比如:java的jedis,Python的redis、PHP、C、C++等等。

 

1.1.7主从复制

那数据库的主从复制、集群功能是非常重要的,可以在Redis异常挂了后不影响客户端的使用,而Redis也是支持主从复制功能。

 

1.1.8高可用和分布式

Redis从2.8版本后提供了高可用实现的Redis Sentinel,即Redis的“哨兵机制”,可以保证Redis节点的故障发现和自动转移,这实现了Redis强大的分布式功能。

 

1.1.9 基于键值对的服务器

Redis的全程是Remote Dictionary Server,是集合了五种数据结构:字符串、列表、哈希、集合、有序集合,可以说五种数据结构都是围绕于key-value的形式,而value不仅仅可以是值,还能是具体的数据结构,这给予了Redis强大的变化性和灵活能力。

 

 

 

 

1.2 Redis的应用场景


Session 共享:常见于web集群中的Tomcat或者PHP中多web服务器session共享。

 

缓存:数据查询、电商网站商品信息、新闻内容。

 

计数器:访问排行榜、商品浏览数等和次数相关的数值统计场景。

 

微博/微信社交场合:共同好友,粉丝数,关注,点赞评论等。

 

消息队列:ELK的日志缓存、部分业务的订阅发布系统。

 

地理位置: 基于GEO(地理信息定位),实现摇一摇,附近的人,外卖等功能。