P8补充-Redis

159 阅读4分钟

目标

侧重单机,系统知识

image.png

安装的是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都支持,根据性能实现

image.png

看IO多路复用select,epoll

书:Redis设计与实现(底层)、Redis开发与运维(实践)、mysql技术内幕:innoDB、大型网络技术架构、操作系统导论、mysql必知必会(太浅)、xxspring技术内幕