NoSQL数据库(二)02-Redis数据类型——实践-散列类型命令之散列存储逻辑、获取id、修改缩略名
实践
刚才存储文章的例子,需要序列化和反序列化之后在进行读写。会造成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}`); }
命令补充
- 只获取字段名或字段值
HKEYS key
HVALS key
- 获得字段数量
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. 获取id var 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、修改缩略名的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/sjkxydsj/10810.html