标签:find 命令 poll watch 开放地址法 函数 杂记 local 字符串
local v1 = redis.call("LPOP", "lst")
print(v1)
redis.call("LPUSH", "nlist", "DDDD") // 这里会出错, nlist 是一个 字符键不是 列表键。
return v1
redis-cli 不支持 pipeline, 但是 sdk 支持。理论上所有使用 协议 交互的 client-server 架构服务都支持 pipeline (redis 等),只要 server 从 recieve buffer 接受一条不完整的数据能继续等待,以及接受到一条完整的数据后不会将多余的数据当作错误数据清除掉。 大多数人都犯了一个错误,即认为 pipeline 具有原子性。pipeline 支持批量发送数据。另外,pipeline 和 multi 没有木有关系。multi 中的命令是一条条返送到 server 端 queued 住,等到一条 exec 后才会执行的。 但是有的语言的 sdk 实现比较奇特,会在 client 端 queue multi 命令,直到用户程序请求 exec 时才会将 multi 到 exec 之间的命令通过 pipeline 方式发送到 redis !
redis-cli 中的 recieve buffer 有多大?
一个用于测试 pipeline 的命令: (printf "PING\r\nPING\r\nPING\r\n"; sleep 1) | nc localhost 6379
./server *:6379(print_trace+0x60) [0x562da7feb6e0]
./server *:6379(aeCreateFileEvent+0x49) [0x562da7f969b9] # 将readQueryFromClient 注册为 epoll 回调函数
./server *:6379(createClient+0x55) [0x562da7fa6b25]
./server *:6379(+0x2d2de) [0x562da7fa72de]
./server *:6379(acceptTcpHandler+0x63) [0x562da7fa73d3]
./server *:6379(aeProcessEvents+0x128) [0x562da7f96e08]
./server *:6379(aeMain+0x2b) [0x562da7f9717b]
./server *:6379(main+0x2b6) [0x562da7f95d76]
此外 redis-cli 版本大于 4.0 的话,在连接上 server 后会自动执行一下 command 命令, 而且 执行结果不会展示给用户
每次进入到事件循环前,会调用 beforeSleep 函数。 beforeSleep 函数会主动 expire key、主从同步、AOF 数据写回到磁盘(非强制,可能还在 linux io buffer 中)、处理哪些 blocked on key 中的 clients(blocked client 本身不是时间敏感的。所以某个 client set key 后不会立即处理 blocked client 的请求)
进入到事件循环后,会先计算最早需要处理的时间事件,根据这个计算出 epoll_wait 的等待时间。后续调用 epoll_wait 获取需要处理的 io 事件。处理完 io 事件后会处理所有需要处理的时间事件
当然改了系统时钟,redis 会做处理。具体的逻辑记得不太清楚了
标签:find 命令 poll watch 开放地址法 函数 杂记 local 字符串
原文地址:https://www.cnblogs.com/tmortred/p/13130901.html