自己动手做聊天工具(基于 `Redis` 开发)
聊天工具`CCT`使用实例Redis 简介及配置简介安装Redis配置server客户端连结服务器Redis 基本操作常用操作示例Redis-Python 数据库接口`python`代码连服务器查,写,读数据库聊天工具设计与开发思想整个聊天工具的设计图建立消息队列定义好消息结构体如何查找和删除消息代码编写心得 python2 vs python3 细微差别signal in python3对消息对象的序列化与反序列化如果消息队列中没有消息了?`CCT`其它思考及改进完整代码聊天工具`CCT`使用实例
本最终会一步步做成一个基本可用的聊天工具。我为它取了一个简洁的名字:
CCT- ommand line hat ool
实际使用截图如下:
enter image description here
本力求浅显易懂,学完本, 相信你也能自己做一个聊天工具了~:).
Redis 简介及配置
简介
起源于一个的实时web log分析器 wiki.
所以一诞生就带有性。
Redis 把一切数据库的内容都放在内存中。(注:现在也支持配置项,可以将数据写入磁盘)
学过计算机体系结构的同学都知道,现代基于冯.诺依曼体系的计算机,基本的数据处理一般先从磁盘等非易失介质加载到内存,再从内存加载到CPU进行处理。
磁盘加载速度一般比内存加载至少慢倍(即使是硬盘)。
的数据全部放在内存,因而能极大的提高速度!
还有其它一些优点。
是一种 的非关系型数据库,意味着你可以往里面存入各种不同的数据结构,如等。这也给编程带来极大的自由。
配置简单, 几乎是傻瓜式地拿来即用。
服务器可以一行命令配置。
客户端自带。 可以交互式查看数据库中存储的内容。
由于发展的比较早,现在也有专门的组织维护,易用性也做得非常不错。客户端接口包含各种语言的接口等;
今天也有很多国内大公司用做缓存数据库,如去哪儿网,蚂蚁金服,新浪微博等。
这篇选中做聊天工具的消息队列缓存,也是因为它把数据放内存,做消息的查询和更改会非常快,接口也丰富,不用重新造太多太细节的技术“轮子”。
讲了这么多的优点,吊起了无数胃口。所谓“百闻不如一见”, 下面,请同学们跟我一起,直接玩。
注: 以下代码实践环境均为ubuntu 16.04
安装Redis
这会安装一个 和一个
配置server
安装好后,可以找到和编辑配置文件。
我一般更改如下重要参数:
设置完成后,重启一下 , 方法是
启动完成,如果没有问题我们可以进入下一步
客户端连结服务器
连服务器的命令如下:
如果是在同一台机器上默认, 我们可以简单用下面的命令:
客户端连进去服务器后, 会进入一个的交互界面。
在这里可以操作服务器上的数据库, 如下:
下面的基本操作都是基于这个界面的。
Redis 基本操作
常用操作示例
建一个``的`strings`键值对
示例
查看所有的数据库元素
示例
新建一个list
示例
查看一个list
示例
左边移出list的一个元素
示例
此时再查看list, 发现只有两个元素 了, 已经被移出了。
还有很多复杂的操作,更多可以参考:Redis Command Line
Redis-Python 数据库接口
上面说的,都是如何通过在中交互式去操作数据库,但是我们想要通过程序去操作。
这个程序接口就是数据库接口。我们可以用或者等等程序。
此中,我们选用接口
Redis-Python项目参考
数据安装方法也很简单:
注意我们这里是用. 因为我们要用的数据库接口。
安装完成以后,我们可以验证一下
如果输出正确输出, 则表明redis模块安装OK。
`python`代码连服务器
正确的话程序将返回一个 的实例对象 。
查,写,读数据库
聊天工具设计与开发思想
整个聊天工具的设计图
enter image description here
箭头表示信息传送方向
“1”, “4” 箭头是存入消息队列,对应"";
“2”, “3” 是写入消息到队列"";
建立消息队列
对每一个人都需要建立一个消息队列,队列名字是如
每个消息是一个。按照到达的时间顺序,从左到右依次排布。
如给Bob的消息队列:
发送时间早于 , 依此类推。
定义好消息结构体
为了让消息内容能够包含必要的信息,我们定义了如下的消息结构:
一条消息,我们会包含时间信息,来源,目的地,消息体。这样,我们就可以解释消息的头信息及内容。
如何查找和删除消息
我们只需要左边移出的消息队列,就可以查找是不是收到了新消息。
运行查找之后,如果有消息,则将消息转发给, 否则如果为空,我们就不转发。
代码编写心得
python2 vs python3 细微差别
global 变量
中 简单变量可读写,但到了中,简单变量能读不能写。所以在程序中我用了一个数组. 算是一个小
input vs raw_input
中输入是, 而到了中变成了
signal in python3
可以在中断函数中改变一个全局变量。在这里,我们用它设置了进入用户输入的标志状态。
对消息对象的序列化与反序列化
为什么我们要对消息进行序列化与反序列化?
因为消息中包含了对象(时间),所以必须对消息进行序列化才能存入. 序列化可以用模块
如果消息队列中没有消息了?
在编程接口中,当为空时, 会返回. 我们只需要对返回值进行判断,就知道是不是有新消息。
`CCT`其它思考及改进
写消息的互斥与同步
如何评估此聊天工具的效率
加入注册功能,加入密码用于验证身份
完整代码
请查看项目的 CCT - github page
为了防止后期代码更改,导致脱节,这里也附一份版代码
代码命名相对规范,读完,你肯定豁然开朗
心动不如行动, 赶紧自己可以写一个简单的聊天工具压压惊吧!
领取专属 10元无门槛券
私享最新 技术干货