注册

详解Redis SET命令:设置一个 key-value 对

Redis SET命令是用于在redis中设置指定键的值。它可以执行以下操作:

1. SET key value [EX seconds] [PX milliseconds] [NX|XX]

设置键key的值为value。如果键不存在,就创建这个键并将值设为value。如果键已存在,它的值就被覆盖。
可选项:

  • EX seconds:键的过期时间(秒),到期后键会被自动删除。
  • PX milliseconds: 键的过期时间(毫秒),到期后键会被自动删除。
  • NX:只有当键不存在时才设置值。
  • XX:只有当键已经存在时才设置值。

例:

> SET mykey "Hello World"
OK
> GET mykey
"Hello World"
> SET mykey "Hello Redis" EX 60
OK
> TTL mykey   # 查看键的过期时间
(integer) 57

在上面的例子中,首先设置键mykey的值为"Hello World",然后将其覆盖为"Hello Redis",并设置了过期时间为60秒,最后用TTL命令查看mykey还有57秒过期。

2. SETNX key value

如果键key不存在,就设置它的值为value,否则什么也不做。
例:

> SETNX mykey "Hello"
(integer) 1
> SETNX mykey "Hello World"
(integer) 0
> GET mykey
"Hello"

在上面的例子中,首先设置mykey的值为"Hello",因为mykey不存在,SETNX返回1。接着再次使用SETNX命令设置mykey的值为"Hello World",但这次返回0,因为mykey已经存在了。

3. SETEX key seconds value

设置键key的值为value,并设置过期时间为seconds秒。和SET命令不同的是,SETEX是一个原子操作,它不需要使用EXPIRE命令单独设置过期时间。
例:

> SETEX mykey 10 "Hello"
OK
> GET mykey
"Hello"
> TTL mykey
(integer) 10

在上面的例子中,设置mykey的值为"Hello",并将其过期时间设置为10秒。

实例1:缓存结果

Redis可以用来做缓存,缓存的结果可以设置过期时间,避免缓存占用过多内存。

import redis

# 连接redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)

def get_data_from_db(key):
    # TODO: 从数据库获取数据
    # ...
    data = ['data1', 'data2', 'data3']
    return data

def get_data(key):
    # 先查找缓存中是否有值
    data = r.get(key)
    if data is None:
        # 缓存中没有,从数据库获取并保存到缓存
        data = get_data_from_db(key)
        r.setex(key, 60, data)  # 缓存60秒
    return data

以上代码中,get_data函数先尝试从缓存中获取数据,如果没有则从数据库中获取并保存到缓存中,过期时间为60秒。

实例2:分布式锁

Redis可以利用它的SETNX命令实现分布式锁,用于控制多个进程/线程对同一共享资源的并发访问。

import redis

# 连接redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)

def acquire_lock(lockname, timeout=10):
    '''
    请求获得锁
    '''
    end = time.time() + timeout
    while time.time() < end:
        if r.setnx(lockname, 1):
            return True
        time.sleep(0.001)
    return False

def release_lock(lockname):
    '''
    释放锁
    '''
    r.delete(lockname)

以上代码中,acquire_lock函数请求获得锁,如果获得成功则返回True,如果超时则返回False。release_lock函数用于释放锁。锁的实现就是利用Redis的setnx命令在key不存在时设置key的值,如果返回1表示成功获得锁,如果返回0表示锁已经被其他进程/线程占用。