您现在的位置是:首页 > 文章内容文章内容

Redis实战——PHP与Redis

lipeng2019-08-27 17:18:08NoSql1人已围观



Redis官方推荐的PHP客户端是Predis与phpredis。前者是完全使用PHP代码实现的原生客户端,而后者则是使用C语言开发的PHP扩展。在功能上两者并没有多大区别,就性能而言后者会更胜一筹,但除非是大量执行Redis命令,否则很难比价二者性能的差异,在这里,我们以Predis为示例来介绍如何在PHP中使用Redis。

1.jpeg

首先,需要确保PHP版本不低于5.3,这是Predis对php的最低版本要求,然后是安装Predis,在这里我们推荐使用Composer这一强大的PHP依赖管理工具来安装Predis,Composer的安装与使用,后面会有文章再写,这里不做赘述。

开始安装Predis,进入你的项目目录,一般PHP框架内都会有composer.json、composer.lock文件与vendor目录,composer.json是composer的配置文件,申明了包之间的相互关系和其他的一些元素标签,composer.lock即为锁文件,在安装完所有需要的包之后,composer会生成一张标准的包版本的文件在composer.lock文件中。这将锁定所有包的版本,达到控制依赖包的版本的目的。当我们执行install或者update命令时,composer会检测版本,再执行install或者update。vendor目录是存放所有依赖包的目录,我们通过composer安装的依赖包都能在这里找到。

打开命令行工具,进入composer.json、composer.lock,vendor所在目录,输入composer【前提是你的电脑已经安装了composer工具】,如果看到如下图所示,则表示你已成功安装并唤醒了composer程序,现在需要获取安装依赖包的命令,进入https://packagist.org/ 在搜索栏输入Predis搜索,选择第一个包,如图;

2.jpg

打开第一条,可获取安装命令,composer require predis/predis

3.jpg

在打开composer命令的终端输入上面的安装命令,等待安装完成即可。安装完成后,vendor目录下会新增一个predis目录。为方便实例化,通常我们会在控制器的头部引入命名空间,Predis的类文件是predis/predis/src/Client.php,它的命名空间是namespace Predi,因此我们在控制器头部use Predis,然后就可以在控制器的方法里直接new Predis\Client();实线对类的实例化。默认情况下,Redis的地址为127.0.0.1,端口为6379,如果需要更改地址或端口,可以在实例化类的时候传入配置数组,修改相关选项的值即可;如

$redis = new Predis\Client(array('scheme'=>'tcp','host'=>'127.0.0.1','port'=>'6379'));

一:字符串类型

下面我们开始使用get命令进行测试;

SET  key value  创建一个键名为key,值为value的字符串类型数据

GET key    获取键名为key的字符串类型数据的值,键不存在会返回空结果

INCR key  当存储的是整数类型的字符串时,执行incr命令可以使键的值递增,并返回递增后的值,如果操作的键不存在,则默认键值为0,所以返回的值是递增后的1,键值存在但不是整数类型的字符串则会提示错误。

INCRBY key increment  使值为整数的键key的值增加指定数值,如果操作的键不存在,则默认键值为0,所以返回的值是增加后的值,键值存在但不是整数类型的字符串则会提示错误。

DECR key 使值为整数的键key的值递减,如果操作的键不存在,则默认键值为0,返回递减后的值 键值存在但不是整数类型的字符串则会提示错误。

DECRBY key 使值为整数的键key的值减少指定数值,如果操作的键不存在,则默认键值为0,所以返回的值是减少后的值,键值存在但不是整数类型的字符串则会提示错误。

INCRBYFLOAT key increment  递增一个双精度浮点数

APPEND key value 向键值的末尾追加value,键不存在则创建它并将值设为value,返回追加后的总长度

STRLEN key 返回键key的值的长度,如果键不存在则返回0【汉字会占用3个长度】

MGET key1 key2 获取多个键的值【$client->mget(['name','sex','age']);】

MSET key1 value1 key2 value2 ...  设置多个键值 【$client->mget(['name'=>'lipeng','sex'=>'男','age'=>'24']);】


二:散列类型

上面是简单的使用get、set命令存储取出简单的字符串类型数据的示例,下面我们将进行存储散列类型数据的操作。在常用的关系型数据库如mysql中,每张表的字段是固定的,可以理解为一列一列按照主键整齐排列的数据集合,但有时候我们保存的数据有些字段是冗余的,这就导致了存储资源的浪费,而Redis的散列则完全不存在这个问题,因为Redis的散列的结构是人为约定,我们完全可以自由的为任何键增加或减少字段而不影响其他键。

Redis的散列类型常用的命令有 HSET、HGET、HMSET、HMGET、HGETALL、HINCRBY、HEXISTS、HSETNS、HINCRBY、HDEL等

