实例讲解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 条评论
登录 后参与评论

相关文章

来自专栏一个会写诗的程序员的博客

Spring Reactor 项目核心库Reactor Core

Non-Blocking Reactive Streams Foundation for the JVM both implementing a Reactiv...

2182
来自专栏张善友的专栏

Silverlight + Model-View-ViewModel (MVVM)

     早在2005年,John Gossman写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expr...

2978
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

4868
来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

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

c#实现打印功能

2782
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4035
来自专栏java 成神之路

使用 NIO 实现 echo 服务器

4667
来自专栏C#

DotNet加密方式解析--非对称加密

    新年新气象,也希望新年可以挣大钱。不管今年年底会不会跟去年一样,满怀抱负却又壮志未酬。(不过没事,我已为各位卜上一卦,卦象显示各位都能挣钱...)...

4918
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

5486
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

2717

扫码关注云+社区