Redis专题(二)——Redis数据类型(1)

Redis专题(二)——Redis数据类型(1)

(原创内容,转载请注明来源,谢谢)

一、概述

Redis是一种Key-Value类型的数据库,属于非关系型数据库,NoSQL的一种。Redis共有5种数据类型:字符串(string)、散列(hash)、列表(list)、集合(set)、有序集合(zset)。

1、通配符

Redis支持部分通配符,包括?、*、[]、\x,和正则表达式一致,?表示匹配0或1个,*匹配任意个,[]匹配框内的任意一个内容,\x转义,例如\?表示匹配?。

2、获取键 KEYS

当要获取键值时,可以用KEYS* 获取所有的键,也可以用KEYS a*获取所有a开头的键。该方法会遍历所有的键,影响性能,不建议使用。

3、判断键是否存在 EXISTS

如 EXISTS test,判断test键是否存在,存在返回整数1,不存在返回0。

4、删除键 DEL

DELtest,如果test存在,则删除,返回1;如果不存在,则返回0。

该命令不支持通配符,因此要删除多个键时,可以在linux命令行下,通过管道符的方式获取与删除,例如redis-cli KEYS “user*” | xargs redis-cli DEL。其中xargs是将管道符前面的命令的执行结果作为参数传给xargs后面的命令。也可以使用redis-cli DEL “user*”的方式删除。

5、获取键的数据类型 TYPE

TYPEtest 可以获取test键的数据类型,返回值即上述五种数据类型中的一种。

6、原子性

redis的所有命令都是原子性的,例如自增命令incr,当并发调用incr对某个key的value设置自增,只会增加一次。其他命令也是如此。

7、存储方式

redis存储元素都是用hash的方式存储,将每个键用hash进行计算后,存储在hash(key)的位置,每个位置即为一个bucket。当hash(key1)和hash(key2)相同时,会采用链表的方式,将key1和key2都存储在同一个bucket的结果中,bucket根路径指向key1,key1再指向key2。

二、字符串类型(String)

字符串是redis的最基本数据类型,其他的数据类型可以看作是各种方式把字符串集合在一起的类型。字符串的一个键允许存储512MB的值,因此可以存放绝大多数的内容。

1、使用方式

赋值:SET keyvalue,给key赋值为value。获取:GET key。当get不存在的键,会返回(nil)。

用PHP连接redis,并接收命令行的参数,使用set和get操作redis,如下:

<?php  
$redis = new Redis();
$redis->pconnect('127.0.0.1', 6379);
$name = $argv[1];
$redis->set('test:1:name', $name);
echo $redis->get('test:1:name');
echo PHP_EOL;

2、递增数字

INCRkey,当key对于的value是数字时自增1,否则会报error。当key没有设定value时,默认是0,所以执行INCR会变成1。

redis中的操作都是都是原子操作,因此当有多个客户端并发对某个键使用INCR时,最后的结果也仅加1次,不会出现多次加的情况。

3、实现文章访问量统计

给每篇文章设置一个名字,名字为article:id:page.view,表示文章的id中某个页面的访问量。

1)id可以选用文章在数据库(如mysql)中的id。如果文章不用数据库存储,而用redis,则也可以自制自增的id。自增id的设置方法为,新建一个字段为articles:count,初始值为1,每有一篇文章要计算时,就把这个值INCR,返回的结果就是文章的id。

2)当要用redis存储文章标题、内容等信息时,需要将文章的各类内容存储在数组中,通过PHP序列化后进行存储,取出则同样是反序列化后使用。

4、字符串相关其他命令

1)增加指定整数:INCRBY、自减一:DECR、减少指定整数:DECRBY、增加浮点数:INCRBYFLOAT。

2)尾部追加内容:APPEND、获取串长度:STRLEN。

3)同时获取/设置多个值:MGETkey1 key2…. ,MSET key1 value1 key2 value2…

4)位操作:SETBIT ival、GETBIT,获取或者操作变量的第i位,由于是二进制操作,因此值只有0或1。此方法用于获取或设置数量较小的内容时,效率极高,如性别、状态等,只有几个数字的可能的情况,用此方法比较好。

三、散列类型(Hash)

