实例讲解redis的hash散列类型

hash散列类型简介

image.png

命令

行为

HDEL key field [field ...]

删除key 中的一个或多个指定域

HEXISTS key field

查看key 中,给定域 field 是否存在

HGET key field

返回key 中给定域 field 的值

HGETALL key

返回key 中,所有的域和值

HINCRBY key field increment

为field 的值加上增量(可以为负数)

HINCRBYFLOAT key field increment

加上浮点数增量

HKEYS key

返回key 中的所有域

HLEN key

返回key 中域的数量

HMGET key field [field ...]

返回key 中,一个或多个给定域的值

HMSET key field value [field value ...]

同时设置多个 field-value

HSET key field value

将key 中的域 field 的值设为 value

HSETNX key field value

当field不存在时,将field设置为value

HVALS key

返回所有值

HSTRLEN key field

返回相关field的字符串长度

了解更多相关命令

HSET 不区分插入和更新操作,修改数据时不用事先判断否存在,当执行的是插入操作时,返回1,执行的是更新操作时,返回0,当键不存在时,会自动建立

实例

需求

用hash表的post:postid键记录文章的字段:title(标题), content(内容), slug(缩略名)。其中slug不可重复,因此另外以slug.to.id为键记录slug与postid关联

根据这两个hash结构,实现以下三个功能:1.发布文章 2.以slug为条件读取文章 3.更改文章的slug

  • 发布文章
public function writePost(Request $requset, $title, $content, $slug) {
    $title = $requset->param('title');
    $content = $requset->param('content');
    $slug = $requset->param('slug');
    // 获取文章自增id
    $postId = $this->redis->incr('posts:count');
    // 判断文章缩略名是否已存在
    $isSlugAvailable = $this->redis->hsetnx("slug.to.id", $slug, $postId);
    if (!$isSlugAvailable) { // 已存在
        echo $slug . "-文章缩略名已用过,请更换!";
    } else {
        $data = array(
            'title' => $title,
            'content' => $content,
            'slug' => $slug,
        );
        $this->redis->hmset("post:{$postId}", $data);
        echo "文章发布成功,id为:{$postId}";
    }
}
  • 以slug为条件读取文章
public function getPost(Request $requset, $slug) {
    $slug = $requset->param('slug');
    $postId = $this->redis->hget('slug.to.id', $slug);
    if ($postId) {
        $postData = $this->redis->hgetall("post:{$postId}");
        var_dump($postData);
        exit;
    } else {
        echo '该文章不存在!';
    }
}
  • 更改文章的slug
public function updateSlug(Request $requset, $slug, $id) {
    $slug = $requset->param('slug');
    $postId = $requset->param('id');
    $isSlugAvailable = $this->redis->hsetnx('slug.to.id', $slug, $postId);
    if (!$isSlugAvailable) {
        echo '该缩略名已存在!';
    } else {
        // 获取旧的缩略名
        $oldSlug = $this->redis->hget("post:{$postId}", 'slug');
        // 设置新的缩略名
        $this->redis->hset("post:{$postId}", 'slug'  , $slug);
        // 删除旧的缩略名
        $this->redis->hdel("slug.to.id", $oldSlug);
    }
}

源码下载

源码下载地址

示例代码路径:thinkphp5\application\redis\controller\HashType.php

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IMWeb前端团队

简洁的javascript编码(一)--变量、函数

本文作者:IMWeb jaychen 原文出处:IMWeb社区 未经同意,禁止转载 ? 一、变量 使用语义化的变量名称 Bad cons...

2169
来自专栏AlgorithmDog的专栏

在 Spark 中实现单例模式的技巧

单例模式是一种常用的设计模式,但是在集群模式下的 Spark 中使用单例模式会引发一些错误。我们用下面代码作例子,解读在 Spark 中使用单例模式...

2395
来自专栏牛肉圆粉不加葱

[Spark源码剖析]Task的调度与执行源码剖析

一个Spark Application分为stage级别和task级别的调度,stage级别的调度已经用[DAGScheduler划分stage]和[DAGSc...

742
来自专栏跟着阿笨一起玩NET

C# ini文件操作【源码下载】

来源:http://www.cnblogs.com/polk6/p/6052908.html

524
来自专栏Python小屋

IDAPython精彩编程(1)

IDAPython是运行于交互式反汇编器IDA的插件,用于实现IDA的Python编程接口。IDA在逆向工程领域具有广泛的应用,尤其是二进制文件静态分析...

3636
来自专栏流媒体

Json海量数据解析Json海量数据解析

​ 在android开发中,app和服务器进行数据传输时大多数会用到json。在解析json中通常会用到以下几种主流的解析库:jackson、gson、fa...

742
来自专栏java一日一条

50个常见的 Java 错误及避免方法(第三部分)

当我们尝试调用带有错误参数的Java代码时,通常会产生此Java错误消息(@ghacksnews):

883
来自专栏坚毅的PHP

redis学习笔记

摘录些nosqlfans上看的资源(http://blog.nosqlfan.com/html/3537.html),用了一年了,只会安装、启动和get set...

35610
来自专栏博岩Java大讲堂

Java日志体系(slf4j)

4656
来自专栏张善友的专栏

MongoDB 聚合管道(Aggregation Pipeline)

管道概念 POSIX多线程的使用方式中, 有一种很重要的方式-----流水线(亦称为“管道”)方式,“数据元素”流串行地被一组线程按顺序执行。它的使用架构可参考...

19810

扫码关注云+社区