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(地理信息定位),实现摇一摇,附近的人,外卖等功能。