网站登录界面图片用什么软件做,深圳网络建设公司,深圳宝安国际会展中心,管理系统英文缓存数据库redis#xff1a;
NoSQL#xff08;Not only SQL#xff09;泛指非关系型的数据库。为了解决大规模数据集合多重数据类的挑战。
NoSQL数据库的四大分类#xff1a;
键值#xff08;Key-Value#xff09;存储数据库列存储数据库文档型数据库图形#xff08;…缓存数据库redis
NoSQLNot only SQL泛指非关系型的数据库。为了解决大规模数据集合多重数据类的挑战。
NoSQL数据库的四大分类
键值Key-Value存储数据库列存储数据库文档型数据库图形Graph数据库
redis是业界主流的key-value nosql数据库之一。redis主要用在linux类系统。
要在 Ubuntu 上安装 Redis打开终端然后输入以下命令
$sudo apt-get update
$sudo apt-get install redis-server
在windows系统下下载压缩包解压缩后就可以直接运行。
解压缩后的Redis-x64-5.0.14.1 在此目录下运行cmd在命令窗口运行命令redis-server redis.windows.conf启动redis服务器 可以看到服务的端口是6379。此启动方法表示临时服务安装成功。使用该指令创建的服务不会再window service列表中出现redis服务名此窗口关闭临时服务会自动退出
后台服务安装启动指令redis-server.exe --service-install redis.windows.conf --loglevel verbose一定要先卸载已经安装的临时或者固定的服务否则会出现错误
卸载服务redis-server --service-uninstall
启动服务指令redis-server.exe --service-start
如果需要停止就执行 redis-server --service-stop // 停止服务
再打开一个cmd窗口运行客户端redis-cli.exe redis-py 的API的使用可以分类为
连接方式连接池操作 String 操作Hash 操作List 操作Set 操作Sort Set 操作管道发布订阅 String操作
使用set 、get 、 keys * 在使用set时显示set语法 set(name, value, exNone, pxNone, nxFalse, xxFalse) 1 2 3 4 5 6 在Redis中设置值默认不存在则创建存在则修改 参数 ex过期时间秒 px过期时间毫秒 nx如果设置为True则只有name不存在时当前set操作才执行 xx如果设置为True则只有name存在时当前set操作才执行 其他一些命令setnx(key,value) 、setex(key,value,time) 、psetex(key,time_ms,value) 、mset(*args,**kwargs) 、get(key) 、 mget(keys,*args)、 getset(key,value)、 getrange(key,start,end)、 setrange(key,offset,value)、setbit(key,offset,value) 、getbit(name,offset)、 bitcount(key,startNone,endNone)、 strlen(key)、 incr(self,key,amount1)、 incrbyfloat(self,key,amount1.0)、decr(self,key,amount1) 、 append(key,value)
setbit/getbit/bitcount这一组命令来记录、统计用户登录信息。
Hash操作
hset (key field value)、hget(key field)、 hmset(key,mapping)、 hmget(key field)、 hkeys(key)、 hgetall(key)、 hlen(key)、 hvals(key)、 hexists(key field)、 hincrby(key field)、 HSCAN key cursor [MATCH pattern] [COUNT count]、 hdel(key *field)、
list操作
lpush、 llen、 lrange、 pushx、 lpushx、 linsert、lset、 lrem、 lpop、 lindex、 lrange、 ltrim、 rpoplpush、 blpop、 brpoplpush
set操作
无序集合
sadd、scard 、 sdiff、 sdiffstore、 sinter、 sinterstore、 sismember、 smove、 spop、 srandmember、 srem、 sunion、 sunionstore、 sscan
有序集合
zadd、 zcard、 zrank、 zrem、 zrenrangebyrank、 zcount、 zincrby、 zrange、 zremrangebyscore、 zscore、 zinterstore、 zscan、
其他操作
delete、exists、 keys 、 expire 、rename、 move、 randomkey、 type、 scan
python连接使用redis
安装模块pip install redis
使用
import redisr redis.Redis(host127.0.0.1,port6379)
r.set(foo,bar)
print(r.get(foo))
将host地址改为网卡的地址
import redisr redis.Redis(host192.168.1.117,port6379)
r.set(foo,bar)
print(r.get(foo))
结果是ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝无法连接。
需要修改redis.windows.conf文件中将bind 127.0.0.1 改为bind 192.168.1.117
如果改为bind 0.0.0.0 则使用192.168.1.117或127.0.0.1都能访问到。
这时是未经验证就直接访问了可以使用密码进行验证。修改redis.windows.conf文件中的配置项# requirepass foobared
可以看到需要密码是注释掉的即不需要密码验证打开验证requirepass abc123
重启后再次运行上面的程序提示redis.exceptions.AuthenticationError: Authentication required.
现在需要验证了
import redisr redis.Redis(host127.0.0.1,port6379,passwordabc123)
r.set(foo,bar)
print(r.get(foo))
此时连接成功。
在客户端使用时也需要密码还用auth password验证。 使用连接池
import redispool redis.ConnectionPool(host192.168.1.117,port6379,passwordabc123)
r redis.Redis(connection_poolpool)
r.set(foo2,bar222)
print(r.get(foo2))
r.set(ccc2,1234)
管道redis-py默认在执行每次请求都会创建连接池申请连接和断开归还连接池一次连接操作如果想要在一次请求中指定多个命令则可以使用pipline实现一次请求指定多个命令并且默认情况下一次pipline 是原子性操作。
import redispool redis.ConnectionPool(host192.168.1.117,port6379,passwordabc123)
r redis.Redis(connection_poolpool)pipe r.pipeline(transactionTrue)
pipe.set(name,aaaaaaaa)
pipe.set(role,bbbbbbbbbbbb)
pipe.execute()
消息队列RabbitMQ
消息队列中间件——是分布式系统中重要的组件主要解决应用耦合异步消息流量削锋等问题实现高性能高可用可伸缩和最终一致性。 使用较多的消息队列有 ActiveMQ安全RabbitMQZeroMQKafka大数据MetaMQRocketMQRabbitMQ ——一个由 Erlang 语言开发的 AMQP 的开源实现。AMQP Advanced Message Queue高级消息队列协议。它是应用层协议的一个开放标准为面向消息的中间件设计基于此协议的客户端与消息中间件可传递消息并不受产品、开发语言等条件的限制。 RabbitMQ 最初起源于金融系统用于在分布式系统中存储转发消息在易用性、扩展性、高可用性等方面表现不俗。具体特点包括 1.可靠性Reliability RabbitMQ 使用一些机制来保证可靠性如持久化、传输确认、发布确认。 2.灵活的路由Flexible Routing 在消息进入队列之前通过 Exchange 来路由消息的。对于典型的路由功能RabbitMQ已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能可以将多个Exchange 绑定在一起也通过插件机制实现自己的 Exchange 。 3.消息集群Clustering 多个 RabbitMQ 服务器可以组成一个集群形成一个逻辑 Broker 4.高可用Highly Available Queues 队列可以在集群中的机器上进行镜像使得在部分节点出问题的情况下队列仍然可用。 5.多种协议Multi-protocol RabbitMQ 支持多种消息队列协议比如 STOMP、MQTT 等等。 6.多语言客户端Many Clients RabbitMQ 几乎支持所有常用语言比如 Java、.NET、Ruby 等等。 7.管理界面Management UI RabbitMQ 提供了一个易用的用户界面使得用户可以监控和管理消息 Broker 的许多方面。 8.跟踪机制Tracing 如果消息异常RabbitMQ 提供了消息跟踪机制使用者可以找出发生了什么。 9.插件机制Plugin System RabbitMQ 提供了许多插件来从多方面进行扩展也可以编写自己的插件。
RabbitMQ的工作原理 Broker接收和分发消息的应用RabbitMQ Server就是Message BrokerConnection publisher / consumer发布者/消费者和 broker之间的TCP连接。个人感觉用producer/consumer——生产者/消费者或publisher/subscriber——发布者/订阅者更合适 Channel如果每一次访问RabbitMQ都建立一个Connection在消息量大的时候建立TCP Connection的开销将是巨大的效率也较低。Channel是在connection 内部建立的逻辑连接如果应用程序支持多线程通常每个thread创建单独的channel进行通讯AMQP method包含了channel id 帮助客户端和message broker识别 channel所以channel 之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建TCP connection的开销Exchangemessage 到达 broker 的第一站根据分发规则匹配查询表中的 routing key分发消息到queue 中去。常用的类型有: direct (point-to-point), topic(publish-subscribe) and fanout (multicast)Routing Key生产者将消息发送到交换机时会携带一个key,来指定路由规则binding Key在绑定Exchange和Queue时会指定一个BindingKey,生产者发送消息携带的RoutingKey会和bindingKey对比若一致就将消息分发至这个队列vHost 虚拟主机每一个RabbitMQ服务器可以开设多个虚拟主机每一个vhost本质上是一个mini版的RabbitMQ服务器拥有自己的 交换机exchange、绑定Binding、队列Queue更重要的是每一个vhost拥有独立的权限机制这样就能安全地使用一个RabbitMQ服务器来服务多个应用程序其中每个vhost服务一个应用程序。
RabbitMQ的安装windows版本
RabbitMQ需要Erlang的支持先安装这个支持包otp_win64_25.3.2.exeOTP代表开放电信平台。 它是一个应用程序操作系统和一组用于构建大规模容错分布式应用程序的库和过程。核心概念是OTP行为可以看作一个用回调函数作为参数的应用程序框架。 安装RabbitMQrabbitmq-server-3.12.1.exe 安装完成后在服务列表中能可见 安装管理界面插件
进入rabbitMQ安装目录的sbin目录点击上方的路径框输入cmd按下回车键 运行命令 rabbitmq-plugins enable rabbitmq_management 打开浏览器输入http://127.0.0.1:15672/登录 输入用户名和密码初始都为guest 至此安装完毕。
Python使用RabbitMQ需要安装pika模块pip install pika RabbitMQ的使用最简单的发布与接收
# Filesender.py 发送消息即生产者
import pika # 链接mq需要pika模块connection pika.BlockingConnection(pika.ConnectionParameters(localhost))
channel connection.channel()# 声明queue
channel.queue_declare(queuehello)# 在RabbitMQ中一个消息不可能被直接发送到queue即队列中它总是需要通过exchange进行转发
channel.basic_publish(exchange,routing_keyhello,body消息体hello world!.encode(utf-8),)
print([x] sent hello word!)
connection.close() # Filerecv.py 消费者即接收者、订阅者
import pikaconnection pika.BlockingConnection(pika.ConnectionParameters(localhost))
channel connection.channel()
channel.queue_declare(queuehello)def callback(ch, method, properties, body):print([x] Received %r % body.decode(utf-8))channel.basic_consume(queuehello,on_message_callbackcallback,auto_ackTrue)print([*] Waiting for message. To exit press CTRLC)
channel.start_consuming()
在消费者端basic_consume方法中设置了auto_ackTrue即自动应答即消费者接受消息后自动应答RabbitMQ服务器即Broker然后在Broker中的队列中将此消息删除否则如果设置为False则会在队列中一直存在如下 显示有2条未应答消息还有2条。
可以设置手动应答
# Filerecv.py 消费者即接收者、订阅者
import pikaconnection pika.BlockingConnection(pika.ConnectionParameters(localhost))
channel connection.channel()
channel.queue_declare(queuehello)def callback(ch, method, properties, body):print([x] Received %r % body.decode(utf-8))# 如果basic_consume中auto_ack为False则这里要手动进行应答channel.basic_ack(delivery_tagmethod.delivery_tag) # 手动应答print(手动应答队列中消息)
channel.basic_consume(queuehello,on_message_callbackcallback,auto_ackFalse)print([*] Waiting for message. To exit press CTRLC)
channel.start_consuming() 自带的用户、密码为guest的只能本机登录可以增加用户
rabbitmqctl add_user 用户名 密码
给指定用户添加管理员权限
rabbitmqctl set_user_tags 用户名 administrator
给用户添加权限
rabbitmqctl set_permissions -p / 用户名 .* .* .*
以上是使用命令进行用户的添加但是在测试时出现问题 查询网上的解决方法也没成功然后从web端增加了用户。
使用增加的用户进行消息操作
生产者
# Filesender.py 发送消息即生产者
import pika # 链接mq需要pika模块
import time
user_info pika.PlainCredentials(tester,test1234)
connection pika.BlockingConnection(pika.ConnectionParameters(192.168.1.117,5672,/,user_info))
channel connection.channel()# 声明queue
# 如果指定的queue不存在则会创建一个queue如果已经存在 则不会做其他动作官方推荐每次使用时都可以加上这句
channel.queue_declare(queuehello)# 在RabbitMQ中一个消息不可能被直接发送到queue即队列中它总是需要通过exchange进行转发
for i in range(0,20):channel.basic_publish(exchange, # 简单模式这里设置为空字符串就可以routing_keyhello, # 指定消息要发送到哪个queuebody消息体{}hello world!.format(i).encode(utf-8), ) # 指定要发送的消息print([x] sent %s hello word! % i)time.sleep(1)
connection.close()#RabbitMQ中所有的消息都要先通过交换机空字符串表示使用默认的交换机
消费者
# Filerecv.py 消费者即接收者、订阅者
import pikauser_info pika.PlainCredentials(tester,test1234)
connection pika.BlockingConnection(pika.ConnectionParameters(192.168.1.117,5672,/,user_info))
channel connection.channel()
channel.queue_declare(queuehello)def callback(ch, method, properties, body):print([x] Received %r % body.decode(utf-8))# 如果basic_consume中auto_ack为False则这里要手动进行应答channel.basic_ack(delivery_tagmethod.delivery_tag) # 手动应答print(手动应答队列中消息)# ch,即channel: 包含channel的一切属性和方法# method: 包含 consumer_tag, delivery_tag, exchange, redelivered, routing_key# properties: basic_publish 通过 properties 传入的参数# body: basic_publish发送的消息channel.basic_consume(queuehello, # 接收指定queue的消息on_message_callbackcallback, # 设置收到消息的回调函数auto_ackFalse) # 指定为True表示消息接收到后自动给消息发送方回复确认已收到消息False表示不自动确认需要在callback中手工确认print([*] Waiting for message. To exit press CTRLC)# 一直处于等待接收消息的状态如果没收到消息就一直处于阻塞状态收到消息就调用上面的回调函数
channel.start_consuming()
运行结果 以上是RabbitMQ简单模式 上面的生产者存在一个问题就是在我们的消费者还没开始消费完队列里的消息如果这时rabbitmq服务挂了那么消息队列里的消息将会全部丢失解决方法是在声明队列时声明队列为可持久化存储队列并且在生产者在将消息插入到消息队列时设置消息持久化存储具体如下
# Filesender.py 发送消息即生产者
import pika # 链接mq需要pika模块
import time
user_info pika.PlainCredentials(tester,test1234)
connection pika.BlockingConnection(pika.ConnectionParameters(192.168.1.117,5672,/,user_info))
channel connection.channel()# 声明queue
# 如果指定的queue不存在则会创建一个queue如果已经存在 则不会做其他动作官方推荐每次使用时都可以加上这句
channel.queue_declare(queuedurable_queue,durableTrue)
#PS这里不同种队列不允许名字相同,这个队列设置了持久化为True即是一个持久化队列# 在RabbitMQ中一个消息不可能被直接发送到queue即队列中它总是需要通过exchange进行转发
for i in range(0,20):channel.basic_publish(exchange, # 简单模式这里设置为空字符串就可以routing_keydurable_queue, # 指定消息要发送到哪个queuebody消息体{}hello world!.format(i).encode(utf-8), # 指定要发送的消息propertiespika.BasicProperties(delivery_mode2))# 设置当前消息持久化存储propertiespika.BasicProperties(delivery_mode2)print([x] sent %s hello word! % i)time.sleep(1)
connection.close()#RabbitMQ中所有的消息都要先通过交换机空字符串表示使用默认的交换机
消费者只需修改队列的声明与生产者一致即可如channel.queue_declare(queuedurable_queue,durableTrue)
同时开启多个消费者会随机读取队列中的消息。
默认安装的RabbitMQ中在运行了上面的程序后在RabbitMQ中connections、channel、exchange、queues信息 文章转载自: http://www.morning.bdwqy.cn.gov.cn.bdwqy.cn http://www.morning.snnwx.cn.gov.cn.snnwx.cn http://www.morning.rbknf.cn.gov.cn.rbknf.cn http://www.morning.tmfhx.cn.gov.cn.tmfhx.cn http://www.morning.clbzy.cn.gov.cn.clbzy.cn http://www.morning.vuref.cn.gov.cn.vuref.cn http://www.morning.rmppf.cn.gov.cn.rmppf.cn http://www.morning.kxnnh.cn.gov.cn.kxnnh.cn http://www.morning.synlt.cn.gov.cn.synlt.cn http://www.morning.nkmw.cn.gov.cn.nkmw.cn http://www.morning.taipinghl.cn.gov.cn.taipinghl.cn http://www.morning.wjhdn.cn.gov.cn.wjhdn.cn http://www.morning.lpgw.cn.gov.cn.lpgw.cn http://www.morning.thrgp.cn.gov.cn.thrgp.cn http://www.morning.nktgj.cn.gov.cn.nktgj.cn http://www.morning.qlwfz.cn.gov.cn.qlwfz.cn http://www.morning.wttzp.cn.gov.cn.wttzp.cn http://www.morning.kxbry.cn.gov.cn.kxbry.cn http://www.morning.rzmsl.cn.gov.cn.rzmsl.cn http://www.morning.zbmcz.cn.gov.cn.zbmcz.cn http://www.morning.klyyd.cn.gov.cn.klyyd.cn http://www.morning.drswd.cn.gov.cn.drswd.cn http://www.morning.gtqws.cn.gov.cn.gtqws.cn http://www.morning.dmlgq.cn.gov.cn.dmlgq.cn http://www.morning.gmjkn.cn.gov.cn.gmjkn.cn http://www.morning.hhxwr.cn.gov.cn.hhxwr.cn http://www.morning.yrhsg.cn.gov.cn.yrhsg.cn http://www.morning.lmxrt.cn.gov.cn.lmxrt.cn http://www.morning.qqklk.cn.gov.cn.qqklk.cn http://www.morning.sgtq.cn.gov.cn.sgtq.cn http://www.morning.mpyry.cn.gov.cn.mpyry.cn http://www.morning.qlpq.cn.gov.cn.qlpq.cn http://www.morning.mrbzq.cn.gov.cn.mrbzq.cn http://www.morning.ffbp.cn.gov.cn.ffbp.cn http://www.morning.sryhp.cn.gov.cn.sryhp.cn http://www.morning.c7630.cn.gov.cn.c7630.cn http://www.morning.coffeedelsol.com.gov.cn.coffeedelsol.com http://www.morning.qdsmile.cn.gov.cn.qdsmile.cn http://www.morning.pwlxy.cn.gov.cn.pwlxy.cn http://www.morning.4q9h.cn.gov.cn.4q9h.cn http://www.morning.yjtnc.cn.gov.cn.yjtnc.cn http://www.morning.qnxtz.cn.gov.cn.qnxtz.cn http://www.morning.swimstaracademy.cn.gov.cn.swimstaracademy.cn http://www.morning.rqxtb.cn.gov.cn.rqxtb.cn http://www.morning.wtxdp.cn.gov.cn.wtxdp.cn http://www.morning.clbzy.cn.gov.cn.clbzy.cn http://www.morning.ygbq.cn.gov.cn.ygbq.cn http://www.morning.kqbjy.cn.gov.cn.kqbjy.cn http://www.morning.hnrdtz.com.gov.cn.hnrdtz.com http://www.morning.sbwr.cn.gov.cn.sbwr.cn http://www.morning.ykmg.cn.gov.cn.ykmg.cn http://www.morning.qxkcx.cn.gov.cn.qxkcx.cn http://www.morning.rdnjc.cn.gov.cn.rdnjc.cn http://www.morning.ahlart.com.gov.cn.ahlart.com http://www.morning.dtpqw.cn.gov.cn.dtpqw.cn http://www.morning.xjqrn.cn.gov.cn.xjqrn.cn http://www.morning.jjmrx.cn.gov.cn.jjmrx.cn http://www.morning.zlwg.cn.gov.cn.zlwg.cn http://www.morning.bdgb.cn.gov.cn.bdgb.cn http://www.morning.qjghx.cn.gov.cn.qjghx.cn http://www.morning.qsbcg.cn.gov.cn.qsbcg.cn http://www.morning.ggnfy.cn.gov.cn.ggnfy.cn http://www.morning.jgzmr.cn.gov.cn.jgzmr.cn http://www.morning.rbgwj.cn.gov.cn.rbgwj.cn http://www.morning.mwrxz.cn.gov.cn.mwrxz.cn http://www.morning.lflsq.cn.gov.cn.lflsq.cn http://www.morning.lczxm.cn.gov.cn.lczxm.cn http://www.morning.lsfrc.cn.gov.cn.lsfrc.cn http://www.morning.ltqtp.cn.gov.cn.ltqtp.cn http://www.morning.pjxw.cn.gov.cn.pjxw.cn http://www.morning.hxgly.cn.gov.cn.hxgly.cn http://www.morning.rsjf.cn.gov.cn.rsjf.cn http://www.morning.pzss.cn.gov.cn.pzss.cn http://www.morning.dodoking.cn.gov.cn.dodoking.cn http://www.morning.qhtlq.cn.gov.cn.qhtlq.cn http://www.morning.bdypl.cn.gov.cn.bdypl.cn http://www.morning.wnwjf.cn.gov.cn.wnwjf.cn http://www.morning.kdjtt.cn.gov.cn.kdjtt.cn http://www.morning.bsrp.cn.gov.cn.bsrp.cn http://www.morning.dwncg.cn.gov.cn.dwncg.cn