赞
踩
之前已经使用Redis实现了消息队列,感觉还不错。RabbitMQ有些功能感觉怪怪的(以前用过一阵子,放弃了,kafka是更好的选择,但对我来说太重了,不合适),出问题不太好调,感觉还是数据库可靠一点。Redis的队列会有很低的概率出现一些Miss, 不过后续通过服务端的一些补救应该可以解决掉。
总体上Redis的好处就是简单,可靠。除了队列,目前主要考虑使用Redis来沟通各微服务之间的基本数据,做一些缓存计算。
在统一端口分配中,将24008分配给Redis
序号 | 容器名 | 内部端口 | 说明 |
---|---|---|---|
9 | redis_24008 | 24008 | 提供队列和缓存 |
使用之前打包好的redis镜像
registry.cn-hangzhou.aliyuncs.com/YOURREP/redis6:v1
确定一个放数据的目录,在redis.conf
里只配置了一行密码
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
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
关于变量的过期
set(name, value, ex=None, px=None, nx=False, xx=False)
在 Redis 中设置值,默认,不存在则创建,存在则修改。
参数:
ex - 过期时间(秒)
px - 过期时间(毫秒)
nx - 如果设置为True,则只有name不存在时,当前set操作才执行
xx - 如果设置为True,则只有name存在时,当前set操作才执行
# 5秒后过期
r.set('name', 5, ex =5)
一次存入多个值
some_dict = {'k1':'v1', 'k2':'v2'}
r.mset(some_dict)
一次取出多个值
r.mget(list(some_dict.keys()))
['v1', 'v2']
值的递增和递减
r.set('aa',1)
r.incr('aa')
---
2
r.decr('aa')
1
基础数据库就不写文档了
略
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。