redis常见问题

1.redis应用场景?

1token令牌的生成

通过token替代sessionsession有个最大的问题是不支持集群。把token存在redis里,因为redis是可以共享使用的。

2)短信验证码code

验证码有效期只有30分钟或者1小时,使用redis对验证码的code设置有效期。

3)使用redis去减轻数据库访问的压力

把热点数据(经常被查询到的)做成热点key。热点key要提前预热下(提前把热点的key从数据库放到redis中,否则刚开始访问的用户直接从数据库中查询,速度很慢)。

4)网页计数器

记录网页的PV量多少。redis是单线程的,可以保证线程安全,保证原子性。

5)分布式锁

redis中实现分布式锁有两种方案:a. setnxb.使用框架。

6)订单30分钟有效期

使用rediskey的有效期和失效的监听。一旦key失效时,会走客户端的一个回调,告诉客户端一个事件通知。

7)实现注册中心、分布式的配置中心等

 

2.redis线程是否安全?

redis是线程安全的。redis是单线程的。

 

3.redis是单线程为什么效率高?

redis数据都存在内存里面的。核心是用到nioio多路复用机制ngix),能够很好支持并发,从而保证线程安全。

redis单线程,也就是底层采用一个线程去为维护多个不同客户端的io操作。

但是nio在不同操作系统实现机制不同。在windows中使用select实现轮询的时间复杂度是o(n),而且还存在空轮询的情况,效率很低,其次是默认对轮询的数据有一定的限制,所以吃出上万的tcp连接很难。

所以在linux上采用epoll实现事件驱动回调,不会存在空轮询的情况,只对活跃的连接实现主动回调,这样性能大幅度提升,,而是时间复杂度为o(1)。这就是为什么ngixredis都能支持很高程度的并发,最终都是linuxio多路复用机制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是否支持事务机制?事务支持回滚吗?

支持。两种形式:MultiWatch

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpffsg.html