实例讲解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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容