zoukankan      html  css  js  c++  java
  • Redis自学笔记:3.3入门-散列类型

    3.3散列类型

    3.3.1介绍

    • 散列类型不能嵌套其他数据类型,一个散列类型可以包含至多232-1个字段
      散列类型适合存储对象:使用对象类别和ID构成键名,使用字段表示对象的数据,
      而字段值则存储属性值.

    图3-5使用散列类型存储汽车对象结构图

    字段 字段值
    car:2 color 白色
    car:2 name 奥迪
    car:2 price 90万

    3.3.2命令

    1. 赋值与取值

      hset key field value
      单个字段赋值
      hget key field
      单个字段取值
      hmset key field value [field value ...]
      多个字段赋值
      hmget key field [field ...]
      多个字段取值
      hgetall key
      获取所有字段和字段值

          127.0.0.1:6379> hset car price 500
          1
          127.0.0.1:6379> hset car name BMW
          1
          127.0.0.1:6379> hget car name
          BMW
          127.0.0.1:6379> hget car price
          500
      
      • hset不区分插入和更新操作(修改数据时不用判断字段是插入还是更新)
        当执行的是插入操作,hset命令返回1.当执行的更新操作是,hset命令返回0.
      • 在redis中,每个键都属于一个明确的数据类型.当需要同时设置多个字段的
        值时,可以使用hmset.
          127.0.0.1:6379> hmset car name BMW price 500
          OK
          127.0.0.1:6379> hmget car name price
          BMW
          500
      
          127.0.0.1:6379> hgetall car
          name
          BMW
          price
          500
      
    2. 判断字段是否存在
      hexists key field

          127.0.0.1:6379> hexists car name
          1
      
    3. 当字段不存在时赋值
      hsetnx key field value

    • 如果字段已经存在,hsetnx命令将不执行任何操作
      127.0.0.1:6379> hsetnx car color red
      1
      127.0.0.1:6379> hget car color
      red
      127.0.0.1:6379> hsetnx car color white
      0
      127.0.0.1:6379> hget car color
      red
      
    1. 增加数字
      hincrby key field increment

          127.0.0.1:6379> hget person score
          60
      
    2. 删除字段
      hdel key field [field...]

          127.0.0.1:6379> hmset car name BWM color red
          OK
          127.0.0.1:6379> hgetall car
          name
          BWM
          color
          red
          127.0.0.1:6379> hdel car color
          1
          127.0.0.1:6379> hgetall car
          name
          BWM
      

    3.3.3实践

    1. 存储文章数据
      3.2.3节介绍了将文章对象序列化后使用一个字符串类型键储存,可是这种方法
      无法提供对单个字段的原子读写操作,从而产生竞态条件,如两个客户端同时获
      得并反序列化某个文章的数据,然后分别修改不同的属性后存入,显然后存入的
      数据会覆盖之前的数据,最后只会有一个属性被修改.并且即使只需要修改文章
      标题,程序也不得不将文章内容在内所有文章数据取出并反序列化,比较消耗资源

      • 竞态条件(race condition),从多进程间通信的角度来讲,是指两个或多个
        进程对共享的数据进行读或写的操作时,最终的结果取决于这些进程的执行顺序。

      使用多个字符串类型来存储一篇文章数据:
      图3-6使用多个字符串类型存储一个对象

      键值
      post:42:title 第一篇日志
      post:42:author 小白
      post:42:time 2012年9月21日
      post:42:content 今天是星期五...
      • 优点:无论获取还是修改文章数据,都可以只对某一属性进行操作,十分方便

      使用一个散列类型键存储一个对象:
      图3-7使用散列类型键存储一个对象

      字段 字段值
      post:42 --> title --> 第一篇日志
      post:42 --> author --> 小白
      post:42 --> time --> 2012年9月21日
      post:42 --> content --> 今天是星期五...
      • 优点:比上图方法看起来更加直观,也容易维护,而且同样的数据散列类型往往比字符串类型更加节约空间
    2. 存储文章缩写名
      我们可以使用一个散列类型的键slug.to.id来存储文章缩写名和ID之间的映射关系
      这样我们就可以使用hexists来判断缩写名是否存在,使用hget命令来获取缩写名对应的文章的ID.
      现在发布文章可以修改成如下伪代码:

        $postID = incr posts:count
        判断用户输入的slug(文章缩写名)是否可用,如果可用则记录
        $isSlugAvailable = hsetnx slug.to.id,$slug,$postID
        if $isSlugAvailable is 0
        # slug已经用过了,需要提示用户更换slug
        # 这里为了演示方便直接退出
            exit
        hmset post:$postID,title,$title,content,$content,slug,$lug,...
    

    用户访问时获取文章ID伪代码:

        $postID = hget slug.to.id,$slug
        if not $postID
            print 文章不存在
            exit
        $post = hgetall post:$postID
        print 文章标题:$post.title
    

    如果修改文章的缩略名一定要修改slug.to.id键对应的字段,伪代码:

        # 判断新的slug是否可用
        $isSlugAvailable = hsetnx slug.同.id,$newSlug,42
        if $isSlugAvailable is 0
            exit
        # 获得旧的缩略名
        $oldSlug = hget post:42,slug
        # 设置新的缩略名
        hset post: 42 ,slug,$newSlug
        # 删除旧的缩略名
        hdel slug.to.id,$oldSlug
    

    3.3.4命令拾遗

    1. 只获取字段名或字段值
      hkeys key : 获取键中所有字段
      hvals key : 获取键中所有字段值
       127.0.0.1:6379> hmset car color red name BWM
       OK
       127.0.0.1:6379> hkeys car
       color
       name
       127.0.0.1:6379> hvals car
       red
       BWM
      
    2. 获取字段数量 : hlen key
       127.0.0.1:6379> hlen car
       2
      
  • 相关阅读:
    TCP三次握手过程
    btree b+tree 的关系
    volatile和指令重排序
    事务一致性理解 事务ACID特性的完全解答
    JVM 详解
    java 并发 详解
    socker TCP UDP BIO NIO
    mysql 主从复制 配置
    身份证格式验证 方法
    分布式事务 XA 两段式事务 X/open CAP BASE 一次分清
  • 原文地址:https://www.cnblogs.com/wangbaby/p/10206896.html
Copyright © 2011-2022 走看看