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
var redis = require('redis');
var client = redis.createClient(); function set(key, value, callback) {
client.set(key, value, function(err, res) {
if (err) {
console.log(err);
return;
}
callback(res);
});
} function get(key, callback) {
client.get(key, function(err, res) {
if (err) {
console.log(err);
return;
}
callback(res);
});
} function expire(key, timeInSeconds) {
client.expire(key, timeInSeconds);
} function quit() {
client.quit();
} module.exports = {
get: get,
set: set,
expire: expire,
quit: quit,
redisPrint: redis.print
}
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
’
18.3 redis 的安装的更多相关文章
- redis的安装配置
主要讲下redis的安装配置,以及以服务的方式启动redis 1.下载最新版本的redis-3.0.7 到http://redis.io/download中下载最新版的redis-3.0.7 下载后 ...
- Linux下Redis的安装与配置
redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcached类似,但很大程度补偿了 memcached的不足,它支持存储的value类型相对更多,包括stri ...
- Redis、Redis+sentinel安装(Ubuntu 14.04下Redis安装及简单测试)
Ubuntu下Redis安装两种安装方式: 1.apt-get方式 步骤: 以root权限登录,切换到/usr目录下. 接下来输入命令,apt-get install redis-server,如图: ...
- 浅谈Redis及其安装配置
一.Redis的介绍 二.Redis的安装配置 三.Redis的配置文件说明 四.Redis的简单操作 简介: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型. ...
- Redis:安装、配置、操作和简单代码实例(C语言Client端)
Redis:安装.配置.操作和简单代码实例(C语言Client端) - hj19870806的专栏 - 博客频道 - CSDN.NET Redis:安装.配置.操作和简单代码实例(C语言Client端 ...
- Linux下Redis的安装配置
环境: centos7 PHP7 1.切到准备安装的目录 cd /usr/local 2.下载Redis wget http://download.redis.io/redis-stable.tar ...
- Redis 的安装 使用 通知事件
Redis 的安装 使用 介绍: redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string.list.set.zset(sorted ...
- Redis学习笔记之Linux下Redis的安装和部署
0x00 Redis介绍 Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类型相 ...
- linux下redis的安装与部署
一.Redis介绍 Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类型相对更多 ...
随机推荐
- Android Activity传递数据使用getIntent()接收不到,揭秘Intent传递数据与Activity启动模式singleTask的关系。
activity通过intent传递数据的时候,如果activity未启动,那么在这个刚启动的activity里通过getIntent()会获取到这个intent的数据.. 如果要启动的activit ...
- TP5实现邮件发送(PHP 利用QQ邮箱发送邮件「PHPMailer」)
在 PHP 应用开发中,往往需要验证用户邮箱.发送消息通知,而使用 PHP 内置的 mail() 函数,则需要邮件系统的支持. 如果熟悉 IMAP/SMTP 协议,结合 Socket 功能就可以编写邮 ...
- [TJOI2015]弦论(后缀自动机)
/* 一道在树上乱搞的题目 建立出parent树来, 然后就能搞出每个节点往后能扩展出几个串, 至于位置不同算同一个的话就强制让right集合大小为1即可 然后在树上类比权值线段树找第k大26分统计一 ...
- 元组,列表的增删改查, for,range 循环
1. list(增删改查) 列表可以装大量的数据. 不限制数据类型. 表示方式:[] 方括号中的每一项用逗号隔开 列表和字符串一样.也有索引和切片 常用的功能: 1. 增: append() 2. 删 ...
- 使用bootstrap3.0搭建一个具有自定义风格的侧边导航栏
由于工作变动,新的项目组,可能会涉及到更多的类似于后台管理系统这一类的项目,而且开发可能更加偏向于传统型的开发,希望今后能够在新的项目中能够用得上vuejs吧! 接手项目的时候,就是一个后台管理系统, ...
- 28.纯 CSS 绘制一个世界上不存在的彭罗斯三角形
原文地址:https://segmentfault.com/a/1190000014946883 感想:三个平面图形旋转 HTML代码: <!-- penrose: 彭罗斯 --> < ...
- [多线程]wait和notify
线程之间的通信 使用wait/notify方法实现线程间的通信.这两个方法都是Object类的方法,也就是说Java所有的对象都提供这两个方法.1.wait和notify必须配合synchroni ...
- gzip0
但是Apache是专门为PHP所匹配的,其兼容性最好),类似于IIS.下面我们具体来说说Apache里怎么启用gzip压缩: Apache启用gzip 如果要开启gzip的话,一定要打开下面二个模块. ...
- HTTP 416
真是活久见, 竟然遇到了HTTP 416 参照 http://baike.baidu.com/view/1790469.htm , Requested Range Not Satisfiable 如果 ...
- Docker 在 Linux 平台的安装 以及一些常见命令
1,添加,清理 yum 源,查看应用列表 1.1,yum install -y epel-release 1.2,yum clean all 1.3,yum list (可以不运行) 2,安装, 启 ...