一.Redis 简介
Redis英文拼写: REmote DIctionary Server
redis是一个高性能的key-value数据库,它是完全开源免费的,而且redis是一个NOSQL类型数据库,是为了解决高并发、高扩展,大数据存储等一系列的问题而产生的数据库解决方案,是一个非关系型的数据库。但是,它也是不能替代关系型数据库,只能作为特定环境下的扩充。
Redis的优势和特点
- redis数据读写速度非常快,因为它把数据都读取到内存当中操作,而且redis是用C语言编写的,是最“接近“”操作系统的语言,所以执行速度相对较快。
- redis虽然数据的读取都存在内存当中,但是最终它是支持数据持久化到磁盘当中。
- redis提供了丰富的数据结构。
- redis的所有操作都是原子性,支持事务,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行。
- redis支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
Redis的应用场景
- redis由于数据的读取和操作都在内存当中操作,读写的效率较高,所以经常被用来做数据的缓存。把一些需要频繁访问的数据,而且在短时间之内不会发生变化的,放入redis中进行操作。从而提高用户的请求速度和降低网站的负载,降低数据库的读写次数,就把这些数据放到缓存中。
- 一些常用的实时计算的功能。需要实时变化和展示的功能,就可以把相关数据放在redis中进行操作。大大提高效率。
- 消息队列,经常用来构建类似实时聊天系统的功能,大大提高应用的可用性。
Redis 简化的源码框架
从main()分析,redis主要做了几件事:
- redis原理:在内存层面用类型、key_len、ken、value_len、value存储数据,在文件中一行一条数据(kv关系)。
- 设置默认参数
- 创建对象、持久化定时器回调
- 加载文件参数
- 加载文件数据写入字典
- 创建client connect事件handler(accept后,写入读写事件select(),最新的版本用epoll)
- 调用事件多路复用循环
- 退出
int main(int argc, char * *argv)
{
initServerConfig(); // 设置默认参数
initServer(); // 设置系统信号、字典、对象链表、公共对象、事件(文件,定时器)、6379服务器、持久化回调定时器
if (argc == 2) { // 使用配置文件替代部分默认参数
ResetServerSaveParams();
loadServerConfig(argv[1]);
redisLog(REDIS_NOTICE, "Configuration loaded");
}
else if (argc > 2) {
fprintf(stderr, "Usage: ./redis-server [/path/to/redis.conf]\n");
exit(1);
}
redisLog(REDIS_NOTICE, "Server started");
if (loadDb("dump.rdb") == REDIS_OK) // 加载数据到字典
redisLog(REDIS_NOTICE, "DB loaded from disk");
if (aeCreateFileEvent(server.el, server.fd, AE_READABLE,
acceptHandler, NULL, NULL) == AE_ERR)
oom("creating file event"); // 注册6379客户端连接事件处理
redisLog(REDIS_NOTICE, "The server is now ready to accept connections");
aeMain(server.el); // 定时/网络读写事件多路复用监听
aeDeleteEventLoop(server.el); // 销毁事件循环,退出redis进程
return 0;
}