Redis rio

Redis rio的代码很少,基本上包了一个虚基类:

struct _rio {
    void (*update_cksum)(struct _rio *, const void *buf, size_t len);

    /* The current checksum */
    uint64_t cksum;

    /* Backend-specific vars. */
    union {
        struct {
            sds ptr;
            off_t pos;
        } buffer;
        struct {
            FILE *fp;
            off_t buffered; /* Bytes written since last fsync. */
            off_t autosync;   // buffered超过这个值自动更新,默认为0
        } file;
    } io;
};

API如下:

static inline size_t rioWrite(rio *r, const void *buf, size_t len) ;  // 调用 rio->write,同时更新checksum
static inline size_t rioRead(rio *r, void *buf, size_t len) // 调用 rio->read,同时更新checksum
static inline off_t rioTell(rio *r);  //直接调用rio->tell

void rioInitWithFile(rio *r, FILE *fp);  // 初始化rio->io->file
void rioInitWithBuffer(rio *r, sds s);  // 初始化rio->io->buffer

//  以下几个是High Level Interface,用于写AOF文件
size_t rioWriteBulkCount(rio *r, char prefix, int count);
size_t rioWriteBulkString(rio *r, const char *buf, size_t len);
size_t rioWriteBulkLongLong(rio *r, long long l);
size_t rioWriteBulkDouble(rio *r, double d);


// 更新crc64 checksum

void rioGenericUpdateChecksum(rio *r, const void *buf, size_t len);


// 设置自动sync的字节数

void rioSetAutoSync(rio *r, off_t bytes);


最后嗨提供了两种rio类型:

static const rio rioBufferIO = { 
    rioBufferRead,
    rioBufferWrite,
    rioBufferTell,
    NULL,           /* update_checksum */
    0,              /* current checksum */
    { { NULL, 0 } } /* union for io-specific vars */
};

static const rio rioFileIO = { 
    rioFileRead,
    rioFileWrite,
    rioFileTell,
    NULL,           /* update_checksum */
    0,              /* current checksum */
    { { NULL, 0 } } /* union for io-specific vars */
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值