• A
    Scripting: expire keys in scripts only at first access. · b089ba98
    antirez 提交于
    Keys expiring in the middle of the execution of Lua scripts are to
    create inconsistencies in masters and / or AOF files. See the following
    example:
    
        if redis.call("exists",KEYS[1]) == 1
        then
            redis.call("incr","mycounter")
        end
    
        if redis.call("exists",KEYS[1]) == 1
        then
            return redis.call("incr","mycounter")
        end
    
    The script executes two times the same *if key exists then incrementcounter*
    logic. However the two executions will work differently in the master and
    the slaves, provided some unlucky timing happens.
    
    In the master the first time the key may still exist, while the second time
    the key may no longer exist. This will result in the key incremented just one
    time. However as a side effect the master will generate a synthetic
    `DEL` command in the replication channel in order to force the slaves to
    expire the key (given that key expiration is master-driven).
    
    When the same script will run in the slave, the key will no longer be
    there, so the script will not increment the key.
    
    The key idea used to implement the expire-at-first-lookup semantics was
    provided by Marc Gravell.
    b089ba98
db.c 33.1 KB