node + redis 学习(一)

安装 redis 依赖包

npm install redis --save

引入并连接数据库

const redis = require('redis')
const { promisify } = require('util')

client = redis.createClient(6379, '127.0.0.1');

监听事件

client.on('ready',function(res){
  console.log('ready');
});

client.on('end',function(){
  console.log('end');
});

client.on('error', function (err) {
  console.log(err);
});

client.on('connect',function(){
  console.log('redis connect success!');
});

基本的使用

字符串(string)
// 1. 存储的值可以是整数,浮点数或者字符串; 一个字符串类型的值最大长度为512 M。
// 2.常见操作: get,set,mget,mset,incr(计数器++),decr(--)等等;
// 3. 主要用于缓存数据, 提高查询性能. 比如存储登录用户信息 电商中存储商品信息 可以做计数器(想知道什么时候封锁一个IP地址(访问超过几次))等等

// set key value 设置key的value
// get key 得到key的value
// mset key1 value1 key2 value2  添加多条string类型数据
// incr key key如果是整型自增1
// incrby key step  按照步长(step)自增
// decr key自减1
// decrby key step  按照步长(step)自减
// keys * 得到所有key

//普通使用
client.set('name', '111', (err, res) => {
  console.log(res);  //OK
});
client.get('name', (err, res) => {
  console.log(res);     //111      
});
client.incr('name', (err, res) => {
  console.log(res); //112
})
client.incrby('name', 2, (err, res) => {
  console.log(res); //114
})
client.get('name', (err, res) => {
  console.log(res);     //114 
});


***promisify化使用

// 1.promisify化
const handler = {
  get(target, propKey) {
    return promisify(target[propKey]).bind(target)
  }
}

const redisClient = new Proxy(client, handler)

// 2.promisify化使用
const set = async (key, val) => await redisClient.set(key, val)
set('age', 1)
const get = async (key) => {
  const res = await redisClient.get(key)
  console.log(res); //1
}
get('age')

哈希(hash)
// 1.hash可用来存储对象,一个Redis 列表中最多可存储232-1(40亿)个元素
// 2.常用操作:
// hset key filed value 设置key对象的field属性的value
// hget key filed 得到key对象的field属性的value
// hmset key filed1 value1 filed2 value2 //批量设置key对象的field属性及value
// hgetall key 得到key对象的所有的属性和值
// hdel key field 删除
// hexists key field 判断对象是否存在这个field
// hlen key 获取属性个数
// hincrby key field step 按照步长自增/自减某个属性(该属性必须是数字)
// 3.应用场景: 
// 3.1 hash可以同于对象存储, 比如存储用户信息,与字符串不一样的是,字符串需要将对象进行序列化(比如json序列化)之后才能保存,
       // 而hash则可以将用户对象的每隔字段单独存储,这样就能节省序列化和反序列化的时间
// 3.2 还可以保存用户的购买记录, 比如key为用户id,field为商品id,value为商品数量. 同样还可以用于购物车数据的存储, 
      //比如key为用户id,field为商品id,value为购买数量.

client.hmset('userInfo', 'name', '张三', "age", 3, (err, res) => {
  console.log(res);  //OK
});
client.hgetall('userInfo', (err, res) => {
  console.log(res);     //{ name: '张三', age: '3' }    
});
client.hget('userInfo', 'name', (err, res) => {
  console.log(res); //张三
})
client.hincrby('userInfo','age', 2, (err, res) => {
  console.log(res); //5
})
client.hexists('userInfo','age', (err, res) => {
  console.log(res);     //1
});
client.hlen('userInfo', (err, res) => {
  console.log(res);     //2
});

在这里插入图片描述

列表(list)
// 1. 一个Redis 列表中最多可存储232-1(40亿)个元素
// 2.实现原理是一个双向链表(其底层是一个快速列表),即可以支持反向查找和遍历,更方便操作.
    //插入和删除操作非常快. 时间复杂度为O(1),但是索引定位很慢,时间复杂度为O(n)
// 3.常用操作: lpush(首位添加),rpush(末位添加),lset(修改首位值),lindex(删除首位元素),lpop(删除末位元素)
// lpush key value [value ...] 向链表key左边添加元素
// rpush key value [value...] 向链表key右边添加元素
// lpop key 移除key链表左边第一个元素
// rpop key 移除key链表右边第一元素
// lrange key start stop 获取链表中某一段,包含最大值,-1表示最后一个元素
// 4.应用场景: 
// 4.1 实现热销榜
// 4.2 实现工作队列(利用lists的push操作, 将任务存在lists中, 然后工作线程再用pop操作将任务取出来执行)
// 4.3 实现最新列表, 比如最新评论等

client.lpush('city', '1','2','3', (err, res) => {
  console.log(res);  //3
});
client.rpush('city', ['a', 'b', 'c'], (err, res) => {
  console.log(res);     //6    
});
client.lrange('city',0, -1, (err, res) => {
  console.log(res); //[ '3', '2', '1', 'a', 'b', 'c' ]
})
client.lpop('city', (err, res) => {
  console.log(res); //3
})


