node.js中 redis 的安装和基本操作示例


Posted in Javascript onFebruary 10, 2020

本文实例讲述了node.js中 redis 的安装和基本操作。分享给大家供大家参考,具体如下:

一、win下安装redis

https://github.com/MicrosoftArchive/redis/releases

下载Redis-x64-3.2.100.zip,然后解压,放到自定义目录。

然后打开命令行工具,进入到该目录下,运行安装redis服务。

redis-server.exe --service-install redis.windows-service.conf --loglevel verbose

然后就可以启动redis服务了

redis-server --service-start

二、redis可视化工具RedisDesktopManager

https://github.com/uglide/RedisDesktopManager/releases

现在已经不免费了,可以下载早期版本。

三、redis的数据类型

1、字符串,最基本的类型,一个key对应一个value。

//设置值
set name xiaoxu
//获取值
get name
//获取子字符串,包含开始和结束索引的字符
getrange name 0 -1
getrange name 1 3
//自增加1
set age 1
incr age
//指定增加的数量
incrby age 5
//递减1
decr age
//指定递减的数量
decrby age 3
//删除指定的键
del age
//判断键是否存在
exists name
//设置过期时间,单位秒
expire name 10
//查看剩余生存时间
ttl name
//获取键的值类型
type name

2、哈希值,是一个键值对的集合,一个字符串类型的field和value的映射表,适合存储对象

//设置单个值
hset person name xiao
//设置多个值
hmset person age 24 height 172
//获取单个值
hget person name
//获取多个值
hmget person age height
//获取所有值
hgetall person
//删除键
hdel person name
//获取所有的键
hkeys person

3、列表,简单的字符串列表,按插入顺序排序。

//往列表左边插入
lpush list 1
lpush list 2
//往列表右边插入
rpush list 3
rpush list 4
//查看列表元素
lrange list 0 -1
//弹出元素
lpop list
rpop list
//通过索引获取元素
lindex list 1
//获取列表的长度
llen list
//删除列表的元素
//lrem key count value
// count > 0时,从表头开始搜索,删除与value相等的元素,数量为count
// count < 0时,从表尾开始搜索,删除与value相等的元素,数量为count绝对值
// count = 0时,删除列表中所有与value相等的元素
lrem list 1 1
lrem list -1 2

4、集合,是字符串类型的无序集合

//添加元素
sadd label 1 2 3
//查看集合
smembers label
//获取集合个数
scard label
//删除元素
srem label 2
//交集
sadd a 1 2 3
sadd b 2 3 4
sinter a b
//差集
sdiff a b
//并集
sunion a b

5、有序集合,跟集合一样也是字符串的集合,不过每个元素会关联一个double类型的分数,redis通过该分数给集合中的元素进行从小到大的排序。

//添加有序成员
zadd xiaoxu 60 math 77 english 80 chinaese
//获取有序成员数量
zcard xiaoxu
//查看有序集合
zrange xiaoxu 0 -1
//查看有序集合,显示分数
zrange xiaoxu 0 -1 withscores
//删除有序集合中的成员
zrem xiaoxu math

四、node.js中使用redis

安装redis库

npm install redis --save

操作redis的方法与我们在命令行中输入的命令基本一致

const redis = require('redis');
//创建一个redis客户端
let client = redis.createClient(6379, '127.0.0.1');
//操作redis基本跟在命令行操作一致
client.set('name', 'xiaoxu', function (err, result) {
  if (err) {
    console.log(err);
  }
  console.log(result);
});
client.hmset('person', 'name', 'xiaoxu', 'age', '25', function (err, result) {
  if (err) {
    console.log(err);
  }
  console.log(result);
});
client.hmget('person', 'name', 'age', function (err, result) {
  if (err) {
    console.log(err);
  }
  console.log(result);
});
client.hkeys('person', function (err, result) {
  if (err) {
    console.log(err);
  }
  result.forEach(function (value) {
    client.hget('person', value, function (err, result) {
      console.log(value, result);
    });
  });
  //退出
  client.quit();
});

通过bluebird来包装redis,让它支持async,await的方式,解决多层嵌套问题。

const redis = require('redis');
const bluebird = require('bluebird');
//通过bluebird包装
bluebird.promisifyAll(redis.RedisClient.prototype);
bluebird.promisifyAll(redis.Multi.prototype);
//创建一个redis客户端
let client = redis.createClient(6379, '127.0.0.1');
(async function () {
  //方法名后面都加上Async
  let result = await client.setAsync('name', 'hehe');
  console.log(result);
  result = await client.hmsetAsync('person', 'name', 'xiaoxu', 'age', '25');
  console.log(result);
  result = await client.hkeysAsync('person');
  console.log(result);
  result.forEach(async function (value) {
    let v = await client.hgetAsync('person', value);
    console.log(value, v);
  });
  client.quit();
})();

五、redis发布与订阅

redis发布订阅是一种消息通信模式,发送者发送消息,订阅者接收消息。

