node使用redis

该博客介绍了Redis这个Key-Value存储系统,以及如何在Windows环境下安装和使用Redis。同时,展示了在Node.js中通过`redis`模块与Redis交互,包括设置、获取、删除和更新数据。示例代码使用Koa框架和`koa-body`处理HTTP请求,实现了基于Redis的IP地址管理,包括增、删、改、查操作。
摘要由CSDN通过智能技术生成

国际惯例,先简单介绍下redis。

redis是什么

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

相关git

koakoa-routerkoa-bodynode_redisAnotherRedisDesktopManager

安装redis

安装redis,网上教程很多,这里就不多说,自行搜索一下哈。(本文介绍的是在Windows环境下)
安装完redis后,运行redis-server.exe,搭配使用redis可视化管理工具 → AnotherRedisDesktopManager

node下安装redis

支持所有redis的命令,redis文档

  1. npm install redis

官方使用示例

  1. var redis = require("redis"),
  2. client = redis.createClient();
  3. //如果要切换数据库,可以使用下面命令
  4. // client.select(3, function() { /* ... */ });
  5. client.on("error", function (err) {
  6. console.log("Error " + err);
  7. });
  8. client.set("string key", "string val", redis.print);
  9. client.hset("hash key", "hashtest 1", "some value", redis.print);
  10. client.hset(["hash key", "hashtest 2", "some other value"], redis.print);
  11. client.hkeys("hash key", function (err, replies) {
  12. console.log(replies.length + " replies:");
  13. replies.forEach(function (reply, i) {
  14. console.log(" " + i + ": " + reply);
  15. });
  16. client.quit();
  17. });

如果node版本是V8或更高的,还可以使用同步

  1. const {promisify} = require('util');
  2. const getAsync = promisify(client.get).bind(client);
  3. return getAsync('foo').then(function(res) {
  4. console.log(res); // => 'bar'
  5. });
  6. //或者使用async await
  7. async myFunc() {
  8. const res = await getAsync('foo');
  9. console.log(res);
  10. }

实际使用

koa + redis 进行增删改查,使用redis中的DB 3

增:添加一个IP ,默认值为0

请求地址

http://localhost:3001/gateway

请求方式

POST

请求参数

{

“ip”: “192.168.2.1”

}

删:删除IP

请求地址http://localhost:3001/gateway?ip=192.168.2.1

请求方式

DELETE

请求参数

{

“ip”: “192.168.2.1”

}

改:修改IP 的value

请求地址http://localhost:3001/gateway

请求方式

PUT

请求参数

{

“ip”: “192.168.2.1”,

“value”:”222″

}

查:查询IP的value

请求地址http://localhost:3001/gateway?ip=192.168.2.1

请求方式

GET

请求参数

{

“ip”: “192.168.2.1”

}