// 使用send_command进行操作
// client.send_command('lset',['mylist',0,1], (err,res) =>{
//   console.log(res);          // OK
// })
// client.send_command('lpush',['mylist', 'one'], (err, res) => {
//   console.log(res);          //OK 
// })
集合(sets)
// 1.集合中不允许重复成员的存在。当多次添加一个元素时,其结果不会设置单个成员多次。一个Redis 集合中最多可包含232-1(40亿)个元素。
// 2.常见操作: sadd、smembers、sinter(交)、sunion(并)、sdiff(补)、smove
// sadd key member [member ...] 向集合key中添加元素,如果元素已经存在则忽略
// srem key member [member ...] 从集合key中删除元素
// smembers key 返回集合key中所有的元素
// sinter key [key ...] 多个集合执行交集运算
// sdiff key [key ...] 多个集合执行差集运算
// sunion key [key ...] 多个集合执行并集运算
// 3.sets 集合处理; 业务中用lodash进行交并补也是一个不错的选择。

client.sadd('city1', 'beijing','shanghai','guangzhou','111', (err, res) => {
  console.log(res);  //0
});
client.sadd('city2','beijing','shanghai','shenzhen', (err, res) => {
  console.log(res);     //0    
});
client.smembers('city1', (err, res) => {
  console.log(res); //[ 'guangzhou', 'shanghai', 'beijing' ]
})
client.srem('city1', 'guangzhou', (err, res) => {
  console.log(res); //114
})
client.smembers('city1', (err, res) => {
  console.log(res); //[ 'shanghai', 'beijing' ]
})
client.sinter('city1','city2', (err, res) => {
  console.log(res);     //[ 'shanghai', 'beijing' ]
});
client.sdiff('city1','city2', (err, res) => {
  console.log(res);     //['111']
});
client.sdiff('city2','city1', (err, res) => {
  console.log(res);     //[ 'shenzhen' ]
});
client.sunion('city1','city2', (err, res) => {
  console.log(res);     //[ 'beijing', 'shenzhen', '111', 'shanghai' ]
});
有序集合(SortedSets)
// 1.常用操作: zadd(设置元素), zrange(获取范围内的元素),zrank(获取指定元素的排名,从0开始), zscore(获取指定元素的score,用户指定的score)
// zadd key score member [score member ...] 向有序集合key中加入一个或多个元素和分数,如果元素已经存在,则替换分数
// zrem key member [member ...] 删除集合中一个或多个元素
// zrange key start stop [withscores] 按元素分数从小到大顺序返回元素,如需获得对应元素的分数,在尾部加上withscores
// zrevrange key start stop [withscores] 按元素分数从大到小顺序返回元素

client.zadd('shuxue', 20,'id1',10,'id2', 30,'id3', (err, res) => {
  console.log(res);  //3
});
client.zadd('yuwen', [2,'id1',10,'id2', 11, 'id3'], (err, res) => {
  console.log(res);  //3
});
client.zrevrange('shuxue', 0, -1, 'withscores',  (err, res) => {
  console.log(res);  //[ 'id3', '30', 'id1', '20', 'id2', '10' ]
})
client.zrange('yuwen', 0, -1,  (err, res) => {
  console.log(res);  //[ 'id1', 'id2', 'id3' ]
})
client.zrem('yuwen', [2,'id1',10,'id2'], (err, res) => {
  console.log(res);  //2
});
client.zrem('shuxue', 10,'id2', (err, res) => {
  console.log(res);  //1
});
client.zrevrange('shuxue', 0, -1, 'withscores',  (err, res) => {
  console.log(res);  //[ 'id3', '30', 'id1', '20' ]
})
client.zrange('yuwen', 0, -1,  (err, res) => {
  console.log(res);  //[ 'id3' ]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一条 Node.js 的学习路线,供你参考: 1. 开始学习 JavaScript。掌握基本语法和特性,包括变量、数据类型、条件语句、循环语句、函数、对象、数组等。可以通过 W3School 或者 MDN 等网站进行学习。 2. 掌握 Node.js 的基本概念和基础知识。了解 Node.js 的历史、特点、应用场景等,同时学习 Node.js 的模块系统、事件循环、异步编程等基本概念。 3. 学习 Node.js 的核心模块。Node.js 提供了众多内置的模块,如文件系统、HTTP、网络、流等,需要掌握这些模块的使用方法。 4. 掌握 Node.js 的第三方模块。Node.js 生态系统非常丰富,有很多优秀的第三方模块,如 Express、Koa、Socket.io 等,需要学习这些模块的使用方法。 5. 学习数据库操作。Node.js 可以连接多种类型的数据库,如 MySQL、MongoDB、Redis 等,需要掌握数据库的基本操作和连接方法。 6. 学习 Web 开发。使用 Node.js 可以轻松创建 Web 应用程序,需要学习 HTML、CSS、JavaScript 等前端技术,以及 Express、Koa 等 Web 框架的使用方法。 7. 学习安全性。在开发 Web 应用程序时需要注意安全性,如 XSS、CSRF、SQL 注入等,需要掌握一些基本的安全知识和防御方法。 8. 学习性能优化。Node.js 应用程序需要考虑性能问题,如优化代码、减少请求响应时间、减少资源消耗等,需要学习一些性能优化技巧和工具。 9. 学习测试和调试。在开发 Node.js 应用程序时需要进行测试和调试,需要学习一些测试框架和工具,如 Mocha、Chai、SuperTest 等。 10. 学习部署和维护。Node.js 应用程序需要部署到生产环境中,并进行维护和监控,需要学习一些部署和维护技巧和工具,如 PM2、Nginx、Logrotate 等。 以上是 Node.js 的学习路线,需要不断实践和总结,才能掌握 Node.js 的核心技术和应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值