redis之事件驱动
引言redis服务器是一个事件驱动程序,服务器需要处理两类事件:
文件事件处理器:redis基于reactor模式开发的网络事件处理器。
事件事件处理器: 比如serverCron函数,需要在给定的时间点执行。
文件事件处理器使用io多路复用来同时监听多个套接字,并根据套接字目前执行的任务为套接字关联不同的事件处理器。当被监听的套接字准备好执行连接应答、读取、写入、关闭等操作时,与之操作相对应的文件事件就会产生,这些文件事件就会调用套接字关联的事件处理器处理这些事件。
事件处理流程
server.c mainredis服务端主线程中定义有如下代码:
12345678910int main(int argc, char **argv) { ... initServer(); // 创建、初始化服务端数据结构, ... initListeners(); // 初始化服务器后,初始化监听器 ... aeMain(server.el); // 启动 事件循环 aeDeleteEventLoop(server.el); // 服务器关闭时 ...
c语言基础函数整理
阅读redis源码过程中有比较多的C语言函数调用,起一个文档记录。
fflush刷新流stream的输出缓冲区,成功返回0,否则返回eof
1int fflush(FILE *stream)
fopen1FILE *fopen(char *filename, char *mode);
fclose用于关闭一个已经打开的文件。关闭文件后,该文件的指针将不再指向该文件,文件的缓冲区中的数据将被写入到磁盘中,文件的描述符将被释放,以便其他程序可以使用该文件。
1int fclose(FILE *stream);
fileno获取标准IO流的文件描述符。
1int fileno(FILE *stream);
unlink删除文件。PS: 执行unlink()函数并不一定会真正的删除文件,它先会检查文件系统中此文件的连接数是否为1,如果不是1说明此文件还有其他链接对象,因此只对此文件的连接数进行减1操作。若连接数为1,并且在此时没有任何进程打开该文件,此内容才会真正地被删除掉。
1int unlink(const char *pathname);
snprintf用于格式化输出字 ...
redis之持久化
由于redis是内存数据库,其数据库状态保存在内存中。redis中提供了持久化功能,用以将redis内存中的数据库状态保存在磁盘中,避免意外的数据丢失。
Redis中提供了两种持久化方式,分别是RDB和AOF。
RDBRDB持久化功能可以将某个时间点上的数据库状态保存到一个RDB文件中,所生成的RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时的数据库状态。
RDB文件载入rdb文件的载入工作是在服务器启动时自动执行的。因为aof文件的更新频率通常比rdb文件的更新频率高,所以如果服务器开启了AOF持久化功能,服务器将优先使用AOF文件来还原数据库状态。只有在AOF持久化功能处于关闭时,服务器才会使用rdb文件来还原数据库状态。
另外,在服务器载入rdb文件期间,会一直处于阻塞状态,直到载入完毕。
RDB文件创建redis中可以使用SAVE和BGSAVE两个命令生成RDB文件。其中,save命令会阻塞服务器进程,直到RDB文件创建完毕位置,在此期间,服务器不能处理任何命令请求。而BGSAVE命令则会派生出一个子进程,由子进程负责创建RDB文件,服务器主进程可以继续 ...
redis之服务器
redis服务器redis服务器负责与多个客户端建立网络连接,处理客户端请求,在数据库中保存客户端执行命令所产生的数据,并通过资源管理来维持服务器的自身运转。本文将应用侧和源码侧两个角度进行描述。
服务器的功能:redis客户端发送命令后,服务器如何处理;
服务器源码结构中相关重要参数。
redis架构详解单机模式主从模式哨兵模式集群模式慢查询日志redis的慢查询日志功能用于记录执行时间超过设定时长的命令请求,用户可以通过这个功能那个产生的日志来监控和优化查询。服务器配置中包含如下两个和慢查询有关的参数:
slowlog-log-slower-than: 执行时长超过多少微秒时,将命令记录到慢查询日志中;如果=0,则表示将存储所有执行的日志。
slowlog-max-length: 指定服务器能保存多少条慢查询日志。
redisServer属性众多,现在来看下和慢查询相关的属性:
123456struct redisServer { list *slowlog; /* SLOWLOG list of commands ...
redis之特殊数据类型
bitmapbitmap即位图,是一种基于位运算的数据结构,用连续的二进制位描述某些业务,例如用户的签到状态等。redis中的string是二进制安全的,故而使用string来描述这个位图。相比其他数据结构,位图所占用的存储空间非常小,在上述的业务场景,使用位图更加高效。
Redis提供了SETBIT、GETBIT 、BITCOUNT 、BITOP四个命令,用于处理二进制数组
SETBIT1SETBIT key offset value
SETBIT用于将二进制数组在偏移量位置处的二进制值设置为value,当key不存在时,会自动生成一个新的字符串值。字符串会扩展以确保可以在offset位置上设置value值,当字符串扩展时,空白位置以0填充 offset>=0, 小于512M注意对于较大的OFFSET值,命令执行过程中的内存分配可能阻塞redis服务器。
1234123.122.10.231:6379> setbit bitmap 10086 1(integer) 0123.122.10.231:6379> getbit bitmap 10086(int ...
redis之基础数据类型
redis是一个开源的、基于内存的存储结构[使用C语言编写],通常被用于缓存、消息订阅等场景。
redis的特点
基于内存:redis借助RAM提供高速的数据访问,比磁盘要快几个量级
redis的基础数据类型
redis是键值对数据库,redis中的键均为字符串,redis中最基础的五种数据类型:string、lsit、set、zset、hashredis中使用redisObject来描述所有的key和value,redisObject的结构体定义如下:
1234567891011121314struct redisObject { // 数据类型, 占4bit unsigned type:4; // 编码格式 占4bit unsigned encoding:4; // 此对象最后一次被访问的时间 占24bit unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or * LFU data (le ...
github + hexo建站[待补充]
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick StartCreate a new post1$ hexo new "My New Post"
More info: Writing
Run server1$ hexo server
More info: Server
Generate static files1$ hexo generate
More info: Generating
Deploy to remote sites1$ hexo deploy
More info: Deployment
排障123INFO Deleted database.FATAL Something's wrong ...
随笔
阿里巴巴java开发手册阅读
很多编程方式客观上没有对错之分,一致性很重要,可读性很重要,团队沟通效率很重要。有一个理论叫帕金森琐碎定律: 一个组织中的成员往往会把过多的精力花费在一些琐碎的争论上。
java之拦截器
引用1. 一文了解拦截器与拦截器链的实现2. 自定义注解实现方式解析3. 拦截器原理4. MyBatis拦截器实现sql查询权限动态修改5. 自定义一个拦截器实现打印完整sql6. 自定义注解实现方式解析7. MyBatis 分页插件 PageHelper:是如何拦截SQL进行分页