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表示锁已经被其他进程/线程占用。