redis数据库连接建立
var redis = require('redis'), //连接数据库
RDS_PORT = 6379,
RDS_HOST = '127.0.0.1',
RDS_OPTS = {},
client = redis.createClient(RDS_PORT, RDS_HOST, RDS_OPTS);
client.on('ready', function(res) {
console.log('ready')
});
下载redis后默认开放端口为6379,默认密码为空。创建连接实例client后可以通过client.get和client.set简单地进行键值对的读写
为啥要用键名前缀?
查过了node下的api文档以后,发现没有可以切换db的api(也是哈,毕竟连接实例是通过与某个db建立连接产生的),也就是如果不在命令行中对默认选中的db进行切换,会导致所有键值对都放置在一个db中,如图
对于学生开发者来说,可能一个服务器同时支持若干个后台服务。。如果不能有效区分不同服务的键值对,也就是所有后台程序的键值对混杂在一起,会对debug过程造成非常大的麻烦。而手动切换DB的代价也是较大且较麻烦的,所以一种较为通用的解决方案是使用键名前缀
为啥要重写api?
以最常见的get方法为例,它是长这样的
client.get(key, (error, result) => {
//此处是你编写的回调函数
})
如果不重写get方法,并且希望每个键名都有前缀(存储在变量prefix中),那么通常会这么做
const prefix = 'myPrefix'
client.get(prefix + key, (error, result) => {
//此处是你编写的回调函数
})
set同理。因而可以预见,如果我们不对get和set(当然也许还有更多方法,此处以最常见的get和set为例)进行重写的话,prefix将在代码中出现N次,这是非常不符合编程美学的!
那咋重写呢?
我们希望能有这样的一个方法,使得get和set都能够自动补全前缀,即以下两个代码段在功能上等效
const prefix = 'myPrefix'
client.get(prefix + key, (error, result) => {
//此处是你编写的回调函数
})
client.myGet(key, (error, result) => {
//此时拿到的键其实是prefix+key键名对应的键
})
myGet方法接收两个参数,分别是key和回调函数。想清楚所希望实现的功能以后,我们很容易直观地写出以下代码
version1.0
const prefix = 'myPrefix'
client.myGet = function(key, callbackFunction){
client.get(prefix + key, (error, result) => {
callbackFunction(error, result)
}
}
client.mySet = function(key, value, callbackFunction){
client.set(prefix + key, value, (error, result) => {
callbackFunction(error, result)
}
}
这样已经能够实现基本的get需求了。但是事实上get方法是一个异步任务,它是有返回值的,返回内容是一个promise对象。
version2.0
const prefix = 'myPrefix'
client.myGet = async function(key, callbackFunction){
return client.get(prefix + key, (error, result) => {
callbackFunction(error, result)
}
}
client.mySet = async function(key, value, callbackFunction){
return client.set(prefix + key, value, (error, result) => {
callbackFunction(error, result)
}
}
嗯。。大概就是这样,我日常使用还没有出现过bug。在此基础上可以自己去diy这个方法,比如使得get和set的键值参数都为对象形式(我自己的项目中,键值都是对象/对对象的处理方法)
version3.0
const prefix = 'myPrefix'
client.myGet = async function(key, callbackFunction){
return client.get(prefix + key, (error, result) => {
callbackFunction(error, JSON.parse(result))
}
}
client.mySet = async function(key, value, callbackFunction){
return client.set(prefix + key, JSON.stringify(value), (error, result) => {
callbackFunction(error, result)
}
}
get和set方法重写完毕。事实上我们未必要用'myGet'和'mySet'这样自定义的一个方法名去承载重写的方法,其实是可以直接覆盖在set和get上的,只需将client.myGet = ......改成client.get = ...... 最后数据库中效果如图,泾渭分明