redis 队列应用
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"
- 原文作者:Linux运维菜
- 原文链接:https://www.opcai.top/post/2020/2020-03/redis_queue/
- 版权声明:本作品采用进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。