当前位置:网站首页 > 数据科学与大数据 > 正文

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. 获取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、修改缩略名的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • NoSQL数据库(二)03-Redis数据类型——列表类型之介绍、命令-向列表两端增加元素、从列表两端弹出元素、获取列表中元素的个数、删除列表中指定的值2024-11-30 19:09:09
  • NoSQL数据库(二)04-Redis数据类型——集合类型之介绍、命令-增加和删除元素、获得集合中的所有元素、判断元素是否在集合中、集合间运算2024-11-30 19:09:09
  • NoSQL数据库(二)06——redis总结之发展、特点、安装、操作 & 数据类型之字符串数据类型、散列、列表、集合、有序集合2024-11-30 19:09:09
  • NoSQL数据库(三)01-Redis进阶与实战——redis事务命令与错误处理、事务中的watch命令2024-11-30 19:09:09
  • NoSQL数据库(三)02-Redis进阶与实战——EXPIRE命令设置过期时间-实现定期检测删除过期数据 & EXPIRE实现和优化访问服务器频率限制2024-11-30 19:09:09
  • NoSQL数据库(二)01-Redis数据类型——字符串类型之赋值与取值、递增数字、增加指定浮点数、向尾部追加值、获取字符串长度、设置键值 & 散列类型命令之赋值与取值、获取键值、删除字段、增加数字2024-11-30 19:09:09
  • NoSQL数据库(一)——redis的发展和特点 & Redis安装和配置文件redis.conf & redis命令行客户端2024-11-30 19:09:09
  • Node学习(九)062-管理系统之登录和注册-使用验证码——验证码插件-svg-captcha & 前端生成动态验证码图片 & 服务端验证验证码数据2024-11-30 19:09:09
  • Node学习(九)05-管理系统之英雄列表分页——分页的sql查询语句 & 服务端get接口写法、ajax请求数据之get请求写法 & Math.ceil()函数-返回大于或等于一个给定数字的最小整数2024-11-30 19:09:09
  • Node学习(九)04-管理系统之删除英雄——ajax请求数据之get请求写法完成删除、remove()移除DOM元素 & 服务端之完成删除的接口-sql中的delete语句2024-11-30 19:09:09
  • 全屏图片