请选择 进入手机版 | 继续访问电脑版

Redis中国用户组(CRUG)论坛

 找回密码
 立即注册

扫一扫,访问微社区

搜索
热搜: 活动 交友 discuz
查看: 1200|回复: 1

redis 如何保证exipre操作幂等性

[复制链接]

该用户从未签到

6

主题

13

帖子

76

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
76

论坛元老

发表于 2016-6-6 15:43:01 | 显示全部楼层 |阅读模式

陈群
链接:http://mdba.cn/2016/06/05/redis- ... %E7%AD%89%E6%80%A7/
之前在微信群讨论一个问题:redis启动时load aof文件会不存在因exipre 操作把key删除了?答案是不会的
因为redis设计aof并用之恢复数据时,需要保证exipre等时间操作的幂等性(idempotent)。
1、为什么时间相操作不存在幂等性的可能?
redis中,把expire操作执行成功后写入aof中时,相对时间(多少s后过期)转化成unix timestamp时间戳。当使用aof文件恢复数据时,这个key可能过期了,也有可能没有过期。如果过期了(相对当前的时间戳),理论上replay aof会删除这个key, 后续的操作(比如incr)会得到不一致的数据。
2、redis 启动机制保证expire操作的幂等性
redis启动时如果使用aof恢复数据,expire操作做了一些过滤机制。即server处于loading状态,即使key达到了过期时间,也不做其它的任何操作。
首先通过src/server.c中的rediCommandTable中的flag为‘wF’,就可以看出expire不允许loading过程中执行。
{"expire",expireCommand,3,"wF",0,NULL,1,1,1,0,0},
src/db.c中执行expire时,会判断server是否处于loading状态。
int expireIfNeeded(redisDb *db, robj *key) {    mstime_t when = getExpire(db,key);    mstime_t now;    if (when < 0) return 0; /* No expire for this key */    /* Don't expire anything while loading. It will be done later. */    if (server.loading) return 0;    ....}
3、主从数据的过期时间
redis只在主库上执行expire操作,通过del命令传播到从库完成过期数据的删除。
/* Propagate expires into slaves and the AOF file. * When a key expires in the master, a DEL operation for this key is sent * to all the slaves and the AOF file if enabled. * * This way the key expiry is centralized in one place, and since both * AOF and the master->slave link guarantee operation ordering, everything * will be consistent even if we allow write operations against expiring * keys. */void propagateExpire(redisDb *db, robj *key) {    robj *argv[2];    argv[0] = shared.del;    argv[1] = key;    incrRefCount(argv[0]);    incrRefCount(argv[1]);    if (server.aof_state != AOF_OFF)        feedAppendOnlyFile(server.delCommand,db->id,argv,2);    replicationFeedSlaves(server.slaves,db->id,argv,2);    decrRefCount(argv[0]);    decrRefCount(argv[1]);}


  • TA的每日心情
    开心
    2016-6-12 11:11
  • 签到天数: 1 天

    [LV.1]初来乍到

    0

    主题

    2

    帖子

    39

    积分

    新手上路

    Rank: 1

    积分
    39
    发表于 2016-6-12 11:14:25 | 显示全部楼层
    很不错啊,找到了一群志同者
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|Redis中国用户组 ( 京ICP备15003959号

    GMT+8, 2018-10-19 06:49 , Processed in 0.186114 second(s), 32 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表