HSET key field value    赋值(为散列类型的键(key)的字段(field)赋值(value),或创建一个散列类型的键(key,字段名称为field,值为value)不区分插入与更新操作,当字段不存在时,会创建字段并赋值,命令返回1,当字段已经存在时执行的是更新操作,返回0,当键本身不存在时,会自动建立。

HGET   key field     从散列类型的键(key)中取(字段名称为field的)值,键不存在或字段不存在会返回空结果。

HMSET key field value [field value......]  创建或为一个散列类型键赋值(同时创建/赋值多个字段)

HMGET key field1 field2  从散列类型的键(key)中取多个字段的值,不存在的字段返回空值

HGETALL key 从散列键key中获取所有字段的值

HINCRBY key field increment 将散列键key的值为整数型的字段field的值增加increment【字段的值与增加的值必须是整数,字段可以不存在,字段不存在时默认创建并赋予初始值0,返回增加后的值,如果字段已经存在但值不是一个整数则会报错】

HEXISTS key field 判断散列类型的键key的field字段是否存在,存在返回1,不存在返回0,键不存在也返回0

HSETNS key field value 判断散列类型键key是否存在一个field字段,不存在则创建该字段并赋值value,返回1,存在则返回0,不进行任何操作

HDEL key field [field field...]  删除散列键key的一个或多个字段 返回被删除的字段个数,假设传了不存在的字段名,会跳过不存在的字段名。使用方法如下

HKEYS key 获取字段名  获取散列类型键key的所有字段名 【$client->hkeys('user:id:1');】

HVALS key 获取字段值 获取散列类型键key的所有字段值 【$client->hvals('user:id:1');】

HLEN key 获取字段数量  获取散列类型键key的字段数量 【$client->hlen('user:id:1');】


三:列表类型

列表类型(list)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。列表类型内部是使用双向链表实现的,所以向列表两端添加元素的时间复杂度为O(1),获取越接近两端的元素速度就越快。这意味着即使是从一个有几千万个元素的列表获取头部或尾部的10条记录也是极快的。不过使用链表的代价是通过索引访问元素比较慢,借助列表类型,Redis还可以作为队列使用。

LPUSH key value [value ...]  向列表左边增加元素,返回增加后列表的长度

RPUSH key value [value ...]  向列表右边增加元素,返回增加后列表的长度

LPOP key 从列表左边弹出一个元素【删除最左边的元素】,并返回弹出的元素

RPOP key 从列表右边弹出一个元素【删除最右边的元素】,并返回弹出的元素

LLEN key 获取列表中元素的个数 键不存在时返回0

LRANGE key start stop 获得列表中从start到stop之间的片段(包含两端,获取,不删除,起始索引为0,支持负索引,-1表示右边第一个元素,即 LRANGE key 0 -1 能获取列表所有元素,start小于stop返回空列表,stop大于实际索引范围,返回到最右边)

LREM key count value 删除列表前count个值为value的元素,返回实际删除的元素个数(count>0,从列表左边删除前count个值为value的元素;count<0时,从列表右边删除前  |count|  *绝对值*  个值为value的元素;count = 0,删除列表中所有值为value的元素 )

LINDEX  key index 获得列表key中索引为index的元素的值【索引从0开始,为-1表示最右边的元素】

LSET key index value 设置列表key中索引为index的元素的值为value【索引从0开始,为-1表示最右边的元素】

LTRIM key start end 删除指定索引范围之外的所有元素

LINSERT key BEFORE / AFTER pivot value  在列表中查找值为pivot的元素,根据第二个参数是before还是after来决定将value插入到该元素的左边还是右边

RPOPLPUSH source destination 先执行RPOP命令再执行LPUSH命令,从source列表右边弹出一个元素,并将其加入到destination列表的左边,并返回这个元素的值【适用于队列】


四:集合类型

集合类型的键值具有无序性和唯一性的特征,常用操作是向集合中插入或删除元素,判断某个元素是否存在等,多个集合类型键之间可进行并集、交集、差集运算。

SADD key member [member ...]  向集合中增加一个或多个元素,键不存在会创建,加入元素中会跳过已经存在于集合中的元素,返回成功加入集合的元素数量。

SREM key member [member ...]  删除集合中一个或多个元素,如果某个元素不存在,会跳过,返回最终删除的元素个数

SMEMBERS key  返回集合中所有元素

SISMEMBER key member  判断一个元素是否在集合中,存在返回1,不存在返回0

SDIFF key [key ...]  计算多个集合的差集,当有多个集合时,先计算前面两个集合的差集,再与第三个集合进行差集运算,以此类推直至计算到最后【* 所谓差集,即属于前一个集合但不属于后一个集合的元素构成的集合】

SINTER key [key ...] 计算多个集合的交集,当有多个集合时,先计算前面两个集合的交集,再与第三个集合进行交集运算,以此类推直至计算到最后【* 所谓交集,即属于两个集合共有的元素构成的集合】

SUNION key [key ...] 计算多个集合的并集  【* 所谓并集,即多个集合的元素去重后构成的集合】

SCARD key 获得集合中元素的个数

SDIFFSTORE destination key [key ...]  计算多个集合的差集,存储到新的键(集合)中

SINTERSTORE  destination key [key ...]  计算多个集合的交集,存储到新的键(集合)中

SUNIONSTORE  destination key [key ...]  计算多个集合的并集,存储到新的键(集合)中

SRANDEMEBER key [count]  随机从集合中取出一个元素【当传count值时;count为正数,取出count个不重复的元素,count大于元素个数返回所有元素   count为负数 随机取出   |count|  个元素,且元素可能相同 】

SPOP key 从集合中随机弹出一个元素【即删除,由于集合类型的元素是无序的,所以会从集合中随机选择一个元素弹出】


五:有序集合类型

有序集合类型的键值具有有序性和唯一性的特征,有序集合为集合中每个元素都关联了一个分数,redis正是通过分数来为集合中的成员进行从小到大的排序。

ZADD key core member [core member...]  向有序集合中加入元素与元素的分数,元素已经存在则用过新的分数替换原有分数,返回值是新加入元素的个数【不包含之前已经存在的元素】

ZSCORE key  member  获得元素的分数

ZRANGE key start stop [WITHSCORES]   按照元素分数从小到大的顺序返回指定索引范围之间的所有元素【加上WITHSCORES 命令至末尾,则返回的是按照元素分数从小到大的顺序返回指定索引范围之间的所有元素与分数的值】

ZREVERANGE key start stop [WITHSCORES]   按照元素分数从大到小的顺序返回指定索引范围之间的所有元素【加上WITHSCORES 命令至末尾,则返回的是按照元素分数从大到小的顺序返回指定索引范围之间的所有元素与分数的值】

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]  按照元素从小到大的顺序,返回分数在指定范围之间的元素

ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]  按照元素从大到小的顺序,返回分数在指定范围之间的元素

ZINCRBY key increment member 增加有序集合中某元素的分数

ZCARD key 获取有序集合中元素数量

ZCOUNT key min max 获得指定分数范围内的元素个数

ZREM key member [member...]  删除有序集合中一个或多多个元素

ZREMRANGEBYRANK key start stop 按照元素分数从小到大的顺序,删除在指定范围内的所有元素,返回删除的元素数量

ZREMRANGEBYSCORE Key min max 删除指定分数范围内的所有元素

ZRANK key member  按照元素分数从小到大的顺序获得指定的元素的排名

ZREVRANK key member 按照元素分数从大到小的顺序获得指定的元素的排名

ZINTERSTORE destination numkeys key [key...] [WEIGHT weight [weight...]] [AGGREGATE SUM|MIN|MAX]  计算多个有序集合的交集并将结果存储在新的有序集合类型的键destination中,返回destination键中元素的个数【参数说明:AGGREGATE 新的键中的元素的分数计算方式 ,当AGGREGATE的值为 SUM[默认]时,该键中元素的分数是每个参与计算的元素的分数的和,当AGGREGATE 的值为min时,键中元素的分数是所有参与运算的集合中该元素分数的最小值,当AGGREGATE的值为max时,键中元素的分数是所有参与运算的集合中该元素分数的最大值;  WEIGHTS 新的键中的元素的分数所占权重,每个集合在参与计算时,元素的分数会被乘以该集合的权重值】

ZUNIONSTOREdestination numkeys key [key...] [WEIGHT weight [weight...]] [AGGREGATE SUM|MIN|MAX]  计算多个有序集合的并集并将结果存储在新的有序集合类型的键destination中,返回destination键中元素的个数【参数说明:AGGREGATE 新的键中的元素的分数计算方式 ,当AGGREGATE的值为 SUM[默认]时,该键中元素的分数是每个参与计算的元素的分数的和,当AGGREGATE 的值为min时,键中元素的分数是所有参与运算的集合中该元素分数的最小值,当AGGREGATE的值为max时,键中元素的分数是所有参与运算的集合中该元素分数的最大值;  WEIGHTS 新的键中的元素的分数所占权重,每个集合在参与计算时,元素的分数会被乘以该集合的权重值】



用户评论:

我的名片

姓名:李鹏

职业:PHP开发工程师

现居:广东省-深圳市

Email:lipeng4203@163.com