一.Redis效率高的原因
众所周知,Redis常用来做缓存,从而提高项目QPS(每秒查询率)。QPS = 并发量 / 平均响应时间
然而其效率高的原因包含但不仅限于如下几点:
1.Redis基于内存,绝大部分操作都是直接对内存的操作,执行效率高。官方提供的数据是可以达到100000+的QPS
2.数据结构简单,因此对数据的操作也简单
3.采用单线程处理请求,将多个请求串行处理,避免线程创建销毁的开销和线程上下文切换的开销
4.采用I/O多路复用,且是非阻塞IO
二.通过Redis实现分布式锁
1.通过使用setnx key value方式:
如果key不存在,则创建并赋值,如果key存在,则设置失败,因此可以保证数据的安全性。可以通过expire来设置该key的生存时间,当超过生存时间后该key和value会被删除。
附:该方式设置成功返回1,失败返回0,时间复杂度为O(1),缺点是每次操作都需要setnx和expire两个步骤,原子性得不到满足,在setnx之后和expire之前的过程中甚至可能出现死锁等情况。
2.通过set key value ex px nx/xx方式:
ex和px是过期时间,单位是秒和毫秒。nx是当key不存在的时候进行设置操作,而xx是当key存在的时候进行设置操作。该方法保证了原子性,提高了安全性,但多个对象同时过期的时候可能会造成短暂的卡顿,可以给每个key加上一个随机值来解决该卡顿问题。
三.通过Redis实现异步队列
1.生产者消费者模式
使用List作为队列,通过rpush将消息加入队列,通过lpop将消息从队列中取出(先进先出),从而实现异步队列。通常将rpush看做生产者,将lpop看做消费者,当消费者获得数据后,数据将消失。
该方式的缺点是:可能队列中没有消息,却lpop数据,并且生产者和消费者的关系是一对一的,一个生产者生产的数据只能被一个消费者消费。
2.发布订阅模式
发布者:publish key value
订阅者:subscribe key
该方式的缺点是:消息发布是无状态的,无法保证数据可达,对于发布者来说,消息发布就等同于消息丢失,无法确认订阅者是否收到消息。例如:在发布者发布消息的时候,订阅者下线了,重新上线的订阅者无法接受到发布者刚才发布的消息。
四.Redis持久化方式
Redis默认开启了RDB存储方式进行持久化,以一个dump.rdb文件存。
1.RDB持久化:
它开启持久化条件是在一定时间内,key和value达到一定的存储次数,可以在redis.conf中的save中设置,如下图
附:如果在配置文件中将stop-writes-on-bgsave-error设置为yes,那么当备份进程出错时,就会停止接收写入操作,以此保证持久化数据一致
2.AOF持久化
开启:在Redis.conf文件中,将appendonly设置为yes
3.RDB-AOF混合模式
使用BGSAVE做镜像全量持久化,AOF做增量持久化
关于Redis的其他介绍可以参考我的上一篇文章https://www.cnblogs.com/ywb-articles/p/10660071.html
如果想深入了解Redis,可以参考官方文档http://redisdoc.com/index.html