一.什么是redis?
Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。
二.为什么要学习redis?
1.速度快
a.因为redis对数据的所有操作都是在内存中进行的,所以速度肯定要比在硬盘上快
b.采用IO多路复用的阻塞机制
c.redis采用单线程工作模式,避免了上下文切换带来的资源开销
redis是基于内存操作,CPU不是redis性能瓶颈,redis的瓶颈通常是机器内存和网络带宽,既然可以使用单线程来实现,就是用单线程了
注意:单线程仅仅是说在网络请求这一模块上用一个请求处理客户端的请求,像持久化它就会重开一个线程/进程去进行处理
2.缓存
常用的缓存有redis、ehcache、membcache,为什么要使用redis?
ehcache:直接在jvm虚拟机中缓存、速度快效率高,但是缓存共享非常麻烦,集群分布式应用不方便共享缓存
redis:通过socket访问redis服务端,效率比ecache低,比数据库要快很多。且缓存数据支持持久化,支持的数据结构多,有成熟的缓存过期机制,搭建分布式缓存方便,有成熟方案。
memcache:只支持字符串,不支持持久化
三.redis可以用来做什么?
1.缓存,毫无疑问这是Redis当今最为人熟知的使用场景。再提升服务器性能方面非常有效;
2.排行榜,如果使用传统的关系型数据库来做这个事儿,非常的麻烦,而利用Redis的SortSet数据结构能够非常方便搞定;
3.计算器/限速器,利用Redis中原子性的自增操作,我们可以统计类似用户点赞数、用户访问数等,这类操作如果用MySQL,频繁的读写会带来相当大的压力;限速器比较典型的使用场景是限制某个用户访问某个API的频率,常用的有抢购时,防止用户疯狂点击带来不必要的压力;
4.好友关系,利用集合的一些命令,比如求交集、并集、差集等。可以方便搞定一些共同好友、共同爱好之类的功能;
5.简单消息队列,除了Redis自身的发布/订阅模式,我们也可以利用List来实现一个队列机制,比如:到货通知、邮件发送之类的需求,不需要高可靠,但是会带来非常大的DB压力,完全可以用List来完成异步解耦;
6.Session共享,以PHP为例,默认Session是保存在服务器的文件中,如果是集群服务,同一个用户过来可能落在不同机器上,这就会导致用户频繁登陆;采用Redis保存Session后,无论用户落在那台机器上都能够获取到对应的Session信息。
四.redis会带来什么问题?
1.缓存和数据库一致性问题
2.缓存雪崩:缓存同一时间大面积失效,大量请求直接来到数据库上导致数据库连接异常
3.缓存穿透:客户端持续向服务器发起请求,请求数据库中根本不存在的数据,。服务端先在redis查,查询不到就会查询数据库,如果这种恶意请求非常多的话可能会造成数据库连接异常
3.缓存击穿:一个热门数据在缓存中突然失效,大量请求同时读数据库