redis学习 第三章 5种数据类型----hash类型
来源:互联网 发布:服务器运行java服务端 编辑:程序博客网 时间:2024/05/16 10:34
跟着Redis入门指南学习
第三章 5种数据类型----hash类型
3.3(散列类型)
redis采用几点结构以健值对的形式存储数据的,而散列类型(hash)的健值也是一种字典结构,其存储了字段和字段值的映射。但字段值只能是字符串,不支持其他数据类型。换句话说,散列类型不能嵌套其他的数据类型。一个散列类型健可以包含至多2^32 -1个字段。
提示:除了散列类型,redis的其他数据类型同样不支持数据类型嵌套。比如集合类型的每个元素都只能是字符串,而不能是另一个集合或者散列表等。
散列类型适合存储对象:使用对象类别和ID构成健名,使用字段表示的对象的属性,而字段值则存储属性值。例如要存储ID为2的汽车对象,可以分别使用名为color、name和price的3个字段来存储该汽车的颜色、名称和价格。
在关系数据库中如果要存储汽车对象,数据是以二维表的形式存储的,这就要所有的记录都拥有同样的属性,无法单独为某条几率增减属性,如果想为ID为1的汽车增加生产日期属性,就需要把数据表更改添加一个data属性,对于之前的数据data就是冗余的。可想而知当不同的记录需要不同的属性时,表的字段数量会越来越多以至于难以维护。而且当使用ORM将关系数据库中的对象实体映射成程序中的实体时,修改表的结构往往意味着要中断服务(重启网站程序)。为了防止这些问题,在关系数据库中存储这种半结构化数据还需要额外的表才行。
而redis的散列类型则不存在这个问题。redis并不要求每个健都依据此结构存储,我们完全可以自由的位任何健增减字段而不影响其他健。
3.3.2 命令
1.赋值与取值
hset key field valuehget key fielshmset key field value [field value ...]hmget key field [field ...]hgetall keyhset命令用来给字段赋值,而hget命令来获取字段的值,用法如下:
127.0.0.1:6379[1]> hset car price 500(integer) 1127.0.0.1:6379[1]> hset car price 666(integer) 0127.0.0.1:6379[1]> hget car price"666"127.0.0.1:6379[1]> hset car name bmw(integer) 1127.0.0.1:6379[1]> hget car name"bmw"hset命令的方便之处在于不区分插入和更新操作,这意味着修改数据时不用事先判断字段是否存在来决定要执行的是插入操作(insert)还是更新操作(update)。当执行的是插入时(即之前字段不存在)hset命令返回1,当执行的是更新操作时,返回的是0.当健本身不存在时,hset命令还会自动建立它。
提示:在redis中每个健都属于一个明确的数据类型,如通过hset命令建立的健是散列类型,通过set命令建立的健是字符串类型等。使用一种数据类型的命令操作另一种数据类型的健会提示错误:err operation against a key holding the wrong kind of value.
127.0.0.1:6379[1]> hmget car name price1) "bmw"2) "666"127.0.0.1:6379[1]> hmset car color blue data 2016OK127.0.0.1:6379[1]> hmget car name price color data1) "bmw"2) "666"3) "blue"4) "2016"127.0.0.1:6379[1]> hgetall car1) "price"2) "666"3) "name"4) "bmw"5) "color"6) "blue"7) "data"8) "2016"如果想获取健中所有字段和字段值却不知道健中有哪些字段时,应该使用hgetall命令,返回的结果是字段和字段值组成的列表,不是很直观,好在很多语言的redis客户端会将hgetall的返回结果封装成编程语言中的对象,处理起来就非常方便了。例如,在node.js中:
redis.hgetall("car",function(error,car){//hgetall方法的返回值被封装成了javaSript的对象 console.log(car.price); console.log(car.name);});
2.判断字段是否存在
hexists key field若果存在返回1,否则返回0。(如果健不存在也会返回0)。
127.0.0.1:6379[1]> hexists car model(integer) 0127.0.0.1:6379[1]> hexists car name(integer) 1127.0.0.1:6379[1]> hexists nocar name(integer) 0
3.字段不存在时赋值
hsetnx key field valuehsetnx命令与hset命令类似,区别在于如果字段已经存在,hsetnx命令将不执行任何操作。hsetnx命令是原子操作,不用担心竞态条件。
4.增加数字
hincrby key field incrementhincrby 与incrby命令类似,可以是字段值增加指定的整数,散列类型没有hincr命令,但可以通过hincrby key field 1 来实现。
127.0.0.1:6379[1]> hincrby ca price 200(integer) 200127.0.0.1:6379[1]> hget car price"666"127.0.0.1:6379[1]> hincrby car price 200(integer) 866127.0.0.1:6379[1]> hget ca price"200"如果健不存在,hincrby命令会自动建立该健并默认设置price 字段在执行命令前的值为0.命令的返回值是增值后的字段值。
5.删除字段
hdel key field [field ...]hdel 命令可以删除一个或多个字段,返回值是被删除的字段个数:
127.0.0.1:6379[1]> hdel car price name(integer) 2127.0.0.1:6379[1]> hdel car color name(integer) 1
3.3.4 命令拾遗
1.只获取字段名或字段值
hkeys keyhvals key
127.0.0.1:6379[1]> hkeys car1) "data"2) "name"3) "color"127.0.0.1:6379[1]> hvals car1) "2016"2) "bmw"3) "blue"2.获取字段数量
hlen key
127.0.0.1:6379[1]> hlen car(integer) 3
- redis学习 第三章 5种数据类型----hash类型
- redis学习 第三章 5种数据类型----String类型
- redis学习 第三章 5种数据类型----list类型
- redis学习 第三章 5种数据类型----set类型
- redis学习 第三章 5种数据类型
- redis学习 第三章 5种数据类型----sorted set类型
- redis的五种数据类型---hash类型
- redis五种数据类型学习笔记
- redis学习-5种数据类型和相关命令
- Redis学习--Hash类型
- redis操作以及5种数据类型string,hash,list,set,zset
- Redis的5种数据类型
- Redis的5种数据类型
- Redis五种数据类型
- 【Redis】五种数据类型
- redis 五种数据类型
- redis 五种数据类型
- Redis五种数据类型
- JavaScript在物联网中的应用
- CodeForces 368B Sereja and Suffixes
- hadoop笔记本
- Egit的merge合并冲突具体解决方法
- HTTP协议的八种方法简介
- redis学习 第三章 5种数据类型----hash类型
- 广告相关行业平台
- PHP后台 iOS上传文件
- 个人笔记【WM_CONCA()分组逗号拼接字段】
- Ext 设置panel内部的gridpanel的滚动条
- ListView的展开合并
- libvlc播放节目时,进行转录
- 深入理解面向对象编程中接口的实现
- LeetCode—415. Add Strings