• 18.3 redis 的安装


    因为之前我们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写个方法

    buffer就是当前代码 

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

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

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

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

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

    肯定是昨晚itin初始化以后

    主动调用一下

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

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

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

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

    这就引出了redis

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

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

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

    https://blog.csdn.net/jiangdong2007/article/details/80890236

     切换到下载目录

    下载

     解压

    切到目录 make 请使用root权限

     root权限

    启动

    测试成功没

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

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

    https://blog.csdn.net/lovejj1994/article/details/53096268

     另外一种安装方式

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

    tar xvzf redis-stable.tar.gz

    cd redis-stable

     make

    切换到util包然后

    运行一个脚本

    然后一路回车

    我们安装成功

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

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

    这样比较方便 开发和 部署

    开始 停止 重启 

    安装 和 开机启动 告一段落

    我们建议写一个redis client

    读 get

    写set

    等做一个封装

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

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

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

    所以 我们做成单例

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

    redis就没有这种

    我们自己来写

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

     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 不要搞错了

     

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

    get

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

    quit

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

    从而保证单例

    只有一个instance

    从而避免资源消耗太多

    将rediscleng加入到我们socketservice中去

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

     判断一下redis里面有没有

    redis里面没有我们在创建

     

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

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

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

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

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

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

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

  • 相关阅读:
    数据库自增ID归零
    JAVA中的接口和抽象类(转)
    谈如何学习linux (转)
    如何编译安装源码包软件(转)
    每天对着电脑46小时的人必看
    JAVA错误处理大集合
    5月15号项目总结
    让程序在Windows CE系统启动时自动运行
    wince.net4.2问题
    触摸屏定位校准
  • 原文地址:https://www.cnblogs.com/PoeticalJustice/p/9382427.html
Copyright © 2020-2023  润新知