上一篇:LNMP环境部署(非编译安装)(2017-08-05 17:54:21)

redis实践系列1——富文本编辑文章实时更新

2017年10月31日 23:27

一个新名词,没投入身心的去了解时,总以为会有多复杂多困难。redis对于之前的我来说,就是如此感觉。

最近在找工作,才决定静下心来好好学习它。

我看的这个redis傻瓜教程(http://www.runoob.com/redis/redis-tutorial.html),上手还蛮快的。


为了更好的体验redis的用户,我将知识融入到现在维护的博客里。


本文利用redis解决的问题:

富文本编辑器编辑文章时,将文章内容存入redis缓存,避免因为未保存而导致文章内容丢失。


问题分解:

1.编辑器正出于编辑状态时,内容变化实时存入redis
2.redis设一个定时器,计时结束,就将编辑器内容写入数据库。

3.编辑器处于停止编辑状态时,使用定时计划任务,将redis里文章内容更新到数据库。


代码实现:

问题1.编辑器正出于编辑状态时,内容变化实时存入redis:

前端代码:

 onChange: function(contents, editable) {         //将文章内容保存到input里,保存文章form表单时用到 $("input[name='news_text']").val(contents); var news_id = $("input[name='news_id']").val();         //通过ajax实现将文章最新内容存入redis $.ajax({ data: {news_id:news_id, content:contents}, type: "POST", url: "" }); }, 

以上onChange是summernote富文本编辑器js插件自带的函数,就是编辑器有内容变化时调用。


问题2.redis设一个定时器,计时结束,就将编辑器内容写入数据库。

 /** * [syn_update 编辑文章,实时同步,避免编辑内容意外丢失] * @return [type] [description] */ public function syn_update(){ $news_id = $_POST['news_id']; $content = $_POST['content'];                //这个是redis封装类,封装类不同,下面代码中调用的方法可能不同,但不影响逻辑 $redis = new CacheRedis(); //10分钟更新数据库一次 $n_timer = $redis->get("news:".$news_id, 'TIMER'); //每篇文章对应一个更新定时器,所以key值里要带上文章id if(empty($n_timer)){ //初始或定时结束,写入数据库 $model_news = Model('news'); $model_news->updateNewsInfo($news_id, array('content' => $content)); $redis->set("news_content:".$news_id, $content, "NEWS"); 
//第一次执行此步骤或定时器变量已失效,再重新激活定时器变量 $redis->set("news:".$news_id, $news_id, 'TIMER', 600); }else{ //定时器变量没过期,就继续将文章内容存入redis里 $redis->set("news_content:".$news_id, $content, "NEWS"); } }

在服务端,可以启动redis客户端来查询redis变量是否生效,以及定时器变量的有效期情况。

无非就是执行如下命令:

keys * (查看redis里所有key值) ttl   key_name (查看某个key多久会过期) get key_name (查看某个key的值)



3.编辑器处于停止编辑状态时,使用定时计划任务,将redis里文章内容更新到数据库。

crontab -e 

执行上面命令后,将定时脚本执行路径粘贴进去:

*/10 * * * * curl -s http://www.zhai14.com/index.php?c=cron\&m=write_news_to_db

前面五个星号,代表“分时日月周“,不清楚的自行去百度了解下哈。

之前用了好多次总记不住顺序,现在按“粉丝日月周”来记,总算是把它给记住了。

记忆方法:粉丝日月周


上面命令代表每10分钟执行一次后面的链接。

注意:链接后面连接多个参数是,要转义一下&这个符号,否则执行链接将只能读取到第一个参数的值


定时脚本代码:

 /** * [write_to_db_news 将redis里文章内容保存进数据库] * @return [type] [description] */ public function write_news_to_db(){     $model_news = Model('news');     $redis = new CacheRedis();             //读取所有redis里有关文章内容的key值(可能存在同时编辑多个文章的情况)     $arr_content = $redis->keys("news_content", "NEWS");     if(!empty($arr_content)){ foreach( $arr_content as $val ){ //如果redis里有内容,就写进db $news_id_arr = explode(":", $val); $news_id = empty($news_id_arr[1]) ? 0:$news_id_arr[1]; if( !empty($news_id) ){ $redis_val = $redis->get('news_content:'.$news_id, "NEWS");                                 //如果对应文章的redis变量内容不为空,就将其写入数据库 if(!empty($redis_val)){ $model_news->updateNewsInfo($news_id, array('content'=>$redis_val)); } } }     }            }


问题1也可以采用js里setInterval来解决,感觉setInterval可以控制多少秒调用一次ajax,可以大大减少redis访问次数,日后再继续优化一下。

  • 2017年10月31日 22:25文章创建
  • 2017年10月31日 23:27文章发布
上一篇:LNMP环境部署(非编译安装)(2017-08-05 17:54:21)
我要评论
«-必填,限2-20个字符,中文/字母/字母数字组合
«-评论后,邮箱会收到激活链接,未激活邮箱的留言,将无法显示
评论列表
暂无评论,期待你的评论哦!
回到顶部