Memcache和Redis的区别
-
Memcache代码层次类似Hash
- 支持简单数据类型
- 不支持数据持久化存储
- 不支持主从
- 不支持分片
-
Redis
- 数据类型丰富
- 支持数据磁盘持久化存储
- 支持主从
- 支持分片
为什么Redis能这么快(100000+QPS(每秒内查询次数))
- 完全基于内存,绝大部份请求是纯粹的内存操作,执行效率高
- 数据结构简单,对数据操作也简单
- 采用单线程,单线程也能处理高并发请求,想多核也可启动多实例
- 使用多路I/O复用模型,非阻塞IO
Redis采用的I/O多路复用函数:epoll/kqueue/evport/select
- 根据不同操作系统选择采用不同的I/O多路复用函数
- 优先选择时间复杂度为O(1)的I/O多路复用函数作为底层实现
- 以时间复杂度为O(n)的select作为保底
- 基于react设计模式监听I/O事件
Redis数据类型
- String
- Hash,适合存储对象
- List,列表,按插入顺序排序
- Set,无序不重复集合
- Sorted Set,通过分数从小到大排序
- 用于计数的HyperLogLog,用于支持存储地理位置信息的Geo
Redis数据类型底层数据类型基础
- 字符串
- 链表
- 字典
- 跳跃表
- 整数集合
- 压缩列表
- 对象
Redis从海量Key里查询出某一固定前缀的Key
语法:SCAN cursor [MATCH pattern] [COUNT count]
示例:scan 0 match key1 count 10*
- 基于游标的迭代器,需要基于上一次的游标延续之前的迭代过程
- 以0作为游标开始一次新的迭代,直到命令返回游标0完成一次遍历
- 不保证每次执行都返回某个给定数量的元素,支持模糊查询
- 一次返回的数量不可控,只能是大概率符合count参数
如何通过Redis实现分布式锁
-
分布式锁需要解决的问题
- 互斥性
- 安全性
- 死锁
- 容错
-
使用 setnx key value
- 如果key不存在,则创建并赋值
- 时间复杂度为O(1),设置成功返回1,失败返回0
-
如何解决setnx长期有效的问题
- 设置key的生存时间,当key过期时,会被自动删除
- expire key seconds,缺点:原子性得不到满足
-
使用 set key value [EX seconds] [PX milliseconds] [NX|XX]
- 示例:example:set key1 123456 ex 10 nx
- EX seconds:设置键的过期时间为second(秒)
- PX milliseconds:设置键的过期时间为milliseconds(毫秒)
- NX:只在键不存在时,才对键进行设置操作
- XX:只在键已经存在时,才对键进行设置操作
- set操作成功完成时,返回OK,否则返回nil
Redis中大量的key同时过期的注意事项
- 集中过期时,由于清除大量的key很耗时,会出现短暂的卡顿现象
- 解决方案: 在设置key的过期时间的时候,给每个key加上随机值
如何使用Redis做异步队列
-
使用List作为队列,rpush生产消息,lpop消费消息
- 缺点:没有等待队列里有值就直接消费
- 弥补:可以通过在应用层面引入sleep机制去调用lpop重试
-
使用blpop,阻塞直到队列有消息或者超时
- 缺点:只能供一个消费者消费
-
pub/sub:主题订阅者模式
- 缺点:消息的发布是无状态的,无法保证可达
Redis如何持久化
-
RDB(快照)持久化:保存某个时间点的全量数据快照
- 优点:全量数据快照,文件小,恢复快
- 缺点:
- 内存数据的全量同步,数据量大会由于I/O而严重影响性能
- 可能会因为Redis挂掉而丢失从当前至最近一次快照期间的数据
-
AOF(Append-Only-File)持久化:保存写状态
- 记录下除了查询以外的所有变更数据库状态的指令,以append的形式追加保存到AOF文件中(增量)
- 优点:可读性高,适合保存增量数据,数据不易丢失
- 缺点:文件体积大,恢复时间长
- 记录下除了查询以外的所有变更数据库状态的指令,以append的形式追加保存到AOF文件中(增量)
AOF日志重写流程:
- 调用fork(),创建一个子进程
- 子进程把新的AOF写到一个临时文件里,不依赖原来的AOF文件
- 主进程持续将新的变动同时写到内存和原来的AOF里
- 主进程获取子进程重写AOF的完成信号,往新AOF同步增量变动
- 使用新的AOF文件替换掉旧的AOF文件
- RDB-AOF混合持久化方式
Redis主从复制
一般为主服务提供写操作,从服务提供读操作
-
主从复制的好处
- 数据冗余,实现数据的热备份
- 故障恢复,避免单点故障带来的服务不可用
- 读写分离,负载均衡。主节点负载读写,从节点负责读,提高服务器并发量
- 高可用基础,是哨兵机制和集群实现的基础
-
主从复制的实现原理 www.cnblogs.com/kismetv/p/9…