什么是Redis?
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value、NoSQL数据库,并提供多种语言的API。
它支持存储的value包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
它常用于高并发场景,能够访问访问海量数据,查询效率也非常高。
为什么Redis这么快?
- Redis本身由C语言编写,而且完全基于内存,绝大部分是内存操作,执行效率高。
- 采用单线程,防止多线程竞争问题
- 数据结构简单,操作也简单
- 采用IO多路复用模型,非阻塞IO
如何用Redis实现分布式锁?
分布式锁需要解决的问题?
- 互斥性
- 安全性
- 死锁
- 容错
Redis实现分布式锁的方法
通过set key value [EX seconds] [PX millseconds] [NX][XX]设置过期的时间以避免key大量堆积。通过NX模式判定该key资源是否被占用,如果返回为ok,则表示被占用,那么该线程将会阻塞等待。否则获取该资源。
如何使用Redis做异步队列?
使用List作为队列,RPUSH生产消息,LPOP消费消息
- 缺点:没有等待队列里有值就直接消费
- 弥补:可以通过在应用层引入Sleep机制去调用LPOP重试
BLPOP key [key …] timeout : 阻塞直到队列里有消息或超时
缺点: 只能供一个消费者消费
pub/sub: 主题订阅者模式
- 发送者(pub)发送消息,订阅者(pub)接收消息
- 订阅者可以订阅任意数量的频道
- 缺点: 消息的发布是无状态的,无法保证可达,如果消费者在生产者发布消息时下线,消费者重新上线将无法收到。