# GETSET Atomically sets `key` to `value` and returns the old value stored at `key`. Returns an error when `key` exists but does not hold a string value. Any previous time to live associated with the key is discarded on successful [`SET`](https://redis.io/docs/latest/commands/set) operation. ## Design pattern `GETSET` can be used together with [`INCR`](https://redis.io/docs/latest/commands/incr) for counting with atomic reset. For example: a process may call [`INCR`](https://redis.io/docs/latest/commands/incr) against the key `mycounter` every time some event occurs, but from time to time we need to get the value of the counter and reset it to zero atomically. This can be done using `GETSET mycounter "0"`: INCR mycounter GETSET mycounter "0" GET mycounter ## Examples SET mykey "Hello" GETSET mykey "World" GET mykey ## Return information {{< multitabs id="getset-return-info" tab1="RESP2" tab2="RESP3" >}} One of the following: * [Bulk string reply](../../develop/reference/protocol-spec#bulk-strings): the old value stored at the key. * [Nil reply](../../develop/reference/protocol-spec#bulk-strings): if the key does not exist. -tab-sep- One of the following: * [Bulk string reply](../../develop/reference/protocol-spec#bulk-strings): the old value stored at the key. * [Null reply](../../develop/reference/protocol-spec#nulls): if the key does not exist.