案例介绍

微信有几亿的用户群,某一时刻可能有几千上万人同时在玩漂流瓶,对于这种高并发数据量小的服务,使用 Node.js 和 Redis 绝对是一个推荐的选择。

接口设计

扔一个漂流瓶

  • 请求方法:POST
  • 请求路径:/
  • 请求体参数:
    • time:漂流瓶扔出的时间戳,默认设置为 Date.now()
    • owner:漂流瓶主人(用户 id)
    • type:漂流瓶类型
      • male:男性
      • female:女性
    • content:漂流瓶内容
  • 返回:完整数据内容

捡一个漂流瓶

  • 请求方法:GET
  • 请求路径:/
  • 查询参数:
    • user:捡漂流瓶的人(用户 id)
    • type:漂流瓶类型
      • all:全部
      • male:男性
      • female:女性
  • 返回数据:
{"time": 1641883884765, // 漂流瓶扔出的时间戳"owner": 1, // 漂流瓶主人"type": "male", // 漂流瓶类型"content": "hello world" // 漂流瓶内容
}

设计思路

可以将 Redis 想象成一片大海,Redis 中的每一条 Hash 类型的数据就是一个漂流瓶,每个漂流瓶都有独一无二的 id(即 Redis 中的键),里面包含了漂流瓶的一些信息(即 Redis 中键的值)。

使用两个数据库,分别存储两种 type 的漂流瓶,目的是为了方便使用 Redis 中的 RANDOMKEY 命令,该命令返回当前数据库中的一个随机键,不能加任何条件。

扔漂流瓶时,为其创建一个唯一 id(使用 uuidv4),以这个 id 为 key,漂流瓶的数据为值,添加一条 Hash 类型的数据,并设置 1 天有效期。

捡漂流瓶时,根据 type 决定从哪个数据库中随机读取数据,漂流瓶一经捡起,就从数据库中删除。

开始开发

初始化项目

mkdir drift-bottle
cd drift-bottle
npm init -y
npm i express ioredis uuidv4

app.js:

const { uuid } = require('uuidv4')
const Redis = require('ioredis')
const express = require('express')const app = express()
app.use(express.json())// 创建 Redis 实例
const connectRedis = () => {return new Redis()
}// 扔一个漂流瓶
app.post('/', (req, res, next) => {try {res.send('post /')} catch (error) {next(error)}
})// 捡一个漂流瓶
app.get('/', (req, res, next) => {try {res.send('get /')} catch (error) {next(error)}
})// 统一处理异常
app.use((err, req, res, next) => {res.status(500).json({error: err.message})
})app.listen(3000, () => {console.log('runnning')
})

扔一个漂流瓶