const redis = require('redis');
let clientA = redis.createClient(6379, '127.0.0.1');
let clientB = redis.createClient(6379, '127.0.0.1');
//客户端A订阅频道
clientA.subscribe('news');
clientA.subscribe('sports');
//客户端A监听消息
clientA.on('message', function (channel, message) {
  console.log('客户端A收到', channel, message);
  //客户端A在10秒后取消订阅
  setTimeout(function () {
    clientA.unsubscribe('news');
  }, 10000);
});
setInterval(function () {
  clientB.publish('news', '这是一条新闻' + new Date().toLocaleString());
  clientB.publish('sports', '这是一条体育' + new Date().toLocaleString());
}, 1000);

六、redis事务

redis事务可以一次性执行多个命令,multi 命令之后,exec命令之前,命令都会放到队列中,直到执行exec,将会执行队列中的命令。

discard可以取消事务,放弃执行事务块内的所有命令。

const redis = require('redis');
let client = redis.createClient(6379, '127.0.0.1');
client.multi()
.hset('person', 'name', 'haohao')
.hset('person', 'age', '34')
.exec(function (err, result) {
  if (err) {
    console.log(err);
  }
  console.log(result);
  client.quit();
});

注意redis中的事务跟mysql中的事务是有区别的。

希望本文所述对大家node.js程序设计有所帮助。

Javascript 相关文章推荐
用JS操作FRAME中的IFRAME及其内容的实现代码
Jul 26 Javascript
javascript打印大全(打印页面设置/打印预览代码)
Mar 29 Javascript
JS/jQuery实现默认显示部分文字点击按钮显示全部内容
May 13 Javascript
完美解决IE低版本不支持call与apply的问题
Dec 05 Javascript
基于JavaScript实现鼠标悬浮弹出跟随鼠标移动的带箭头的信息层
Jan 18 Javascript
浅谈js中的延迟执行和定时执行
May 31 Javascript
微信小程序中多个页面传参通信的学习与实践
May 05 Javascript
微信小程序 页面跳转传值实现代码
Jul 27 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
Aug 09 Javascript
使用JS判断页面是首次被加载还是刷新
May 26 Javascript
javascript实现日历效果
Jun 17 Javascript
解决vue scoped scss 无效的问题
Sep 04 Javascript
js实现登录拖拽窗口
Feb 10 #Javascript
javascript 原型与原型链的理解及应用实例分析
Feb 10 #Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
Feb 10 #Javascript
node.js使用http模块创建服务器和客户端完整示例
Feb 10 #Javascript
webpack打包优化的几个方法总结
Feb 10 #Javascript
JS+HTML5本地存储Localstorage实现注册登录及验证功能示例
Feb 10 #Javascript
node.js制作一个简单的登录拦截器
Feb 10 #Javascript
You might like
php获取textarea的值并处理回车换行的方法
2014/10/20 PHP
php操作memcache缓存方法分享
2015/06/03 PHP
smarty高级特性之对象的使用方法
2015/12/25 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
破除网页鼠标右键被禁用的绝招大全
2006/12/27 Javascript
JavaScript原型继承之基础机制分析
2011/08/26 Javascript
Jquery index()方法 获取相应元素索引值
2012/10/12 Javascript
使用script的src实现跨域和类似ajax效果
2014/11/10 Javascript
简介EasyUI datagrid editor combogrid搜索框的实现
2016/04/01 Javascript
谈谈对JavaScript原生拖放的深入理解
2016/09/20 Javascript
移动端基础事件总结与应用
2017/01/12 Javascript
React Native react-navigation 导航使用详解
2017/12/01 Javascript
使用 Node.js 开发资讯爬虫流程
2018/01/07 Javascript
layui实现table加载的示例代码
2018/08/14 Javascript
vue抽出组件并传值实例
2020/07/31 Javascript
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
[01:29:42]Liquid vs VP Supermajor决赛 BO 第一场 6.10
2018/07/05 DOTA
python 查找文件夹下所有文件 实现代码
2009/07/01 Python
详解设计模式中的工厂方法模式在Python程序中的运用
2016/03/02 Python
python 根据正则表达式提取指定的内容实例详解
2016/12/04 Python
Pycharm无法使用已经安装Selenium的解决方法
2018/10/13 Python
python实现上传文件到linux指定目录的方法
2020/01/03 Python
浅析两列自适应布局的3种思路
2016/05/03 HTML / CSS
澳大利亚的奢侈品牌:Oroton
2016/08/26 全球购物
Omio波兰:全欧洲低价大巴、火车和航班搜索和比价
2018/02/16 全球购物
莫斯科高科技在线商店:KremlinStore
2019/03/13 全球购物
文秘专业个人求职信
2013/12/22 职场文书
门卫人员岗位职责
2013/12/24 职场文书
委托证明的格式
2014/01/10 职场文书
中学生社会实践活动总结
2014/07/03 职场文书
大学生个人求职信例文
2014/07/07 职场文书
骨干教师考核评语
2014/12/31 职场文书
南京导游词
2015/02/03 职场文书
幼儿教师小班个人总结
2015/02/05 职场文书
小学教师岗位职责
2015/04/02 职场文书
python for循环赋值问题
2021/06/03 Python