散列存储了字段和字段值的映射,即每个key对应的值仍是field =>value的形式,每个key可以对应多个field =>value形式的内容,最多支持232-1。但是字段值只能是string,不能是其他类型,即不支持嵌套。

redis的每种类型都只支持字符串,不支持类型的嵌套。

1、设置与获取

1)单次单个:HGETkey field、HSET key field value

2)单次多个:HMGETkey field1 field2… 、HMSET key field1 value1 field2 value2…

3)获取某个key的全部:HGETALL,返回的是field1、value1、field2、value2…,不是很直观,但是很多语言都已经将结果封装。

在PHP中,$redis->hgetall(key)会返回key对应的field=>value的一个二维数组。

但是,当字段数量非常多时,由于redis是单线程的,hgetall要遍历某个key所有的field和value,因此会发生阻塞,甚至可能是服务器宕机。

因此,可以将key和field另外进行存储。

2、判断

1)field是否存在:HEXISTSkey field

2)field不存在时赋值:HSETNXkey field value,由于具有原子性,当多个hsetnx命令同时发出时,只会执行第一个命令,后面的命令由于已经有值了所以不会再次设置。

3)增加数字:HINCRBYkey field increment

4)删除field:HDEL keyfield1 field2…

3、存储文章数据

当使用序列化将文章的标题、内容等存储,反序列化取出时,存在的问题由于反序列化以及修改的操作不是在redis执行,不是原子性,因此并发情况下有可能发生问题。另外,反序列化则如果只修改标题也需要取出全部内容,浪费资源。

使用散列可以很好解决此问题,存储的方法是关键字设置为article:id,然后里面的field分别是title、content等,要修改也可以用HSET进行修改。

4、其他命令

1)部分获取:只获取field——HKEYS key,只获取value——HVALS key,获取field的数量:HLEN key

——written by linhxx 2017.08.04

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-08-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Petrichor的专栏

tensorflow: 对variable_scope进行reuse的两种方法

在tensorflow中,为了 节约变量存储空间 ,我们常常需要通过共享 变量作用域(variable_scope) 来实现 共享变量 。

3545
来自专栏Java架构师历程

JVM加载class文件的原理

当Java编译器编译好.class文件之后,我们需要使用JVM来运行这个class文件。那么最开始的工作就是要把字节码从磁盘输入到内存中,这个过程我们叫做【加载...

2872
来自专栏我是攻城师

深入理解Java类加载器机制

Java里面的类加载机制,可以说是Java虚拟机核心组件之一,掌握和理解JVM虚拟机的架构,将有助于我们站在底层原理的角度上来理解Java语言,这也是为什么我们...

1112
来自专栏草根专栏

使用ASP.NET Core开发GraphQL服务器 -- 预备知识(下)

我想查看viewer下的repositories。注意里面的edges,一旦看到这个词,通常就表示有连接到某个数组的数据。在这里就是一个集合的repositor...

782
来自专栏Golang语言社区

游戏服务器之内存数据库redis客户端应用(上)

本文主要介绍游戏服务器的对redis的应用。介绍下redis c++客户端的一些使用。 存储结构设计: (1)装备道具的redis存储结构为例(Hashes存储...

4328
来自专栏技术专栏

慕课网高并发实战(五)- 安全发布对象

不正确的发布可变对象导致的两种错误: 1.发布线程意外的所有线程都可以看到被发布对象的过期的值 2.线程看到的被发布对象的引用是最新的,然而被发布对象的状态...

1042
来自专栏与神兽党一起成长

使用commons-pool管理FTP连接

在封装一个FTP工具类文章,已经完成一版对FTP连接的管理,设计了模板方法,为工具类上传和下载文件方法的提供获取对象和释放对象支持。

1052
来自专栏Java Edge

深入理解并发容器-ConcurrentHashMap(JDK8版本)1 概述3应用场景4 源码解析

2818
来自专栏WindCoder

Java基础小结(三)

以上这些类是传统遗留的,在Java2中引入了一种新的框架-集合框架(Collection)

471
来自专栏对角另一面

lodash源码分析之Hash缓存

在那小小的梦的暖阁,我为你收藏起整个季节的烟雨。 ——洛夫《灵河》 本文为读 lodash 源码的第四篇,后续文章会更新到这个仓库中,欢迎 star:poc...

3309

扫码关注云+社区