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

Redis自学笔记:3.3入门-散列类型的更多相关文章

  1. Redis自学笔记:3.6入门-有序集合类型

    3.6有序集合类型 3.6.1介绍 在集合类型基础上,为集合中每个元素都关联了一个分数,故可以获得 分数最高(最低)的前N个元素,可以获得指定范围内的元素等 有序集合中每个元素不同,但它们的分数却可以 ...

  2. Redis自学笔记:3.4入门-列表类型

    3.4列表类型 3.4.1介绍 列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者 获得列表的某一片段. 优点:内部使用的是双向链表,所以向列表两端添加元素的时间复杂度为O(1 ...

  3. Redis学习笔记(五)散列进阶

    HEXISTS key_name key(检查键key是否存在) HKEYS key_name(获得散列的所有键) HVALS key_name(获得散列的所有值) HINCRBY key_name ...

  4. Redis自学笔记:3.5入门-集合类型

    3.5集合类型 3.5.1介绍 在集合中的每个元素都是不同的,且没有顺序 表3-4集合类型和列表类型的对比 - 集合类型 列表类型 存储内容 至多232-1个字符串 至多232-1个字符串 有序性 否 ...

  5. Redis自学笔记:3.1入门-热身

    第3章:入门 3.1热身 获取符合规则的键名列表:keys 匹配key 表3-1 glob风格通配符规则 符号 含义 ? 匹配一个字符 * 匹配任意个(包括0个)字符 [ ] 匹配括号间的任一字符,可 ...

  6. Redis自学笔记:3.2入门-字符串类型

    3.2字符串类型 实际上redis不只是数据库,更多的公司和团队将redis用作缓存和 队列系统 3.2.1介绍 字符串类型是redis最基本的数据类型,它能存储任何形式的字符串, 包括二进制数据.你 ...

  7. Redis自学笔记 --Hash、List、Set类型简述

    Hash类型                                                                                    hset key f ...

  8. Redis核心原理与实践--散列类型与字典结构实现原理

    Redis散列类型可以存储一组无序的键值对,它特别适用于存储一个对象数据. > HSET fruit name apple price 7.6 origin china 3 > HGET ...

  9. Redis常用命令入门2:散列类型

    散列命令 散列类型的键值其实也是一种字典解耦,其存储了字段和字段值的映射,但字段值只能是字符串,不支持其他数据类型,所以说散列类型不能嵌套其他的数据类型.一个散列类型的键可以包含最多2的32次方-1个 ...

随机推荐

  1. LeetCode(122):卖股票的最佳时机 II

    Easy! 题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参 ...

  2. kali linux宿主机和虚拟机互访实现方案

    1.攻防模拟中,将DVWA安装到自己的宿主机中,在kali Linux中通过sqlmap和其他工具启动嗅探攻击,需要配置网络.虚拟机采用桥接方式,并复制Mac地址状况. 2.查看各自系统下的IP地址. ...

  3. Gitbush笔记

    1.如果要想模拟浏览器发送get请求,就要使用Request对象,通过Request对象添加HTTP头,就可以伪装成浏览器. from urllib impor request req=request ...

  4. 第七周学习总结-C#

    2018年8月26日 这个周二突然得知另一位老师留的暑假作业,群文件里早就上传了,我居然一直没翻到那里,要不是同学问作业做完没,我可能开学就要“真●裸考”了

  5. Python中的xxx+=xxx和xxx=xxx+xxx一些区别及执行过程

    预知小知识: Python中的变量与其他语言稍有差异,如a = 10并不是直接在内存中创建一个变量a其值为10,而是在内存中创建一个a这个a指向这个10,在Python中所有牵扯到等号的均不是值赋值, ...

  6. Python - 去除list中的空字符

    list1 = ['122', '2333', '3444', '', '', None] a = list(filter(None, list1)) # 只能过滤空字符和None print(a) ...

  7. 如何保证Redis的高可用

    什么是高可用 全年时间里,99%的时间里都能对外提供服务,就是高可用 主备切换 在master故障时,自动检测,将某个slave切换为master的过程,叫做主备切换.这个过程,实现了Redis主从架 ...

  8. webpack学习笔记--配置总结

    从前面的配置看来选项很多,Webpack 内置了很多功能. 你不必都记住它们,只需要大概明白 Webpack 原理和核心概念去判断选项大致属于哪个大模块下,再去查详细的使用文档. 通常你可用如下经验去 ...

  9. c++ char数组形式的字符串 与输入输出

    1. c风格字符串,和strlen函数 #include "stdafx.h" #include <iostream> using std::cout; using s ...

  10. alpha冲刺5/10

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:冲刺5 团队部分 后敬甲(组长) 过去两天完成了哪些任务 文字描述 最近事情有点多,只是跟进了下进度,写了写博客 接下来 ...