核心代码

  1. //app.js
  2. const Koa = require('koa')
  3. const router = require('./routes/index')
  4. const app = new Koa()
  5. app.use(router.routes()).use(router.allowedMethods());
  6. app.listen(3001)
  7. console.log("服务启动成功,端口号:3001 ")
  1. //路由 routes/index.js
  2. const Router = require('koa-router');
  3. const koaBody = require('koa-body');
  4. const testController = require('../controllers/test')
  5. const router = new Router()
  6. //test
  7. router.get('/gateway',testController.assignServer)//分配
  8. router.post('/gateway',koaBody(),testController.registerServer)//注册
  9. router.put('/gateway',koaBody(),testController.updateServer)//更新
  10. router.delete('/gateway',testController.deleteServer)//注销
  11. module.exports = router
  1. //封装redis util/redis.js
  2. const redis = require("redis");
  3. const { promisify } = require('util');
  4. //Redis 命令参考 http://doc.redisfans.com/index.html
  5. /**
  6. *
  7. * @param {*} db 需要切换的DB,不传则默认DB 0
  8. */
  9. function Client(num){
  10. let db = num || 0
  11. let client = redis.createClient({db});
  12. //需要使用同步函数,按照如下定义即可
  13. this.exists = promisify(client.exists).bind(client);
  14. this.keys = promisify(client.keys).bind(client);
  15. this.set = promisify(client.set).bind(client);
  16. this.get = promisify(client.get).bind(client);
  17. this.del = promisify(client.del).bind(client);
  18. this.incr = promisify(client.incr).bind(client);
  19. this.decr = promisify(client.decr).bind(client);
  20. this.lpush = promisify(client.lpush).bind(client);
  21. this.hexists = promisify(client.hexists).bind(client);
  22. this.hgetall = promisify(client.hgetall).bind(client);
  23. this.hset = promisify(client.hset).bind(client);
  24. this.hmset = promisify(client.hmset).bind(client);
  25. this.hget = promisify(client.hget).bind(client);
  26. this.hincrby = promisify(client.hincrby).bind(client);
  27. this.hdel = promisify(client.hdel).bind(client);
  28. this.hvals = promisify(client.hvals).bind(client);
  29. this.hscan = promisify(client.hscan).bind(client);
  30. this.sadd = promisify(client.sadd).bind(client);
  31. this.smembers = promisify(client.smembers).bind(client);
  32. this.scard = promisify(client.scard).bind(client);
  33. this.srem = promisify(client.srem).bind(client);
  34. return this;
  35. }
  36. module.exports = Client

业务处理代码

  1. //controllers/test.js
  2. const Client = require('../util/redis')
  3. class TestController {
  4. /* 查询
  5. */
  6. static async get(ctx) {
  7. let ip = ctx.request.query.ip;
  8. const client = new Client(3);
  9. try {
  10. let res = await client.get(ip);
  11. ctx.body = {
  12. data:res
  13. }
  14. } catch (err) {
  15. ctx.body = {
  16. message:err
  17. }
  18. }
  19. }
  20. /* 增
  21. */
  22. static async add(ctx) {
  23. let ip = ctx.request.body.ip;
  24. const client = new Client(3);
  25. try {
  26. let old = await client.exists(ip);
  27. if (old) {
  28. ctx.error(false, "添加失败, ip已存在")
  29. } else {
  30. await client.set(ip, 0);
  31. ctx.body = {
  32. message:"添加成功"
  33. }
  34. }
  35. } catch (err) {
  36. ctx.body = {
  37. message:err
  38. }
  39. }
  40. }
  41. /* 改
  42. */
  43. static async update(ctx) {
  44. let ip = ctx.request.body.ip,
  45. value = ctx.request.body.value;
  46. let isDecr;
  47. let client = new Client(3); //gateway在REDIS中的默认DB 为0
  48. try {
  49. let old = await client.exists(ip);//先查询
  50. if (old) {//存在
  51. await client.set(ip, value);
  52. ctx.body = {
  53. message:"修改成功"
  54. }
  55. } else {
  56. ctx.body = {
  57. message:"修改失败,IP不存在"
  58. }
  59. }
  60. } catch (err) {
  61. ctx.body = {
  62. message:err
  63. }
  64. }
  65. }
  66. /**
  67. * 删
  68. */
  69. static async delete(ctx) {
  70. let ip = ctx.request.query.ip;
  71. const client = new Client(3);
  72. try {
  73. let old = await client.exists(ip);//先查询
  74. if (old) {//存在
  75. await client.del(ip);
  76. ctx.body = {
  77. message:"删除成功"
  78. }
  79. } else {
  80. ctx.body = {
  81. message:"删除失败,IP不存在"
  82. }
  83. }
  84. } catch (err) {
  85. ctx.body = {
  86. message:err
  87. }
  88. }
  89. }
  90. }
  91. module.exports = TestController

完整代码

完整代码
代码下载到本地后,进入文件夹根目录,输入命令

  1. npm i

安装完node包后再运行

  1. node app.js

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值