NoSQL数据库(二)02-Redis数据类型——实践-散列类型命令之散列存储逻辑、获取id、修改缩略名

本文主要是介绍NoSQL数据库(二)02-Redis数据类型——实践-散列类型命令之散列存储逻辑、获取id、修改缩略名,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

NoSQL数据库(二)02-Redis数据类型——实践-散列类型命令之散列存储逻辑、获取id、修改缩略名

实践

刚才存储文章的例子,需要序列化和反序列化之后在进行读写。会造成2个问题:

  1. 会产生竞态, 2个客户端同时操作会冲突,最终只有一个属性被修改。没有原子化操作
  2. 每次修改或者读取都需要反序列化,消耗性能。

新增一个需求,一般文章都会有缩略名。比如文章的标题叫做"This is a great post",它的缩略名可以为"this-is-a-greate-post"。缩略名可以用于生成文章的地址栏或者其它用处。

使用散列改造

在这里插入图片描述

// 散列其实就是hash  hget hset
var redis = require('redis');
var client = new redis({
//一些配置
});// # 1. 文章的赋值
// # 自增的id 
var $post_id = client.incr('posts:count');
var $slug = 'hello-world';
var $title = 'hello world';
var $content = 'xxxxxxxxxxxxx';
var views = 0;
// # 文章的缩略名和id互相有一个引用来维持关系  slug.to.id
// # HSETNX 也是赋值  如果这个值已经存在 则返回0,并且赋值失败  反之返回1, 赋值成功
var isSlug = client.hsetnx(`slug.to.id ${$slug} ${$post_id}`);// # 1.通过散列去存储文章
if(isSlug === 0) {client.exit();
} else {client.hmset(`post:${$post_id} title ${$title} content ${$content} views ${$views}`)
}// # 2. 读取文章
var postID = client.hget('slug.to.id $slug'); 
if (!postID) {client.exit('文章不存在')
} else {var post = client.hgetall(`post:${postID}`, (err, data) => {console.log(data)})
}// # 3.修改缩略名
// # 加入你要给id=42的文章  修改缩略名
var newSlug = 'xxx';
var isSlugExit = client.hsetnx(`slug.to.id ${newSlug} 42`) if(isSlugExit === 0) {exit('缩略名已存在,请换其它')
} else {var oldSlug = client = client.hget(`post:42 slug`);client.hset(`post:42 slug ${newSlug}`);client.hdel(`slug.to.id ${$oldSlug}`);
}
命令补充
  1. 只获取字段名或字段值

HKEYS key

HVALS key

  1. 获得字段数量

HLEN key

实例

hash_demo.js

var data = {a: 1,b: 2
}// a做了一个操作   data.a = 10;
// b 也做了一个操作 data.b = 20;// "{a: 1, b: 2}"// a  "{a: 10, b: 2}"
// b  "{a: 1, b: 20}"var redis = require('redis');
var client = new redis({// option
});var $post_id =  client.incr('post:count');var $slug = 'hello-world';
var $title = 'hello world';
var content = 'xxxxxxxxxxxxxx';
var $views = 0;// 存储逻辑
// 生成文章之前,校验缩略名是否可用    hsetnx, 属性存在则修改失败,反之成功
// 用关系性数据库 会额外建一张表来存储  文章的ID  和 缩略名直接的映射关系 。 散列 类型 叫做 slug.to.ld 专门存储 文章的ID  和 缩略名
var isSlug = client.hsetnx(`slug.to.id ${$slug} $post_id`);  // 缩略名和id就能一一对应if (isSlug === 0) {client.exit('缩略名已存在');
} else {  // 散列存储逻辑client.hmset(`post:${$post_id} title ${$title} content ${$content} views ${$views}`);
}// 读取
// 1. 获取idvar postID = client.hget(`slig.to.id ${$slug}`);if (!postID) {client.exit('文章不存在')
} else {var post = client.hgetall(`post:${$post_id}`, (err, data) => { //node会封装console.log(data);});
}// 修改缩略名var newSlug = 'xxxxx';
var isSlugExit = client.hsetnx(`slug.to.id ${newSlug} 42`);if(!isSlugExit) {client.exit('缩略名已经存在');
} else {var olgSlug = client.hget(`post:42 slug`);  // 先获取旧的client.hset(`post:42 slug ${newSlug}`);  // 赋值新的client.hdel(`slug.to.id ${olgSlug}`);}

这篇关于NoSQL数据库(二)02-Redis数据类型——实践-散列类型命令之散列存储逻辑、获取id、修改缩略名的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/642253

相关文章

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

MySQL MCP 服务器安装配置最佳实践

《MySQLMCP服务器安装配置最佳实践》本文介绍MySQLMCP服务器的安装配置方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下... 目录mysql MCP 服务器安装配置指南简介功能特点安装方法数据库配置使用MCP Inspector进行调试开发指

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

SQLite3命令行工具最佳实践指南

《SQLite3命令行工具最佳实践指南》SQLite3是轻量级嵌入式数据库,无需服务器支持,具备ACID事务与跨平台特性,适用于小型项目和学习,sqlite3.exe作为命令行工具,支持SQL执行、数... 目录1. SQLite3简介和特点2. sqlite3.exe使用概述2.1 sqlite3.exe

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w