redis 队列

Redis 不仅可作为缓存服务器,还可用作消息队列。它的列表类型天生支持用作消息队列。

由于 Redis 的列表是使用双向链表实现的,保存了头尾节点,所以在列表头尾两边插取元素都是非常快的。

安装

自动下载安装


redis_version="5.0.7"

install_path="/opt/redis"

cd $HOME

wget -c -t 0 -T 12000 https://mirrors.huaweicloud.com/redis/redis-${redis_version}.tar.gz

tar zxvf redis-${redis_version}.tar.gz

cd redis-${redis_version}

make

make PREFIX=${install_path} install

配置

直接使用脚本配置


port=6379
redis_server="/opt/redis/bin/redis-server"
data_dir="/data/redis"
config_dir="/opt/redis/conf"

# create random password
random_password=""
arr=(a b c d e f g h i g k l m n o p q r s t u v w x y z
    A B C D E F G H I G K L M N O P Q R S T U V W X Y Z
    ! @ 0 1 2 3 4 5 6 7 8 9)
for ((i = 0; i < 16; i++)); do
    random_password=${random_password}${arr[$RANDOM % ${#arr[@]}]}
done

mkdir -p ${config_dir}
mkdir -p ${data_dir}

cat >${config_dir}/${port}.conf <<EOF
bind 0.0.0.0
protected-mode yes
port ${port}
daemonize yes
pidfile ${data_dir}/redis_${port}.pid
loglevel notice
logfile "${config_dir}/${port}.log"
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
dbfilename dump_${port}.rdb
dir ${data_dir}
appendonly yes
appendfilename "appendonly_${port}.aof"
appendfsync everysec
requirepass "${random_password}"
EOF
echo -n "Start service command : "
echo "${redis_server} ${config_dir}/${port}.conf"

启动服务

/opt/redis/bin/redis-server /opt/redis/conf/6379.conf

命令测试

/opt/redis/bin/redis-cli -p 6379
  • LPUSH(头部插入)和 RPOP(尾部弹出)
127.0.0.1:6379> LPUSH queue 1 2 3 4 5 6 7 8 9 0
(integer) 10
127.0.0.1:6379> RPOP queue
"1"
127.0.0.1:6379> RPOP queue
"2"
127.0.0.1:6379> RPOP queue
"3"
127.0.0.1:6379> RPOP queue
"4"
127.0.0.1:6379> RPOP queue
"5"
127.0.0.1:6379> RPOP queue
"6"
127.0.0.1:6379> RPOP queue
"7"
127.0.0.1:6379> RPOP queue
"8"
127.0.0.1:6379> RPOP queue
"9"
127.0.0.1:6379> RPOP queue
"0"
127.0.0.1:6379> RPOP queue
(nil)
  • RPUSH(尾部插入)和 LPOP(头部弹出)
127.0.0.1:6379> RPUSH queue 1 2 3 4 5 6 7 8 9 0
(integer) 10
127.0.0.1:6379> LPOP  queue
"1"
127.0.0.1:6379> LPOP  queue
"2"
127.0.0.1:6379> LPOP  queue
"3"
127.0.0.1:6379> LPOP  queue
"4"
127.0.0.1:6379> LPOP  queue
"5"
127.0.0.1:6379> LPOP  queue
"6"
127.0.0.1:6379> LPOP  queue
"7"
127.0.0.1:6379> LPOP  queue
"8"
127.0.0.1:6379> LPOP  queue
"9"
127.0.0.1:6379> LPOP  queue
"0"
127.0.0.1:6379> LPOP  queue
(nil)
  • 相对可靠的队列 RPOPLPUSH
一般情况下,简单的队列就够用了,但是有一些需要可靠性比较强的消费队列,就可以使用 RPOPLPUSH,可以防止任务被取出,还没有处理完就出现宕机等情况,导致队列数据丢失。

RPOPLPUSH 后面跟两个参数,一个是弹出的list,一个是要插入的list,开始执行的时候,存入到目标队列,任务执行完再从目标队列删除。
127.0.0.1:6379> LPUSH queue 1 2 3 4 5 6 7 8 9 0
(integer) 10
127.0.0.1:6379> RPOPLPUSH queue doing
"1"
127.0.0.1:6379> RPOPLPUSH queue doing
"2"
127.0.0.1:6379> RPOPLPUSH queue doing
"3"
127.0.0.1:6379> LRANGE doing 0 100
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> LRANGE queue 0 100
1) "0"
2) "9"
3) "8"
4) "7"
5) "6"
6) "5"
7) "4"
127.0.0.1:6379> LREM doing 1 1
(integer) 1
127.0.0.1:6379> LRANGE doing 0 100
1) "3"
2) "2"