1.redis应用场景?
(1)token令牌的生成
通过token替代session,session有个最大的问题是不支持集群。把token存在redis里,因为redis是可以共享使用的。
(2)短信验证码code
验证码有效期只有30分钟或者1小时,使用redis对验证码的code设置有效期。
(3)使用redis去减轻数据库访问的压力
把热点数据(经常被查询到的)做成热点key。热点key要提前预热下(提前把热点的key从数据库放到redis中,否则刚开始访问的用户直接从数据库中查询,速度很慢)。
(4)网页计数器
记录网页的PV量多少。redis是单线程的,可以保证线程安全,保证原子性。
(5)分布式锁
redis中实现分布式锁有两种方案:a. setnx;b.使用框架。
(6)订单30分钟有效期
使用redis的key的有效期和失效的监听。一旦key失效时,会走客户端的一个回调,告诉客户端一个事件通知。
(7)实现注册中心、分布式的配置中心等
2.redis线程是否安全?
redis是线程安全的。redis是单线程的。
3.redis是单线程为什么效率高?
redis数据都存在内存里面的。核心是用到nio的io多路复用机制(ngix),能够很好支持并发,从而保证线程安全。
redis单线程,也就是底层采用一个线程去为维护多个不同客户端的io操作。
但是nio在不同操作系统实现机制不同。在windows中使用select实现轮询的时间复杂度是o(n),而且还存在空轮询的情况,效率很低,其次是默认对轮询的数据有一定的限制,所以吃出上万的tcp连接很难。
所以在linux上采用epoll实现事件驱动回调,不会存在空轮询的情况,只对活跃的连接实现主动回调,这样性能大幅度提升,,而是时间复杂度为o(1)。这就是为什么ngix和redis都能支持很高程度的并发,最终都是linux的io多路复用机制epoll。
(redis官方不支持windows版本,windows里是没有epoll)
io多路复用是nio。服务器端只用一个线程去维护客户端所有连接。请求(tcp连接)通过管道(Channel)到达服务器都会注册到一个选择器(selector)的集合中去,通过一个线程去循环遍历这个集合,判断每个连接是否有数据,有数据就读取。(一个线程去维护所有客户端连接)。----》这就是io多路复用。(多路:多个连接。复用:用一个线程去维护)
io多路复用有三个核心区域:管道channel、选择器selector和缓冲区buffer。为什么用到buffer:因为字节流传输效率很低,通过缓冲,成块成块的传输,提高效率。
redis使用到io多路复用原则,即redis通过一个选择器去接受客户端的所有请求,一个线程不断循环判断里面是否有数据,有数据就开始读取。
4.redis中如何存放对象?
方法一:存放json
string类型,存json就行,再通过json反序列化对象。好处:?
方法二:存放二进制
不跨语言,只支持java对象。
5.redis是否支持事务机制?事务支持回滚吗?
支持。两种形式:Multi和Watch。