[Node.js] Level 7. Persisting Data
Simple Redis Commands
Let's start practicing using the redis key-value store from our node application.
Require the redis
module and assign it to a variable called redis
.
var redis = require('redis');
Create a redis
client and assign it to a variable called client
.
var client = redis.createClient()
On the client
, set the name
property to your name.
client.set('name', 'Answer');
var redis = require('redis'),
client = redis.createClient(); client.set('name', 'Answer');
Get A Key
We have already stored a value in the question key. Use the redis client to issue a get
command to redis to retrieve and then log the value.
Use the redis client to issue a get
command using the 'question'
key to retrieve a value. Remember, the get
function takes a callback which expects two arguments, error
and data
.
Log the value retrieved with console.log
.
var redis = require('redis');
var client = redis.createClient(); client.get('question', function(err, data){
console.log(data);
});
Working With Lists 1
As we saw in the video, redis can do more than just simple key-value pairs. We are going to be using redis' LISTS later to add persistence to our live-moderation app, so let's practice using them now
Using the redis client's lpush
command, insert question1
into thequestions
list. Then, console.log
the result you receive. Remember, thelpush
function takes a callback as its last argument, which expects anderror
and value
to be passed as arguments.
client.lpush('questions', question1, function(err, data){
console.log(data);
});
Using the redis client's lpush
command, insert question2
into the questions list. Then console.log
the result you receive.
var redis = require('redis');
var client = redis.createClient(); var question1 = "Where is the dog?";
var question2 = "Where is the cat?"; client.lpush('questions', question1, function(err, data){
console.log(data);
}); client.lpush('questions', question2, function(err, data){
console.log(data);
});
Working With Lists 2
Now that we have seeded the questions
list, use the lrange()
command to return all of the items and log them.
Use the lrange()
command to return all of the items from the questions
key.
Now that we have called lrange()
, use console.log
to log the result from redis.
var redis = require('redis');
var client = redis.createClient(); client.lrange('questions', 0, -1, function(err, data){
console.log(data);
});
Persisting Questions
Let's go back to our live-moderation app and add some persistence, first to the questions people ask.
Use the lpush
command to add new questions to the list namedquestions
. Do this inside the listener for the 'question'
event.
redisClient.lpush('questions', question);
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var socket = require('socket.io');
var io = socket.listen(server); var redis = require('redis');
var redisClient = redis.createClient(); io.sockets.on('connection', function(client) {
client.on('answer', function(question, answer) {
client.broadcast.emit('answer', question, answer);
}); client.on('question', function(question) {
if(!client.question_asked) {
client.question_asked = true;
client.broadcast.emit('question', question);
// add the question to the list here
redisClient.lpush('questions', question);
}
});
});
Emitting Stored Questions
Now that we have questions stored in redis, let's emit them whenever a new client connects to the server through socket.io.
Use the lrange
command to retrieve a list of questions that represent thequestions
list within redis.
Inside of the lrange
callback, use a forEach
loop to iterate through thequestions
and emit()
each question
to the client. Remember, don't usebroadcast.emit
because we only want to send the questions to the client that is connecting to the server.
redisClient.lrange('questions', 0, -1, function(err, questions){
questions.forEach(function(question){
client.emit("question", question);
});
});
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io').listen(server); var redis = require('redis');
var redisClient = redis.createClient(); io.sockets.on('connection', function(client) {
redisClient.lrange('questions', 0, -1, function(err, questions){
questions.forEach(function(question){
client.emit("question", question);
});
});
client.on('answer', function(question, answer) {
client.broadcast.emit('answer', question, answer);
}); client.on('question', function(question) {
if(!client.question_asked) {
client.question_asked = true;
client.broadcast.emit('question', question);
redisClient.lpush("questions", question);
}
});
});
Limiting Questions Stored
Great work! One last thing though, since every time a new question comes in we store it in the questions list, we might run into a problem where there are just too many questions stored in that list.
Add a callback to lpush
that will be used to limit the size of the list down to a max of 20.
Use the ltrim
command to limit the size of the list stored within redis
to a maximum size of 20.
redisClient.lpush("questions", question, function(){
redisClient.ltrim("questions", 0, 19);
});
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io').listen(server); var redis = require('redis');
var redisClient = redis.createClient(); io.sockets.on('connection', function(client) { redisClient.lrange('questions', 0, -1, function(err, messages){
messages.forEach(function(m){
client.emit('question', m);
});
}); client.on('answer', function(question, answer) {
client.broadcast.emit('answer', question, answer);
}); client.on('question', function(question) {
if(!client.question_asked) {
client.question_asked = true;
client.broadcast.emit('question', question);
redisClient.lpush("questions", question, function(){
redisClient.ltrim('questions', 0, 19);
});
}
});
});
[Node.js] Level 7. Persisting Data的更多相关文章
- [Node.js] Provide req.locals data though middleware
We can create Template Helpers, which can contains some common reuseable data and libs. /* This is a ...
- [Node.js] Level 6. Socket.io
6.2 Setting Up socket.io Server-Side So far we've created an Express server. Now we want to start bu ...
- [Node.js] Level 3 new. Steam
File Read Stream Lets use the fs module to read a file and log its contents to the console. Use the ...
- [Node.js] Level 5. Express
Express Routes Let's create an express route that accepts GET requests on'/tweets' and responds by s ...
- [Node.js] Level 2 new. Event
Chat Emitter We're going to create a custom chat EventEmitter. Create a new EventEmitter object and ...
- 了不起的Node.js读书笔记
原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 第二章 Js概览 基于GoogleV8引擎 Object.keys(o) 数组方法:遍历forEach.过滤filter ...
- Node.js内置的文件系统模块(fs)
异步读取文件 按照js的标准,异步读取一个文本文件的格式如下: 'use strict' const fs = require('fs') fs.readFile('test.txt', 'utf-8 ...
- Node.js开发者最常范的10个错误
目录 前言 1 不使用开发工具 1.1 自动重启工具 1.2 浏览器自动刷新工具 2 阻塞event loop 3 频繁调用回调函数 4 圣诞树结构的回调(回调的地狱) 5 创建一个大而完整的应用程序 ...
- Node.js的线程和进程
http://www.admin10000.com/document/4196.html 前言 很多Node.js初学者都会有这样的疑惑,Node.js到底是单线程的还是多线程的?通过本章的学习,能够 ...
随机推荐
- git初步使用
git初步使用 主要目的:使用代码控制工具,练习使用git 1.创建新项目 网址如下: https://github.com/kellyseeme?tab=repositories 注意每个人使用的名 ...
- [质疑]编程之美求N!的二进制最低位1的位置的问题
引子:编程之美给出了求N!的二进制最低位1的位置的二种思路,但是呢?但是呢?不信你仔细听我道来. 1.编程之美一书给出的解决思路 问题的目标是N!的二进制表示中最低位1的位置.给定一个整数N,求N!二 ...
- [LeetCode] Missing Number (A New Questions Added Today)
Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missin ...
- [转]32位和64位系统区别及int字节数
一)64位系统和32位有什么区别? 1.64bit CPU拥有更大的寻址能力,最大支持到16GB内存,而32bit只支持4G内存 2.64位CPU一次可提取64位数据,比32位提高了一倍,理论上性能会 ...
- [转] Web 前端优化最佳实践之 Mobile(iPhone) 篇
原文链接:http://dbanotes.net/web/best_practices_for_speeding_up_your_web_site_server_mobile.html Web 前端优 ...
- 第三百五十四天 how can I 坚持
你的问题主要在于:读书不多而买书太多:读书太少又特爱思考,还话唠.. 2012年毕业,辗转无锡,上海,最后来到了北京,逛了北京, 2013年,清明去爬了长城,从天通苑搬到了甜水园, 2014年,爬了泰 ...
- Fast-paced Multiplayer
http://www.gabrielgambetta.com/fpm1.html —————————————————————————————————————————————————————— Fast ...
- POJ 1584 A Round Peg in a Ground Hole(判断凸多边形,点到线段距离,点在多边形内)
A Round Peg in a Ground Hole Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4438 Acc ...
- (转载)Java里快如闪电的线程间通讯
转自(http://www.infoq.com/cn/articles/High-Performance-Java-Inter-Thread-Communications) 这个故事源自一个很简单的想 ...
- B - Kefa and Company
B - Kefa and Company Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I6 ...