目标
侧重单机,系统知识
安装的是5.0版本,最新的到6+
数据类型+常用命令
- string
- list
- hash
- set
- zset
常用操作命令,看一下!
string字符串
- 可以存字符串、数字、二进制数据。
- redis中key和value都可以是string。是最基层的数据类型。
- 最大可存放512M数据
list列表
- 线性、有序,元素可重复
- 一个list最多存储2^32-1个元素
- 可以当作简单的消息队列(一端进一端出)使用,支持lpush(左侧推数据),blpush(以阻塞形式左推)、rpop(右侧弹数据)、lrpop(阻塞右弹)
- 5.0/4.0推出的stream是专业消息队列?
hash散列表
一个hash最多存储2^32-1个元素
set集合
- 无序、不可重复
- 一个list最多存储2^32-1个元素
- 支持多个set求交集、并集、差集。可实现共同关注等的需求
zset集合
- 有序、不可重复
- 一个list最多存储2^32-1个元素
功能、应用场景
- string适合做缓存
- set适合做共同关注
- 有序数据可以用set存
注:list是按插入/推的自然顺序排序,set是按我们给的分数/权值排序。
小结:
string最大存512M数据 广义集合类型,最多存2^32-1个元素
实现/编码机制(源码)
略
string、zlplist、skiplist跳表、hashtable
事务机制
通过几个命令来实现:multi、exec、discard、watch等
- multi:开启客户端事务模式。此时客户端执行的所有命令都会放到本地一个事务队列中
- exec:执行当前事务。把事务队列中的命令批量发给服务器,Redis批量、顺序执行
- discard:取消事务。清空事务队列中已有的命令,并使客户端退出事务模式
- watch:加乐观锁。要求服务器对key进行监视,如果执行事务前key发生变化,就拒绝执行事务
注意:
- Redis支持简单的事务,不支持回滚,(一般)不
完全支持ACID中的D持久性(实时刷盘?)。 - Redis的持久化是先把数据写到页缓存,页缓存再刷到磁盘上。如果经常/每次命令刷盘不如直接用mysql,所以只有间歇性刷盘,不完全支持D。如:丢失一秒数据,可以接受
线程模型——单线程
单线程的前提
- redis的网络IO和键值对读写,是单线程的,由一个线程完成
- redis的其他功能,如持久化、异步删集群数据同步等,由其他线程执行
- redis内部有多个线程,其主要业务是由一个线程完成,单线程
单线程优缺点
- 优:单线程简化数据结构和算法的实现(不用加锁),避免线程切换、加锁竞争造成的消耗
- 缺:某个命令执行时间过长,会造成阻塞。比如: keys * 查看所有的key
单线程的IO模型
- redis的大部分操作是在内存上完成的
- redis采用IO多路复用机制,并发处理大量请求
IO多路复用原理:
redis服务器通过套接字处理并发请求。服务器通过多个socket与客户端连接。
- socket几种状态:
- 客户端链接服务器
- 链接关闭
- socket接收到客户端传的数据准备写入
- 服务器数据已经准备好了socket给客户端返回数据读取
IO多路复用底层就是:
- IO多路复用程序(单线程的)监听socket的状态,处于需要处理的状态时(上面四种),把socket对象加入套接字队列。需要被处理的多个线程就变得有序了。由一个线程依次处理。
- 然后文件事件分派器依次读取队列中的socket,根据socket状态分发给对应事件处理器处理。
- 命令请求处理器,命令回复处理器,连接应答处理器。
底层操作系统的实现机制:
- select
- epoll
- evport
- kqueue
redis都支持,根据性能实现