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命令
赋值与取值
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
- hset不区分插入和更新操作(修改数据时不用判断字段是插入还是更新)
判断字段是否存在
hexists key field
127.0.0.1:6379> hexists car name
1
当字段不存在时赋值
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
增加数字
hincrby key field increment
127.0.0.1:6379> hget person score
60
删除字段
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实践
存储文章数据
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 --> 今天是星期五... - 优点:比上图方法看起来更加直观,也容易维护,而且同样的数据散列类型往往比字符串类型更加节约空间
- 竞态条件(race condition),从多进程间通信的角度来讲,是指两个或多个
存储文章缩写名
我们可以使用一个散列类型的键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命令拾遗
- 只获取字段名或字段值
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
- 获取字段数量 :
hlen key
127.0.0.1:6379> hlen car
2
Redis自学笔记:3.3入门-散列类型的更多相关文章
- Redis自学笔记:3.6入门-有序集合类型
3.6有序集合类型 3.6.1介绍 在集合类型基础上,为集合中每个元素都关联了一个分数,故可以获得 分数最高(最低)的前N个元素,可以获得指定范围内的元素等 有序集合中每个元素不同,但它们的分数却可以 ...
- Redis自学笔记:3.4入门-列表类型
3.4列表类型 3.4.1介绍 列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者 获得列表的某一片段. 优点:内部使用的是双向链表,所以向列表两端添加元素的时间复杂度为O(1 ...
- Redis学习笔记(五)散列进阶
HEXISTS key_name key(检查键key是否存在) HKEYS key_name(获得散列的所有键) HVALS key_name(获得散列的所有值) HINCRBY key_name ...
- Redis自学笔记:3.5入门-集合类型
3.5集合类型 3.5.1介绍 在集合中的每个元素都是不同的,且没有顺序 表3-4集合类型和列表类型的对比 - 集合类型 列表类型 存储内容 至多232-1个字符串 至多232-1个字符串 有序性 否 ...
- Redis自学笔记:3.1入门-热身
第3章:入门 3.1热身 获取符合规则的键名列表:keys 匹配key 表3-1 glob风格通配符规则 符号 含义 ? 匹配一个字符 * 匹配任意个(包括0个)字符 [ ] 匹配括号间的任一字符,可 ...
- Redis自学笔记:3.2入门-字符串类型
3.2字符串类型 实际上redis不只是数据库,更多的公司和团队将redis用作缓存和 队列系统 3.2.1介绍 字符串类型是redis最基本的数据类型,它能存储任何形式的字符串, 包括二进制数据.你 ...
- Redis自学笔记 --Hash、List、Set类型简述
Hash类型 hset key f ...
- Redis核心原理与实践--散列类型与字典结构实现原理
Redis散列类型可以存储一组无序的键值对,它特别适用于存储一个对象数据. > HSET fruit name apple price 7.6 origin china 3 > HGET ...
- Redis常用命令入门2:散列类型
散列命令 散列类型的键值其实也是一种字典解耦,其存储了字段和字段值的映射,但字段值只能是字符串,不支持其他数据类型,所以说散列类型不能嵌套其他的数据类型.一个散列类型的键可以包含最多2的32次方-1个 ...
随机推荐
- python(4): regular expression正则表达式/re库/爬虫基础
python 获取网络数据也很方便 抓取 requests 第三方库适合做中小型网络爬虫的开发, 大型的爬虫需要用到 scrapy 框架 解析 BeautifulSoup 库, re 模块 (一) r ...
- bzoj2973转移矩阵构造法!
/* 构造单位矩阵(转移矩阵) 给定n*m网格,每个格子独立按照长度不超过6的操作串循环操作 对应的操作有 0-9:拿x个石头到这个格子 nwse:把这个格子的石头推移到相邻格子 d:清空该格石子 开 ...
- 第五周学习总结-HTML5
2018年8月12日 暑假第五周,我把HTML剩余的一些标签和用法看完了并学了一些HTML5的标签及用法. HTML5比HTML多了一些元素,也删去了一些元素. HTML5新增元素 图形元素 < ...
- RabbitMQ中客户端的Channel类里各方法释义
// The contents of this file are subject to the Mozilla Public License // Version 1.1 (the "Lic ...
- CSS3D写3d画廊滚动
CSS样式表 *{ margin: 0; padding: 0; } .wrapper{ width: 800px; height: 600px; background: #87CEEB; margi ...
- 饮冰三年-人工智能-Python-16Python基础之迭代器、生成器、装饰器
一:迭代器: 最大的特点:节省内存 1.1 迭代器协议 a:对象必须提供一个next方法, b:执行方法要么返回迭代中的下一项,要么抛弃一个Stopiteration异常, c:只能向后不能向前. 1 ...
- 删除Apache服务的命令
转到\Apache24\bin目录下,使用cmd命令sc delete apache2.2
- python---数学表达式的分析树实现
先走一遍, 前面很多知道点,都串起来了. # coding = utf-8 # 使用列表实现栈的功能 class Stack: def __init__(self): self.items = [] ...
- python---用链表结构实现有序和无序列表的几个功能
只是看看套路,没有深入练习. 如果真要自己写,可以基于此类. 但其实,在普通使用中,这样实现的性能,并没有python原生的列表性能好. 因为python原生列表的功能,是基于数组作扩展实现的. # ...
- Hadoop集群最迅速的配置免密码登陆方法
1:多台机器互相免密登陆的思路(默认你的linux操作系统已经安装好ssh): 第一步:在各自的机器上面生成密钥: 在第1台机器上生产一对钥匙: ssh-keygen -t rsa 在第2台机器上生产 ...