Redis 学习 - 06 漂流瓶案例
案例介绍
微信有几亿的用户群,某一时刻可能有几千上万人同时在玩漂流瓶,对于这种高并发数据量小的服务,使用 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 漂流瓶案例相关推荐
- redis系列:通过队列案例学习list命令 1
前言 这一篇文章将讲述Redis中的list类型命令,同样也是通过demo来讲述,其他部分这里就不在赘述了. 项目Github地址:https://github.com/rainbowda/learn ...
- Redis学习之秒杀案例
记录每次学习的过程,总结学习的内容,希望能给到自己和别人帮助. Redis学习之秒杀案例 基础设计思路 1.uid和prodid的非空判断 2.连接redis 3.拼接key,包括库存的和成功秒杀的用 ...
- 关于交友网站的开发分享(漂流瓶功能)
前言 一件事情在开头总是想的很美好,然而事实总会跟你对着干.在网站搭建的过程中遇到了无数多的前端页面设计bug,我在此之前也可以算的上是个前端小小白,很是无奈,不过还是要在这里感谢其他工作室里帮我解决 ...
- redis学习与入门~~~
redis学习与入门~~~ 一. Redis 简介: 通常而言目前的数据库分类有几种,包括 SQL/NSQL,,关系数据库,键值数据库等等,分类的标准也不1,Redis本质上也是一种键值数据库的,但它 ...
- 微信表情暂停使用,漂流瓶功能彻底再见!
作者 | 胡巍巍 出品 | CSDN(ID:CSDNnews) 清明前夕深夜搞事情,怕也只有微信了. 今天(4月4日)凌晨00:36分,腾讯微信团队在微博发通知称: "4月4日零时起,微信表 ...
- Redis学习之旅--Redis的数据类型你都知道吗?
Redis学习之旅--数据类型 Redis-Key String(字符串) list(列表) Set(集合) Hash(哈希) Zset(有序集合) geospatial hyperloglog bi ...
- Redis学习笔记(B站狂神说)(自己总结方便复习)
Redis学习笔记B站狂神说 redis: 非关系型数据库 一.NoSQL概述 1.为什么要用Nosql 1.单机Mysql的年代 思考一下,这种情况下:整个网站的瓶颈是什么? 1.数据量如果太大,一 ...
- 菜鸟的redis学习总结
菜鸟的redis学习总结 说明 一.Nosql和Mysql 二.Nosql常见类型及比较 三.简介 四.入门系列 (1)性能测试 (2)String类型 (3)List类型 (4)Set集合 (5)H ...
- Redis(学习笔记)
Redis学习笔记 1.NoSQL数据库 1.1解决的问题 1.1.1解决CPU及内存压力 1.1.2解决IO压力 1.2NoSQL数据库概述 1.2.1什么是NoSQL数据库 1.2.2适用与不适用 ...
最新文章
- 如何通过域服务器推送安装文件,域环境推送exe程序并自动安装教程域环境推送exe程序并自动安装教程.pdf...
- 怎么让项目断开svn连接服务器,SVN断开与服务器连接
- 用java和汇编开发一个Hello World系统内核
- write up:web 实战2-注入--sql注入(手工注入详细版)
- oracle对sga统计信息不对,oracle 索引失效原因及解决方法
- Android学习第三天--事件监听器
- 【AI视野·今日Robot 机器人论文速览 第二十八期】Wed, 1 Dec 2021
- 垃圾回收算法与实现系列-锁在Java虚拟机中的实现和优化
- 2017.10.25 书柜的尺寸 失败总结
- 前端面试时面试官想要听到什么答案(关于一些Vue的问题)
- 林期苏曼属性标签编辑_标签打印软件如何打印指定日期
- 动态规划(树形DP):HDU 5886 Tower Defence
- 【优化调度】基于matlab遗传算法求解公交车调度优化问题【含Matlab源码 040期】
- 用MediaCreationTool做纯净版Windows 10系统U盘
- 2021华为杯数学建模B题完整思路+部分代码
- macBook笔记本音乐播放器没声音
- ubuntu18.04键盘背光灯以及Scroll Lock建失效
- 数据存储的各个发展阶段
- 充电慢、掉电快、续航短?这份电动车过冬指南请查收!
- 企业微信怎么统计客户数量
热门文章
- 半导体激光器的发展趋势
- 关于迅雷7登陆不上一直显示登录中或者登陆超时的解决办法。
- PS磨皮插件一键调色滤镜雅点修图宝典PS工笔画插件素材磨皮滤镜
- 【HTML爱心】这首歌写给你听,我想请你闭上眼睛,这首可能不太动听,但是我有足够的用心~
- 对口高考计算机网络知识点,对口高考计算机网络概述复习
- POJ 2987 Firing
- 2017年-李玉婷-MySQL基础(178集)免积分下载
- UML建模工具最近更新(2021年2月)(一)Astah、SIM、BOUML、Papyrus、drawio
- HI3518C、HI3518E、HI3516C 雄迈模组
- 百胜系统连接服务器失败,MySQL服务器无法在百胜升级后启动