消息队列:
消息队列是在消息的传输过程中保存消息的容器,Python中multiprocessing的Queue和Pipe都可以实现消息队列的功能,基于生产这消费者模型,实现进程之间的通信。还有一些其他主流的消息队列工具,如:RabbitQM,ZeroMQ,kafla。
Redis:
Redis最为常用的数据类型主要有以下五种:String,Hash,List,Set,Sorted set。目前最主要的是用String这种格式,就用普通的key/value存储。
String类型如果处理把信息封装成一个对象以序列化和反序列化的方式存储,增加了序列化/反序列化的开销;value可以用HashMap存省去了序列化的开销(其中Map的key是成员的属性名)。
一些内存优化手段:
1、不要开启Redis的VM选项,作为内存数据的一种数据在内存与磁盘换入换出的一个持久化策略,但其内存管理成本非常高,尽量关闭VM功能,检查redis.conf文件中vm-enabled为no。
2、设置redis.conf中的maxmemory选项,该选项告诉Redis当使用了多少物理内存就拒绝后续的写入请求,该参数很好的保护redis不会因为使用了过多的物理内存而导致swap。
3、redis hash是value内部的一个HashMap,如果Map的成员数比较少,则会采用类似一维线性的紧凑格式来存储该Map,省去了大量指针的内存开销。
redis的持久化机制:
定时快照方式(snapshot):Redis内部定时检查进行存储操作。
基于语句追加方式(aof):发生改变存入log中。
Redis物理内存使用超过内存容量的3/5就比较危险。
Socket:
socket称为嵌套字,用于描述IP地址和端口,是计算机之间进行通信的一种约定或者方式。通过socket约定,一台计算机可以接受其他计算机的数据,也可以向其他计算机发数据。
socket的典型应用就是Web服务器和浏览器;浏览器获取用户输入的URL,向服务器发起请求;服务器分析完后放回给客户端。
connect() 函数向 server 发起请求;
bind() 函数将套接字与特定的IP地址和端口绑定起来;
listen() 函数可以让套接字进入被动监听状态;
长连接和短连接:前者是整个通讯过程,客户端和服务器只用一个socket连接,长期保持socket连接;后者是每次请求都新建一个socket,处理完请求就关闭socket。
协程(gevent):
线程之间上下文切换成本相对协程来说比较高,尤其是开启线程较多时,协程的切换成本相对来说较低;
同样的线程的切换更多的是靠操作系统,而协程是靠用户来切换。
gevent.spwan本身可以实现异步执行。