因为之前我们server不存东西 

我们 发现 后打开的网页 是接手不到之前的变化,不能更新到最新的变化的。

我们需要做到server给client发最新的代码已达到同步

我们有三种做法同步到最新的代码

1.保存每一一个change events 

(Keep All Change Events)
[event_1,event_2,......event_n]

每一个change events都记录下在一个list里面 确定就是内容太多 繁杂(很多没必要的change 比如添加了一些代码 又删掉了一些代码,又重新写了一些代码,其实我只是要最新代码) 就很长 没必要

2.记录最新代码的快照信息(keep latest Snapshot) 缺点就是 server压力变大(需要维护一个editor内容),不能回滚。

3.记录(Combine Snapshot and change Events(Adopted))

{snapshot_n,[event_n,event_n+1.event_n+2.....]}

最佳 整合 1 2  的优点 做到 就保存1个小时之内的change evets,将一个小时前的做成Snapshotlist

这样既可以同步到最新的代码,又可以回滚,server压力又不大

我们先来完成第一种做法

 

我从client端开始 去service写个方法

 

redis 7安装包下载_数据库

buffer就是当前代码 

restoreBuffer()就是储存代码的方法

我们service  只需向server发出请求信息(要最新代码的list)“restoreBugger”既可

这样server端就知道你请求最新代码

所以,我们去editor去调用咱们 这个service

那么什么时候会调用这个service的这个方法呢?

肯定是昨晚itin初始化以后

主动调用一下

redis 7安装包下载_redis_02

 

 ok 上面就是client端发送请求到最新代码的写法

 

下面写 server端收到这个‘restoreBuffer:’的请求后,如何返回最新的代码给client端?

我们可以将server端的内存中保存的各种change events 直接全部发给client 也可以 一个个events发

取决你如何设计,那么问题来了。如何保存在内存中呢?

这就引出了redis

为什么用redis呢? 因为可以将这些list保存在内容中

那么是不是全部都要保存呢?不是,不如编辑器里一个人都没有了,我们也不知道什么时候你会来,所以呢?我们将代码变化存在redis里面,保存(比如1h?)

 

我们先来安装redis 一种是4.10版 一个是另外一种

redis 7安装包下载_redis 7安装包下载_03

 

 切换到下载目录

redis 7安装包下载_redis_04

下载

redis 7安装包下载_开机启动_05

 

 解压

redis 7安装包下载_redis 7安装包下载_06

切到目录 make 请使用root权限

redis 7安装包下载_数据库_07

 root权限

redis 7安装包下载_数据库_08

启动

redis 7安装包下载_redis_09

 

测试成功没

 

redis 7安装包下载_redis 7安装包下载_10

 

make结束我们还要做一步 可以通过redis命令直接启动 redis 不过不建议 因为每次都要打一次命令 很麻烦

我们将他变成service 可以变成 开机启动

redis 7安装包下载_数据库_11

redis 7安装包下载_redis_12

 

 另外一种安装方式

redis 7安装包下载_开机启动_13

 

wget http://download.redis.io/redis-stable.tar.gz

tar xvzf redis-stable.tar.gz

cd redis-stable

 make

切换到util包然后

redis 7安装包下载_redis_14

运行一个脚本

然后一路回车

redis 7安装包下载_redis 7安装包下载_15

我们安装成功

我们每次都 打命令 redis-cli 来运行 很麻烦

因为 我们每次都要手动打命令 不如把他做成一个service

这样比较方便 开发和 部署

redis 7安装包下载_开机启动_16

开始 停止 重启 

redis 7安装包下载_数据库_17

 

安装 和 开机启动 告一段落

 

 

我们建议写一个redis client

读 get

写set

等做一个封装

主要是 默认提供的比较繁琐

我们做成一个中间件 封装一下 简化操作

因为每次调用redisclent都会产生一个instace

所以 我们做成单例

比如 链接数据库 都有 线程池 规定好线程数 便于维护

redis就没有这种

我们自己来写

我们在oj-server里面建一个folder

redis 7安装包下载_redis_18




redis 7安装包下载_开机启动_19

redis 7安装包下载_数据库_20

1 var redis = require('redis');
 2 var client = redis.createClient();
 3 
 4 function set(key, value, callback) {
 5     client.set(key, value, function(err, res) {
 6         if (err) {
 7             console.log(err);
 8             return;
 9         }
10         callback(res);
11     });
12 }
13 
14 function get(key, callback) {
15     client.get(key, function(err, res) {
16         if (err) {
17             console.log(err);
18             return;
19         }
20         callback(res);
21     });
22 }
23 
24 function expire(key, timeInSeconds) {
25     client.expire(key, timeInSeconds);
26 }
27 
28 function quit() {
29     client.quit();
30 }
31 
32 module.exports = {
33     get: get,
34     set: set,
35     expire: expire,
36     quit: quit,
37     redisPrint: redis.print
38 }


redisClient.js


因为我们nodejs在server端是JavaScript而不是TpyeScript 不要搞错了

 

 

redis 7安装包下载_redis 7安装包下载_21

 

 正因为他每次都会生成一个新client(进行读写操作,有几个读写的function) 所以我们把他写入一个单独文件中

redis 7安装包下载_redis_22

get

redis 7安装包下载_开机启动_23

expire 比较适合我们这个方式 当我们发现editor里面没人 比如 1小时候 我就认为你走了不回来了 我就删掉 这样不占内存

redis 7安装包下载_redis 7安装包下载_24

quit

redis 7安装包下载_redis_25

redis 7安装包下载_数据库_26

这样 让别的文件调用这个文件

从而保证单例

只有一个instance

从而避免资源消耗太多

 

将rediscleng加入到我们socketservice中去

redis 7安装包下载_redis 7安装包下载_27

redis 7安装包下载_开机启动_28

redis 7安装包下载_redis 7安装包下载_29

redis 7安装包下载_redis_30

 

redis 7安装包下载_redis_31

 

好,下面我们来改原来的代码

redis 7安装包下载_开机启动_32

 

 判断一下redis里面有没有

redis里面没有我们在创建

redis 7安装包下载_开机启动_33

 

 

redis 7安装包下载_redis 7安装包下载_34

什么时候要写进数据库呢?当我们发现用户都走了,没必要把他们在维护在redis里面占内存的时候 就可以考虑写入数据库啦

redis 7安装包下载_开机启动_35

 

 我们的‘cahedChangeEvetnts‘’ 就是我们所说的那个list events

他是咋来的呢?我们server 除了转发 还要记录 那么就每次change 记录在这个cahedChangeEvetnts‘’

  我们需要修改 change 事件 将变化 写入这个’‘cahedChangeEvetnts ‘

 

redis 7安装包下载_数据库_36

 

 还原change 比如 client端 发来请求‘estoreBuffer’

我们就在server段,emit每一个change,,然后发给client

redis 7安装包下载_开机启动_37

client端,接收并更新每一个change

redis 7安装包下载_数据库_38