持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情
AOF以执行命令的形式来同步。
在Redis的配置文件中存在三种同步方式,它们分别是:
appendfsync always #每次有数据修改发生时都会写入AOF文件,能够保证数据不丢失,但是效率非常低。
appendfsync everysec #每秒钟同步一次,可能会丢失1s内的数据,但是效率非常高。
appendfsync no #从不同步。高效但是数据不会被持久化。
直接修改redis.conf中 appendonly yes
建议最好还是使用everysec 既能够保证数据的同步、效率也还可以。
redis应用场景:
1、token令牌的生成
2、短信验证码的code(利用reids的有效期)
3、缓存查询数据(存在reids与mysql数据库不同步的问题)
4、reids帮助实现计数器(单线程保证线程安全问题)
5、分布式锁
6、延迟操作(秒杀抢购,库存减一,设置支付令牌token,有效期30分钟,到30分钟进行监听,如果30分钟没有支付,订单就会作废,库存加一)
7、分布式消息中间件
redis单线程模型
Redis的底层采用Nio中的多路IO复用的机制,也就是一个线程(单线程)维护多个不同的reids客户端连接,从而提高并发效率和保证线程安全问题。底层采用linux操作的nio epoll实现,防止空轮训。
Redis单线程,也就是底层采用一个线程维护多个不同的客户端io操作。
select选择器单线程,把所有的请求遍历,放到集合中,可以看做是一个注册中心。
但是Nio在不同的操作系统上实现的方式有所不同,在我们windows操作系统使用select实现轮训时间复杂度是为o(n),而且还存在空轮训的情况,效率非常低, 其次是默认对我们轮训的数据有一定限制,所以支持上万的tcp连接是非常难。
所以在linux操作系统采用epoll实现事件驱动回调,不会存在空轮训的情况,只对活跃的 socket连接实现主动回调这样在性能上有大大的提升,所以时间复杂度是为o(1)