最近阅读了《Redis开发与运维》,很是不错。这里对书中的知识整理一下,方便本身回顾一下Redis的整个体系,来对相关知识点查漏补缺。面试
我按照五点把书中的内容进行一下整理:redis
先来开启第一部分的内容,对Redis来一次从新打量。数据库
本系列内容基于:redis-3.2.12缓存
在面试的时候,常被问比较下Redis与Memcache的优缺点,我的以为这两者并不适合一块儿比较,一个是非关系型数据库不只能够作缓存还能干其它事情,一个是仅用作缓存。经常让咱们对这两者进行比较,主要也是因为Redis最普遍的应用场景就是Cache。那么Redis到底能干什么?又不能干什么呢?服务器
缓存,毫无疑问这是Redis当今最为人熟知的使用场景。再提高服务器性能方面很是有效;markdown
排行榜,若是使用传统的关系型数据库来作这个事儿,很是的麻烦,而利用Redis的SortSet数据结构可以很是方便搞定;网络
计算器/限速器,利用Redis中原子性的自增操做,咱们能够统计相似用户点赞数、用户访问数等,这类操做若是用MySQL,频繁的读写会带来至关大的压力;限速器比较典型的使用场景是限制某个用户访问某个API的频率,经常使用的有抢购时,防止用户疯狂点击带来没必要要的压力;数据结构
好友关系,利用集合的一些命令,好比求交集、并集、差集等。能够方便搞定一些共同好友、共同爱好之类的功能;并发
简单消息队列,除了Redis自身的发布/订阅模式,咱们也能够利用List来实现一个队列机制,好比:到货通知、邮件发送之类的需求,不须要高可靠,可是会带来很是大的DB压力,彻底能够用List来完成异步解耦;运维
Session共享,以PHP为例,默认Session是保存在服务器的文件中,若是是集群服务,同一个用户过来可能落在不一样机器上,这就会致使用户频繁登录;采用Redis保存Session后,不管用户落在那台机器上都可以获取到对应的Session信息。
Redis感受能干的事情特别多,但它不是万能的,合适的地方用它事半功倍。若是滥用可能致使系统的不稳定、成本增高等问题。
好比,用Redis去保存用户的基本信息,虽然它可以支持持久化,可是它的持久化方案并不能保证数据绝对的落地,而且还可能带来Redis性能降低,由于持久化太过频繁会增大Redis服务的压力。
简单总结就是数据量太大、数据访问频率很是低的业务都不适合使用Redis,数据太大会增长成本,访问频率过低,保存在内存中纯属浪费资源。
上面说了Redis的一些使用场景,那么这些场景的解决方案也有不少其它选择,好比缓存能够用Memcache,Session共享还能用MySql来实现,消息队列能够用RabbitMQ,咱们为何必定要用Redis呢?
速度快,彻底基于内存,使用C语言实现,网络层使用epoll解决高并发问题,单线程模型避免了没必要要的上下文切换及竞争条件;
注意:单线程仅仅是说在网络请求这一模块上用一个线程处理客户端的请求,像持久化它就会重开一个线程/进程去进行处理
丰富的数据类型,Redis有8种数据类型,固然经常使用的主要是 String、Hash、List、Set、 SortSet 这5种类型,他们都是基于键值的方式组织数据。每一种数据类型提供了很是丰富的操做命令,能够知足绝大部分需求,若是有特殊需求还能本身经过 lua 脚本本身建立新的命令(具有原子性);
除了提供的丰富的数据类型,Redis还提供了像慢查询分析、性能测试、Pipeline、事务、Lua自定义命令、Bitmaps、HyperLogLog、发布/订阅、Geo等个性化功能。
Redis的代码开源在GitHub,代码很是简单优雅,任何人都可以吃透它的源码;它的编译安装也是很是的简单,没有任何的系统依赖;有很是活跃的社区,各类客户端的语言支持也是很是完善。另外它还支持事务(没用过)、持久化、主从复制让高可用、分布式成为可能。
作为一个开发者,对于咱们使用的东西不能让它成为一个黑盒子,咱们应该深刻进去,对它更了解、更熟悉。今天简单说了下Redis的使用场景,以及为何选择了Redis而不是其它。下次对Redis的内部数据结构及经常使用命令的时间复杂度进行总结。
我的公众号: