专栏首页决胜机器学习Redis专题(二)——Redis数据类型(1)

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),作者:linhxx

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Redis专题(一)——Redis基本概述与安装配置

    Redis专题(一) ——Redis基本概述与安装配置 (原创内容,转载请注明来源,谢谢) 一、特性 1、存储方式 Redis采用Key-Va...

    用户1327360
  • Redis专题(九)——Redis管理工具

    Redis专题(八) ——Redis管理工具 (原创内容,转载请注明来源,谢谢) 一、安全性 1、运行环境 Redis以简洁为美,其安全性...

    用户1327360
  • Redis专题(三) ——Redis事务与过期时间(缓存分析)

    Redis专题(三)——Redis事务与过期时间(缓存分析) (原创内容,转载请注明来源,谢谢) 一、事务(Transaction) 1、概述 事务的定义和...

    用户1327360
  • Docker部署redis-cluster集群

    胡齐
  • CentOS7安装配置redis-3.0.0

    一.安装必要包 yum install gcc 二.linux下安装 #下载 wget http://download.redis.io/releases/re...

    庞小明
  • Java常见排序算法详解——直接插入排序

    将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录递增1的有序表。 插入排序是进行值移动,而是不值交换。所以在量较小的情况下插入排序性能要优于冒泡和...

    Demo_Yang
  • 刘知远:近年来开源的算法代码、工具包列表

    数据派THU
  • Appium+PythonUI自动化之webdriver的三种等待方式(强制等待、隐式等待、显示等待)

    在自动化测试脚本的运行过程中,webdriver操作浏览器的时候,对于元素的定位是有一定的超时时间,大致应该在1-3秒的样子,如果这个时间内仍然定位不到元素,就...

    橙子探索测试
  • 神奇数

    给出一个区间[a, b],计算区间内“神奇数”的个数。 神奇数的定义:存在不同位置的两个数位,组成一个两位数(且不含前导0),且这个两位数为质数。 比如...

    AI那点小事
  • Docker部署Redis

    2.运行容器(本地image是:docker.io/redis latest 8f2e175b3bd1 2 weeks ago 106.6 MB):

    似水的流年

扫码关注云+社区

领取腾讯云代金券