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
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值