// 扔一个漂流瓶
app.post('/', async (req, res, next) => {try {const bottle = req.body// 设置时间戳bottle.time = bottle.time || Date.now()// 为每个漂流瓶随机生成一个不重复的idconst bottleId = uuid()const type = {male: 0,female: 1}await redis.pipeline()// 根据类型切换数据库.select(type[bottle.type])// 将数据存为 Hash.hmset(bottleId, bottle)// 设置 1 天有效期.expire(bottleId, 24 * 60 * 60).exec()res.status(201).json({bottle: {id: bottleId,...bottle}})} catch (error) {next(error)}
})

捡一个漂流瓶

// 捡一个漂流瓶
app.get('/', async (req, res, next) => {try {const query = req.queryconst type = {all: Math.round(Math.random()),male: 0,female: 1}query.type = query.type || 'all'// 根据类型切换数据库await redis.select(type[query.type])// 随机获取一个 keyconst bottleId = await redis.randomkey()if (!bottleId) {res.status(200).json({message: '大海很干净...'})}// 根据漂流瓶 id 获取完整的漂流瓶信息const bottle = await redis.hgetall(bottleId)res.status(201).json({bottle})// 从 Redis 中删除捡到的漂流瓶redis.del(bottleId)} catch (error) {next(error)}
})

Redis 学习 - 06 漂流瓶案例相关推荐

  1. redis系列:通过队列案例学习list命令 1

    前言 这一篇文章将讲述Redis中的list类型命令,同样也是通过demo来讲述,其他部分这里就不在赘述了. 项目Github地址:https://github.com/rainbowda/learn ...

  2. Redis学习之秒杀案例

    记录每次学习的过程,总结学习的内容,希望能给到自己和别人帮助. Redis学习之秒杀案例 基础设计思路 1.uid和prodid的非空判断 2.连接redis 3.拼接key,包括库存的和成功秒杀的用 ...

  3. 关于交友网站的开发分享(漂流瓶功能)

    前言 一件事情在开头总是想的很美好,然而事实总会跟你对着干.在网站搭建的过程中遇到了无数多的前端页面设计bug,我在此之前也可以算的上是个前端小小白,很是无奈,不过还是要在这里感谢其他工作室里帮我解决 ...

  4. redis学习与入门~~~

    redis学习与入门~~~ 一. Redis 简介: 通常而言目前的数据库分类有几种,包括 SQL/NSQL,,关系数据库,键值数据库等等,分类的标准也不1,Redis本质上也是一种键值数据库的,但它 ...

  5. 微信表情暂停使用,漂流瓶功能彻底再见!

    作者 | 胡巍巍 出品 | CSDN(ID:CSDNnews) 清明前夕深夜搞事情,怕也只有微信了. 今天(4月4日)凌晨00:36分,腾讯微信团队在微博发通知称: "4月4日零时起,微信表 ...

  6. Redis学习之旅--Redis的数据类型你都知道吗?

    Redis学习之旅--数据类型 Redis-Key String(字符串) list(列表) Set(集合) Hash(哈希) Zset(有序集合) geospatial hyperloglog bi ...

  7. Redis学习笔记(B站狂神说)(自己总结方便复习)

    Redis学习笔记B站狂神说 redis: 非关系型数据库 一.NoSQL概述 1.为什么要用Nosql 1.单机Mysql的年代 思考一下,这种情况下:整个网站的瓶颈是什么? 1.数据量如果太大,一 ...

  8. 菜鸟的redis学习总结

    菜鸟的redis学习总结 说明 一.Nosql和Mysql 二.Nosql常见类型及比较 三.简介 四.入门系列 (1)性能测试 (2)String类型 (3)List类型 (4)Set集合 (5)H ...

  9. Redis(学习笔记)

    Redis学习笔记 1.NoSQL数据库 1.1解决的问题 1.1.1解决CPU及内存压力 1.1.2解决IO压力 1.2NoSQL数据库概述 1.2.1什么是NoSQL数据库 1.2.2适用与不适用 ...

最新文章

  1. 如何通过域服务器推送安装文件,域环境推送exe程序并自动安装教程域环境推送exe程序并自动安装教程.pdf...
  2. 怎么让项目断开svn连接服务器,SVN断开与服务器连接
  3. 用java和汇编开发一个Hello World系统内核
  4. write up:web 实战2-注入--sql注入(手工注入详细版)
  5. oracle对sga统计信息不对,oracle 索引失效原因及解决方法
  6. Android学习第三天--事件监听器
  7. 【AI视野·今日Robot 机器人论文速览 第二十八期】Wed, 1 Dec 2021
  8. 垃圾回收算法与实现系列-锁在Java虚拟机中的实现和优化
  9. 2017.10.25 书柜的尺寸 失败总结
  10. 前端面试时面试官想要听到什么答案(关于一些Vue的问题)
  11. 林期苏曼属性标签编辑_标签打印软件如何打印指定日期
  12. 动态规划(树形DP):HDU 5886 Tower Defence
  13. 【优化调度】基于matlab遗传算法求解公交车调度优化问题【含Matlab源码 040期】
  14. 用MediaCreationTool做纯净版Windows 10系统U盘
  15. 2021华为杯数学建模B题完整思路+部分代码
  16. macBook笔记本音乐播放器没声音
  17. ubuntu18.04键盘背光灯以及Scroll Lock建失效
  18. 数据存储的各个发展阶段
  19. 充电慢、掉电快、续航短?这份电动车过冬指南请查收!
  20. 企业微信怎么统计客户数量

热门文章

  1. 半导体激光器的发展趋势
  2. 关于迅雷7登陆不上一直显示登录中或者登陆超时的解决办法。
  3. PS磨皮插件一键调色滤镜雅点修图宝典PS工笔画插件素材磨皮滤镜
  4. 【HTML爱心】这首歌写给你听,我想请你闭上眼睛,这首可能不太动听,但是我有足够的用心~
  5. 对口高考计算机网络知识点,对口高考计算机网络概述复习
  6. POJ 2987 Firing
  7. 2017年-李玉婷-MySQL基础(178集)免积分下载
  8. UML建模工具最近更新(2021年2月)(一)Astah、SIM、BOUML、Papyrus、drawio
  9. HI3518C、HI3518E、HI3516C 雄迈模组
  10. 百胜系统连接服务器失败,MySQL服务器无法在百胜升级后启动