bgsave & save
redis的数据库备份命令, 区别是阻塞:
save会阻塞主线程, 锁定当前内存中的数据库写入磁盘, save期间redis无法处理外部命令, 直到写入完成
bgsave也会阻塞主线程, 只不过阻塞时间短一点, 它的逻辑是先把当前内存数据库复制一份(fork), 复制完了, 原来的数据库就能继续正常工作了, 而把fork出来的拷贝写入磁盘. 网上有说法, 把fork误认成进程的fork, 这是错的.
SETNX
redis可以借助这个命令实现锁, setnx = SET if Not eXists 即如果这个变量不存在就赋值, 已经存在不会赋值. 命令在设置成功时返回 1
, 设置失败时返回 0.
借助这个命令, 可以对某个变量加锁, 其他程序要修改这个变量要取决于setnx的返回结果(EX表示expire秒数, 防止锁忘了释放)
setnx lockid 123 EX 10
Sorted Set & 延时队列
普通消息队列使用 redis的list数据结构就行了
延时队列用 sorted set (又称 zset) 来实现, sorted set 有两个值, 一个是score, 一个是member, 整个set 按照 score来排序
用sorted set来实现延时消息队列: 把消息的时间戳当作score, 消息本身作为 member, 利用 ZRANGEBYSCORE 命令只取延时以后的(比如当前时间5秒前的)消息已达成延时的效果.