面试-客户端与redis的完整通信
一个服务端进程可以同时处理多个套接字描述符【Socket】。
IO多路复用程序负责监听多个套接字并向文件事件分派器传送那些产生了事件的套接字。文件事件分派器接收IO多路复用程序传来的套接字,并根据套接字产生的事件的类型,调用相应的事件处理器
事件分派器每次从队列中取出一个 socket,根据 socket 的事件类型交给对应的事件处理器进行处理
建立连接
-
服务端进程初始化的时候,server socket 定义一个AE_READABLE 事件与连接应答处理器关联
-
客户端 socket01 向 redis 进程的 server socket 请求建立连接,此时 server socket 会产生一个 AE_READABLE 事件,IO 多路复用程序监听到 server socket 产生的事件后,将该 server socket压入队列中
-
文件事件分派器从队列中获取 socket,交给连接应答处理器
-
创建一个能与客户端通信的 客户端 socket01,并将该客户端 socket01 的 AE_READABLE 事件与命令请求处理器关联
执行一个set请求
-
客户端发送了一个 set key value 请求,此时 redis 中的 socket01 会产生 AE_READABLE 事件,IO 多路复用程序将 socket01 压入队列
-
事件分派器将事件交给命令请求处理器来处理。命令请求处理器读取 socket01 的 key value 并在自己内存中完成 key value 的设置,它会将 socket01 的 AE_WRITABLE 事件与命令回复处理器关联
-
如果此时客户端准备好接收返回结果了,那么 redis 中的 socket01 会产生一个 AE_WRITABLE 事件,同样压入队列中
-
事件分派器找到相关联的命令回复处理器,由命令回复处理器对 socket01 输入本次操作的一个结果,比如 ok,之后解除 socket01 的 AE_WRITABLE 事件与命令回复处理器的关联
面试-Redis的数据结构有哪些
数据类型
-
字符串
-
编码格式:int编码(小于等于12字节并且字符串可以表示为整数);embstr编码【SDS】(字符串长度小于等于39字节时);raw编码【SDS】(大于39字节或者字符串不能表示为整数)
-
网站的访问次数统计(自增自减),限流(incr和expire命令),Session会话管理;缓存;分布式锁
-
-
哈希
-
编码格式:ziplist(压缩列表):当Hash类型的元素比较少,且元素的大小比较小(小于64字节)时;hashtable(字典)
-
存储对象:(购物车)将对象的属性和属性值存储在哈希类型中
-
-
列表
-
编码格式:ziplist(压缩列表):最大长度为2^16-1个元素;linkedlist(任意长度)
-
应用场景:轻量级消息队列,时间序列(LPUSH和RPUSH);排行榜(比如直播间进入,ZADD broadcast:20210108231 1 zhangsan;后期更新对应的得分;ZRANGE获取排行榜);关注好友(ZADD 1:follow time(时间戳) 2)–后期补充
-
-
不重复集合
-
编码格式:intset(整数集合):只包含整数类型的数据,并且元素数量较少(小于512个)时;hashtable(字典)
-
应用场景:朋友圈点赞、用户(微博好友)关注、相关关注、共同关注、好友关系等
-