文章目录
Redis简介
redis和memcache区别
Memcache:
- 支持简单数据类型
- 不支持数据持久化存储
- 不支持主从
- 不支持分片
Redis:
- 数据类型丰富
- 支持数据磁盘持久化存储
- 支持主从
- 支持分片
为什么Redis能这么快
- 10万+QPS (QPS即query per second,每秒内查询次数)
- 数据结构简单,对数据操作也简单
- 采用单线程(主线程是单线程,对于客户端的读写请求一直是串行处理,不会有并发的问题,避免了上下文切换和锁的竞争,执行起来效率更高),单线程也能处理高并发请求,想多核也可启动多实例
- 使用多路I/O复用模型,非阻塞IO
传统的阻塞I/O模型
如果对一个文件操作时,他的文件描述符为不可读或者不可写时,则redis服务则不会对其他的操作做出响应,导致整个服务不可用。
多路I/O复用模型
Redis的数据类型
- String:最基本的数据类型,二进制安全
- Hash:String元素组成的字典,适用于存储对象
hmset lilei name “lilei” age 26
hget lilei age - List:列表,按照String元素插入顺序排序
lpush mylist aaa
lpush mylist bbb
lrange mylist 0 10 - Set:String元素组成的无序集合,通过哈希表实现,不允许重复
sadd myset 111
sadd myset 222
smembers myset - Sorted Set:通过分数来为集合中的成员进行从小到大的排序
zadd myzset 3 abc
zadd myzset 1 abd
zadd myzset 2 bnf
zrangebyscore myzset 0 10 - 用于计数的HyperLogLog
- 用于支持存储地理位置信息的Geo
从海量key里查询出某一固定前缀的key
首先要摸清数据规模,数据量特别大的时候不能直接keys parttern
我们可以使用游标scan
SCAN cuisor [MATCH pattern] [COUNT count ]
- 基于游标的迭代器,需要基于上一次的游标延续之前的迭代过程
- 以0作为游标开始一次新的迭代,直到命令返回游标0完成一次遍历
- 不保证每次执行都返回某个给定数量的元素,支持模糊查询
- 一次返回的数量不可控,只能大概率符合count参数
如何通过Redis实现分布式锁
SET key value [EX seconds] [PX milliseconds] [NX|XX]
- EX second:设置键的过期时间为second秒
- PX millisecond:设置键的过期时间为millisecond 毫秒
- NX:只在键不存在时,才对键进行设置操作
- XX:只在键存在时,才对键进行设置操作
- SET操作成功完成时,返回OK,否则返回nil
实现异步队列
使用List作为队列,RPUSH生产消息,LPOP消费消息
缺点:等待队列里有值不会直接消费,必须lpop才能拿到队列里面的消息
弥补:可以通过应用层引入Sleep机制去调用lpop重试;或者
BLPOP key [key …] timeout:阻塞直到队列有消息或者超时
Redis如何持久化
RDB持久化
保存某个时间点的全量数据快照
- save:阻塞Redis的服务器进程,直到RDB文件被创建完毕
- bgsave:Fork出一个子进程来创建RDB文件,不阻塞服务器进程
AOF(Append-Only-File)持久化:保存写状态
- 记录下除了查询以外的所有变更数据库状态的指令
- 以append的形式追加保存到AOF文件中(增量)
RDB和AOF优缺点
RDB优点:全量数据快照,文件小,恢复快
RDB缺点:无法保存最近一次快照之后的数据
AOF优点:可读性高,适合保存增量数据,数据不易丢失
AOF缺点:文件体积大,恢复时间长
最好的持久化方式: bgsave做镜像全量持久化,AOF做增量持久化
Redis数据的恢复
RDB和AOF共存下恢复流程:
如果存在AOF,加载AOF,完成启动;
如果不存在AOF,加载RDB,完成启动;