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项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

Redis实现延迟任务的三种方法详解

《Redis实现延迟任务的三种方法详解》延迟任务(DelayedTask)是指在未来的某个时间点,执行相应的任务,本文为大家整理了三种常见的实现方法,感兴趣的小伙伴可以参考一下... 目录1.前言2.Redis如何实现延迟任务3.代码实现3.1. 过期键通知事件实现3.2. 使用ZSet实现延迟任务3.3

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Pydantic中Optional 和Union类型的使用

《Pydantic中Optional和Union类型的使用》本文主要介绍了Pydantic中Optional和Union类型的使用,这两者在处理可选字段和多类型字段时尤为重要,文中通过示例代码介绍的... 目录简介Optional 类型Union 类型Optional 和 Union 的组合总结简介Pyd

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Redis分片集群的实现

《Redis分片集群的实现》Redis分片集群是一种将Redis数据库分散到多个节点上的方式,以提供更高的性能和可伸缩性,本文主要介绍了Redis分片集群的实现,具有一定的参考价值,感兴趣的可以了解一... 目录1. Redis Cluster的核心概念哈希槽(Hash Slots)主从复制与故障转移2.

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数