![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
redis
文章平均质量分 80
tiantao2012
这个作者很懒,什么都没留下…
展开
-
redis 中的sds
redis中使用sds来表示一个字符串,同时兼用c语言中的字符串,c语言中的字符串在redis中一般用作字符常量其实现在E:\redis-3.0-annotated-unstable\redis-3.0-annotated-unstable\src\sds.h 和sds.c中sds 的数据结构如下:struct sdshdr { // buf数组中已经占用的长度,这等于字符原创 2018-02-02 11:44:10 · 719 阅读 · 0 评论 -
redis中的watch命令
watch 用于在进行事务操作的最后一步也就是在执行exec 之前对某个key进行监视如果这个被监视的key被改动,那么事务就被取消,否则事务正常执行.一般在MULTI 命令前就用watch命令对某个key进行监控.如果想让key取消被监控,可以用unwatch命令被监视的key会被保存在两个地方一个是:typedef struct redisClient { // 被监视的键原创 2018-02-13 08:20:07 · 4740 阅读 · 0 评论 -
redis中的事件处理
redis中的事件分为文件事件和时间事件。redis中用aeEventLoop 来记录事件的状态typedef struct aeEventLoop { // 文件事件 aeFileEvent *events; /* Registered events */ // 时间事件 aeTimeEvent *timeEventHead;} aeEventLoop;原创 2018-02-14 08:25:18 · 476 阅读 · 0 评论 -
redis中的文件事件和时间事件
redis服务器是一个事件驱动程序。可以分为文件事件和时间事件,其中文件事件是服务器和客户端之间连接套接字的抽象,而时间事件又分为定时事件和周期事件,目前redis 只实现了周期事件.redis 文件事件是通过select/epoll等这些函数库的包装.举例如下:例如我们通过下面这个函数关联事件到fdstatic int aeApiAddEvent(aeEventLoop *eventL原创 2018-02-08 08:24:07 · 865 阅读 · 0 评论 -
redis中可以使用的内存分配的库和redis默认是被build成32位的可执行程序
在redis中的makefile中,可以看到redis可以使用四种内存管理的库分别是glibc/jemalloc/tcmalloc/tcmalloc_minimal从Makefile中可以看出如果是linux系统的话,默认用的是jemalloc# Default allocatorifeq ($(uname_S),Linux) MALLOC=jemallocelse MALLOC=li...原创 2018-03-01 11:27:45 · 623 阅读 · 0 评论 -
redis的main函数
redis的入口函数在redis.c 中的main函数中int main(int argc, char **argv) { // 初始化服务器配置,主要用于给struct redisServer server; 赋值,并实现一些基本的命令。,并监听clint的连接信息。 initServerConfig(); // 从这里可以看到可以通过-v 或者 --versio原创 2018-02-22 20:12:01 · 2570 阅读 · 0 评论 -
redis中io复用之evport
从redis中的ae.c中可以知道目前复用io的方式有下面四种#ifdef HAVE_EVPORT#include "ae_evport.c"#else #ifdef HAVE_EPOLL #include "ae_epoll.c" #else #ifdef HAVE_KQUEUE #include "ae_kqueue.c" ...原创 2018-03-05 09:46:05 · 3360 阅读 · 0 评论 -
redis中io复用之epoll
前面讲过evport的实现,下来我们继续看看我们epoll在redis中的使用1:首先通过epoll_create 来新建fd例如:typedef struct aeApiState { int epfd; struct epoll_event *events;} aeApiState;static int aeApiCreate(aeEventLoop *eventLo...原创 2018-03-12 15:31:13 · 917 阅读 · 0 评论 -
redis中io复用之kqueue
前面讲过evport/epoll的实现,下来我们继续看看我们kqueue在redis中的使用1:首先通过kqueue申请提供给系统监控的fdtypedef struct aeApiState { int kqfd; struct kevent *events;} aeApiState;static int aeApiCreate(aeEventLoop *eventLoo...原创 2018-03-12 16:33:30 · 844 阅读 · 0 评论 -
redis中io复用之select
前面讲过evport/epoll/kqueue的实现,下来我们继续看看我们select在redis中的使用1:首先通过FD_ZERO来清空用于监控读和写fd的rfds和wfds的链表typedef struct aeApiState { fd_set rfds, wfds; /* We need to have a copy of the fd sets as it's not...原创 2018-03-12 17:10:00 · 927 阅读 · 0 评论 -
redis中的持久化
redis 用redisServer 表示server端struct redisServer { /* General */ // 配置文件的绝对路径 char *configfile; /* Absolute config file path, or NULL */ // serverCron() 每秒调用的次数 int hz;原创 2018-02-07 08:34:15 · 508 阅读 · 0 评论 -
redis中事务的取消
redis的事务不能实现回滚,但是可以在正在执行的事务中通过discard 命令来取消事务的执行。struct redisCommand redisCommandTable[] = { {"discard",discardCommand,1,"rs",0,NULL,0,0,0,0,0},}void discardCommand(redisClient *c) { // 可原创 2018-02-12 08:22:45 · 1608 阅读 · 0 评论 -
redis中的事务
redis页支持事务。redis的事务是在MULTI 和 EXEC 命令之间的一条或者多条命令.从redis.c 中可以知道MULTI 命令的实现如下: {"multi",multiCommand,1,"rs",0,NULL,0,0,0,0,0},void multiCommand(redisClient *c) { // REDIS_MULTI 表示当前正在进行事务操作,...原创 2018-02-11 15:16:44 · 361 阅读 · 0 评论 -
redis中的list
redis的list 实现在如下路径中E:\redis-3.0-annotated-unstable\redis-3.0-annotated-unstable\src\adlist.htypedef struct listNode { struct listNode *prev; struct listNode *next; void *value;} list原创 2018-02-02 11:46:07 · 875 阅读 · 0 评论 -
redis中的dict
redis中用dict 表示一个字典typedef struct dict { // 类似sds定义一组函数指针 dictType *type; // 私有数据 void *privdata; // 哈希表 dictht ht[2]; // 当没有进行rehash操作是值为-1 int rehashidx; /* rehas原创 2018-02-02 19:58:29 · 502 阅读 · 0 评论 -
redis中的zskiplist
redis中通过zskiplist 来表示一个跳跃表typedef struct zskiplist { // 跳跃表的表头和表尾 struct zskiplistNode *header, *tail; // 表示有跳跃表中有几个节点 unsigned long length; // 跳跃表最大的层数 int level;} zskip原创 2018-02-03 08:14:26 · 759 阅读 · 0 评论 -
redis中的intset
整数集合inset是当一个集合中只包含整数值元素,并且这个集合元素不多时,redis就只用inset来保存这个集合,inset支持升级操作,所谓升级是值将数据类型有int16升级为int32的动作,但是目前不支持降级操作。inset中的元素是按照从小到大排列的。redis中的inset用如下结构体表示typedef struct intset { uint32_t enc原创 2018-02-03 08:15:32 · 933 阅读 · 0 评论 -
redis中的server/client/sentinel/集群
redis服务器是一个一对多的架构,服务端通过I/O 多路复用技术实现的文件事件处理,采用单线程单进程的方式来处理和多个client的请求.struct redisServer { // 保存了所有客户端状态结构 list *clients; /* List of active clients */ // 链表,保存了所有待关闭的客户端原创 2018-02-08 20:39:53 · 682 阅读 · 0 评论 -
redis中的memory管理
redis 中申请memory的实现在zmalloc.c/h 中。仔细阅读这两个文件可以返现redis 对memory的申请和释放方式都是在glibc中提供的malloc/free 的封装.我们以申请memory函数中的zmalloc 为例void *zmalloc(size_t size) { //调用malloc 来申请内存,注意这里申请的size ,会在形参size的基础上加上PRE原创 2018-02-09 08:19:58 · 736 阅读 · 0 评论 -
centos 中单机安装redis
下载安装并是能redisyum install redissystemctl enable redis.service启动服务端启动客户端并并设置一个key-value 键值对原创 2018-02-09 14:42:19 · 328 阅读 · 0 评论 -
redis的ziplist
当数据库中一个列表键只包含少量数据并且每个列表项是小整数值或者短的字符串,redis就用ziplist来保存。这里需要注意ziplist 是用连续的内存来保存值.redis 中通过ziplist来新建一个ziplist,其实现如下:unsigned char *ziplistNew(void) { // ZIPLIST_HEADER_SIZE 是表头大小 unsigned int原创 2018-02-05 08:25:55 · 755 阅读 · 0 评论 -
redis中的对象
1:redis中是通过对象来保存键和键值,其中对象是由sds/链表/字典/跳跃表/整数合集/压缩列表 这些基本类型组成,2:redis 对应基于引用计数的内存回收机制,当对象的引用计数为零时,对象会比回收。通过引用计数可以实现对象共享,对象共享主要是多个数据库键可以共享一个对象来节约内存。3:redis 对象带有访问时间记录信息.在服务器采用了maxmemory的情况下,长时间没有被用到的原创 2018-02-06 08:24:01 · 382 阅读 · 0 评论 -
bluestore中的aio回调
在bluestore中open block时会传递一个cb函数,当对这个block异步写也就是aio写完成时会调用这个aio_cbint BlueStore::_open_bdev(bool create){ assert(bdev == NULL); string p = path + "/block"; #aio_cb 时aio写完成时的回调函数,第四个参数static_cas...原创 2018-05-04 09:47:37 · 648 阅读 · 0 评论