当前位置:   article > 正文

Python 全栈系列139 Redis 一键部署_pyspiderredis部署方法

pyspiderredis部署方法

说明

之前已经使用Redis实现了消息队列,感觉还不错。RabbitMQ有些功能感觉怪怪的(以前用过一阵子,放弃了,kafka是更好的选择,但对我来说太重了,不合适),出问题不太好调,感觉还是数据库可靠一点。Redis的队列会有很低的概率出现一些Miss, 不过后续通过服务端的一些补救应该可以解决掉。

总体上Redis的好处就是简单,可靠。除了队列,目前主要考虑使用Redis来沟通各微服务之间的基本数据,做一些缓存计算。

  • 1 共享即时状态。类似timeout重试次数,访问页面的次数等。
  • 2 用于ttl控制。例如在鉴权过程中会发放带ttl的令牌,redis自带一些机制会很方便。
  • 3 用于监控服务。每个服务会自带一些连通性检查和流量检查,结果会记在redis中。如果监控服务发现问题会邮件或短信通知管理者。

内容

1 分配端口

在统一端口分配中,将24008分配给Redis

序号容器名内部端口说明
9redis_2400824008提供队列和缓存

2 镜像准备

使用之前打包好的redis镜像

registry.cn-hangzhou.aliyuncs.com/YOURREP/redis6:v1
  • 1

3 项目文件

确定一个放数据的目录,在redis.conf里只配置了一行密码
在这里插入图片描述

4 一键部署脚本

p24008_setup_redis.sh

#!/bin/bash

# 0 CMD >>>>>>>>>>>>>>>>>>>>>>>>>

# 可以到/tmp下执行:
# 1 wget -N http://YOURS/download/p24008_setup_redis.sh
# 2 bash p24008_setup_redis.sh

# 1 Ensure One Implement Folder >>>>>>>>>>>>>>>>>>>>>>>>>

if [ ! -d "/opt/one_implements" ]; then
 echo "一键部署文件夹不存在,创建..."
 mkdir -p /opt/one_implements
 else
 echo "一键部署文件夹存在"
fi

cd /opt/one_implements



# 2 Params >>>>>>>>>>>>>>>>>>>>>>>>>

# 000 - 实时的实体解析

# 000
con_name000="p24008_redis"
port000=24008

current_folder=$(pwd)
image_name="registry.cn-hangzhou.aliyuncs.com/YOURS/redis6:v1"
project_folder_name="Redis_24008"
slot=27404146
# 项目文件夹web服务器
web_server_host="IP:PORT"

# 3 镜像判断  >>>>>>>>>>>>>>>>>>>>>>>>>
# 000
if [ ! -f "./redis_img.tar" ];then
 echo "【1-Image000】$con_name000文件不存在,从仓库拉取"
 docker pull $image_name
 else
 echo "【1-Image000】$con_name000文件存在,执行导入"
 docker load --input redis_img.tar
fi

# 4 文件判断  >>>>>>>>>>>>>>>>>>>>>>>>>
# 000
if [ ! -d "./${project_folder_name}/" ]; then
 echo "【2-Folder000】$con_name000依赖文件夹不存在,从web服务器获取"
 wget -N http://${web_server_host}/downup/download/${project_folder_name}@${slot}.zip && unzip ${project_folder_name}@${slot}.zip
 else
 echo "【2-Folder000】$con_name000依赖文件夹已存在,忽略"
fi


# 切换路径到文件夹


# 5 容器判断  >>>>>>>>>>>>>>>>>>>>>>>>>
# 当前的容器名称列表
docker ps  | awk   'NR == 1  {next} {print $NF}' > current_containers.txt 
docker ps -a | awk   'NR == 1  {next} {print $NF}' > all_containers.txt 

cc=`cat current_containers.txt`
ac=`cat all_containers.txt`

if [[ "${cc[@]}" =~ $con_name000 ]]; then 
 ctag000=1
 else
 ctag000=0
fi 

if [[ "${ac[@]}" =~ $con_name000 ]]; then 
 atag000=1
 else
 atag000=0
fi

# 4 容器启动  >>>>>>>>>>>>>>>>>>>>>>>>>

# 000
if [ $ctag000 == 1 ];then
 echo "【3-CMD000】$con_name000 已经处于运行态"
fi

if [ $ctag000 == 0 -a $atag000 == 1 ];then
 echo "【3-CMD000】$con_name000 处于休眠态,重新启动"
 docker start ${con_name000}
fi

if [ $ctag000 == 0 -a $atag000 == 0 ];then
 echo "【3-CMD000】$con_name000 启动..."
 echo "当前容器名" ${con_name000}
 echo "当前部署文件夹" ${current_folder}
 echo "当前项目文件夹" ${project_folder_name}

 # 执行启动程序
 docker run -d --name=${con_name000}\
               --restart=always\
               -v /etc/localtime:/etc/localtime  \
               -v /etc/timezone:/etc/timezone\
               -e "LANG=C.UTF-8"\
               -v ${current_folder}/${project_folder_name}/data:/data\
               -v ${current_folder}/${project_folder_name}/redis.conf:/etc/redis/redis.conf\
               -p ${port000}:6379\
               ${image_name}\
               redis-server /etc/redis/redis.conf \
               --appendonly yes
fi

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111

5 测试

import redis


local_ip = 'YOURS'
# 这个连接只能维持一小会,可能要用with方式
r = redis.Redis(host=local_ip, port=24008, decode_responses=True,password='YOURS')  

# 连接池方式
pool = redis.ConnectionPool(host=local_ip, port=24008, decode_responses=True,password='YOURS')
r = redis.Redis(connection_pool=pool)

# 1 存一个变量
r.set('name','aabb')
r.get('name')
---
aabb
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

关于变量的过期

	set(name, value, ex=None, px=None, nx=False, xx=False)
	
	在 Redis 中设置值,默认,不存在则创建,存在则修改。
	
	参数:
	
	ex - 过期时间(秒)
	px - 过期时间(毫秒)
	nx - 如果设置为True,则只有name不存在时,当前set操作才执行
	xx - 如果设置为True,则只有name存在时,当前set操作才执行
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
# 5秒后过期
r.set('name', 5, ex =5)
  • 1
  • 2

一次存入多个值

some_dict = {'k1':'v1', 'k2':'v2'}
r.mset(some_dict)
  • 1
  • 2

一次取出多个值

r.mget(list(some_dict.keys()))
['v1', 'v2']
  • 1
  • 2

值的递增和递减

r.set('aa',1)
r.incr('aa')
---
2

r.decr('aa')
1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

6 文档

基础数据库就不写文档了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/407843
推荐阅读
相关标签
  

闽ICP备14008679号