Redis 的数据类型及操作(php)

前言

Redis是一款内存高速缓存数据库。是一个key-value存储系统(键值存储系统),支持丰富的数据类型,如:String、List、Set、Sorted-set、Hash、HyperLog、Bitmap。在互联网技术存储方面使用非常广泛。下面将一一介绍各个数据类型极其基本操作。

一、string字符串类型

最常规, 最通用 的数据类型. 数据缓存时, 用到就是该数据类型. 字符串!

1.1 set,设置 ;get,获取

仅仅支持字符串操作. 不支持内置数据编码功能。如果需要存储PHP的非字符串类型。需要手动序列化,再存储。获取时,反序列化!

$redis = new Redis(); 
$redis->connect('127.0.0.1', 6379); //连接Redis
$redis->auth('password'); //密码验证
$res = $redis->set('array', serialize(['name' => 'Ao'])); // 储存数组类型
$data = $res->get('array');
var_dump($data); //string 'a:1:{s:4:"name";s:2:"Ao";}' (length=26)
var_dump(unserialize($data)); //array (size=1)'name' => string 'Ao' (length=2)

1.2 incr, incrBy

增1, 指定步长增加

1.3 decr, decrBy

减1, 指定步长的减

$res = $redis->set('number', 0);
$data = $redis->incr('number'); // int 1
$data = $redis->incrBy('number', 2); // int 3
$data = $redis->decr('number'); // int 2
$data = $redis->decrBy('number', 2); // int 0
var_dump($data);

1.4 append,追加

$res = $redis->set('string', 'hello');
$data = $redis->append('string', ' ');
$data = $redis->append('string', 'Ao');
$data = $redis->get('string'); // helloAo

1.5 strLen, 内容长度

$redis->set('strlen', '111');
$data = $redis->strlen('strlen'); // int 3

var_dump($data);

1.6 getRange获取部分

$redis->set('getrange', '111222333');
$data = $redis->getRange('getrange', 0, 5); // string '111222' (length=6)

var_dump($data);

支持负数位置:

$redis->set('getrange', '111222333');
$data = $redis->getRange('getrange', 0, -1); // string '111222333' (length=9)
$redis->getRange('getrange', -6, -1);//string '222333' (length=6)
var_dump($data);

二 链表类型

(队列是一种特殊的链表)连续的线性存储空间,就是链表(线性表),是一种复合数据类型. 一个链表, 可以存储多个值!

2.1 lpush(), 将元素压入链表,lrange(), 获取某个选定范围元素

$res = $redis->lPush('list', 'java');
$data = $redis->lRange('list', 0, -1); //array (size=1) 0 => string 'java' (length=4)

2.2 linsert(), 在某个位置插入新元素

位置的判断,是根据相对的参考元素判断。前链表中仅仅存在一个java的元素, 执行下面的插入:

$redis->lInsert('list', \Redis::BEFORE, 'java', 'php'); //int 2
$data = $redis->lRange('list', 0, -1); // array (size=2)0 => string 'php' (length=3)1 => string 'java' (length=4)
$res = $redis->lInsert('list', \Redis::AFTER, 'java', 'python'); //int 3
$data = $redis->lRange('list', 0, -1); // array (size=3)0 => string 'php' (length=3)1 => string 'java' (length=4)2 => string 'python' (length=6)

结果是:
在java前后分别有 :php和python。

2.3 lset(),设置某个元素的值

某个元素使用索引下标进行确定:
始终是从0开始,到长度-1逐一递增的索引下标!

$res = $redis->lset('list', 2, 'C++'); // boolean true
$data = $redis->lRange('list', 0, -1); //array (size=3)0 => string 'php' (length=3)1 => string 'java' (length=4)2 => string 'C++' (length=3)

2.4 llen(), 获取列表元素个数

$data = $redis->lLen('list'); // int 3

2.5 lindex(), 返回索引对应的元素

索引从0开始!

$data = $redis->lIndex('list', 0); // string 'php' (length=3)

2.6 lpop(), 从列表中,左侧弹出元素

将数据从左侧弹出,会获取弹出的元素,数据元素在list中消失。

$data = $redis->lPop('list'); //string 'php' (length=3)
$data = $redis->lRange('list', 0, -1); //array (size=3)0 => string 'java' (length=4)1 => string 'C++' (length=3)

2.7 rpush(),rpop()

从list中的右侧, 压入或者弹出元素

$redis->rPush('list', 'python'); //int 3
$redis->lRange('list', 0, -1); // ['java', 'c++', 'python]
$data = $redis->rPop('list'); // python
$data = $redis->lRange('list', 0, -1);  // ['java', 'c++']

2.8 lremove, 移除元素

根据值,移除元素
list中可能出现重复的元素, 需要通过count指定, 需要移除的元素的数量.
(key, value, count=全部)

$redis->lRemove('list', 'C++'); //int 1
$redis->lRange('list', 0, -1); // ['java']

三、set 集合类型

也是一种复合类型.。
一个缓存项, 可以存储多个数据!

集合数据的特征:
1元素不能重复,保持唯一性
2元素无序。 不能使用索引操作

3.1 sadd,,添加元素到集合;smembers, 获取所有的成员

唯一性

$redis->sAdd('set', 'string', 'string'); // int 1 (只成功插入一条数据)
$redis->smembers('set'); // ['string']

3.2 spop, 弹出一个随机元素

无序性

$redis->sAdd('set', 'string', 'array', 'boolean', 'int', 'decimal');
$redis->sPop('set'); //string 'string' (length=6)

3.3 sscan, 遍历集合

参数:key,迭代器变量,匹配模式,每次返回元素数量(默认为10个)

$data = '';
$elements = $redis->sScan('set', $data, '*'); // [1,2,3,4,5]
foreach ($elements as $ele) {
    echo $ele;// 1,2,3,4,5
}

3.4 scard, 获取基数

基数, 在集合中, 指的是集合内的元素个数

$data = $redis->sCard('set'); // int 12

3.5 sunion, sdiff, sinter, 并集, 差集, 交集

交集时,如果一个集合不存在或者为空则返回结果为空

$redis->sadd('set1', 'A', 'B', 'C', 'D');
$redis->sadd('set2', 'A', 'B', 'C');
$data = $redis->sDiff('set1', 'set2'); // ['D']
$data = $redis->sUnion('set1', 'set2'); // ['A', 'D', 'C', 'B']
$data = $redis->sInter('set1', 'set2'); // ['C', 'A', 'B']
$data = $redis->sInter('set1', 'set2', 'set3'); // []

四 有序集sorted-set(zset)

与集合相比, 每个元素多了一个属性,socre,分值,权重。
也称之为: 加分集合。
排序就是利用score完成!
处理元素时,也要加上score的处理

4.1 zadd,添加元素

$data = $redis->zadd('zset', 0, 'Ao'); // 第一个参数集合key 第二个参数分值 第三个参数元素
$data = $redis->zadd('zset', 0, 'World'); // 第一个参数集合key 第二个参数分值 第三个参数元素
// 第一个参数集合的key 第二个开始的下标 第三个参数 结束的下标 第四个是否带分值
$data = $redis->zRange('zset', 0, -1); //['Ao', 'World']
$data = $redis->zRange('zset', 0, -1, true); //['Ao'=>0, 'World'=>0]

4.2 zincrBy, 元素分值增减

// 第一个参数为集合key 第二个参数为递增分值(可为负数)第三个为元素
$data = $redis->zIncrBy('zset', '3', 'Ao'); // 返回值为新的分数值 3

4.3 zRange(), zRevRange()

根据分值排序后的,升序和降序(rev)的列表获取
第一个参数集合的key 第二个开始的下标 第三个参数 结束的下标 第四个是否带分值

$data = $redis->zRange('zset', 0, -1, true); //['World'=>0, 'Ao'=>3]
$data = $redis->zRevRange('zset', 0, -1, true); //[ 'Ao'=>3, 'World'=>0]

4.4 zrangebyscore(), zrevrangebyscore()

根据 分值过滤之后的列表
需要提供 分值区间!
两者区别为 :
zrevrangebyscore()第二个参数为相对比较大的值 (降序)
zrangebyscore()第二个参数为相对比较小的值 (升序)

// 第四个参数为数组 默认按分数过滤
['Ao' => 3, 'World' => 0, 'Hello' => 5, 'Love' => 6]
$data = $redis->zRangeByScore('zset', 1, 5, ['withScore' => true]); //[ 'Ao', 'Hello'=>0]

4.5 zCard, 获取基数 元素个数

$data = $redis->zCard('zset'); // int 4

4.6 zscore, 获取元素的分值

$data = $redis->zScore('zset', 'Ao'); // 3

4.7 zrem, zremrangebyrank, zremrangebyscore删除, 根据排行删除

zremrangebyscore(key, min, max):移除有序集key中,所有score值介于min和max之间(包括等于min或max)的成员
zremrangebyrank(key, start, stop):移除有序集key中,指定排名(rank)区间内的所有成员。区间分别以下标参数start和stop指出,包含start和stop在内。下标参数start和stop都以0为底,也就是说,以0表示有序集第一个成员,以1表示有序集第二个成员,以此类推。你也可以使用负数下标,以-1表示最后一个成员,-2表示倒数第二个成员,以此类推。

$data = $redis->zrem('zset', 'Ao');  // 删除元素 Ao

五 hash-table, hash表

PHP中的关联数组, 就是hash表!
一种复合数据结构. 采用Key=value型 进行存储数据结构.

5.1 hset, 设置

需要指定:缓存项名, 下标字段, 值

5.2 hget, 获取

需要指定:缓存项名, 下标字段

5.3 hGetAll, 获取全部的元素

5.4 hexists, 判断元素是否存在

5.5 hdel, 删除某个元素

5.6 hlen, 获取长度

$data = $redis->hSet('user', 'name', 'Ao');
$data = $redis->hSet('user', 'age', '28');
$data = $redis->hget('user', 'name'); // Ao
$data = $redis->hGetAll('user'); // ['name' => 'Ao', 'age' => '28']
$data = $redis->hLen('user'); // 2
$data = $redis->hLen('user', 'name'); // 2
$data = $redis->hExists('user', 'age'); //boolean true
$data = $redis->hDel('user', 'age'); //int 1

六 HyperLog, 集合基准数

1、仅仅用来存储集合基数的,而不是存储集合中的元素。
2、专门用来统计不同的元素的数量的。
3、不能获取元素, 仅仅可以统计数量。
实操中,如果不在乎元素内容,而仅仅在乎的数量,则可以使用该类型。
类型:
统计网站的 UIP(独立访客IP),US(独立会话session, 独立用户)。 衡量业务逻辑量。

6.1 pfadd, 向集合中添加元素

不能添加重复元素

$redis->pfadd('hyperLog', [1234567]); // int 1

6.2 pfcount, 统计基数

$data = $redis->pfcount('hyperLog'); // 1

七 bitmap, 位图

一组01的组合。
在redis的实现中: 就是一个,在每个字符位,仅仅是0或者1 的字符串。
由于仅仅需要存储0, 1, 所以可以转码后存储, 占用更少的空空间
通过 字符串操作 get获取 位图的内容, 可以发现, 是16进制进行存储

7.1 setbit, 设置位图的某一位

需要指定某个位,0或1的值
应用场景
统计每日用户的登录数。每一位标识一个用户ID,当某个用户访问我们的网页或执行了某个操作,就在bitmap中把标识此用户的位设置为1

7.2 getbit, 获取位图的某一个位

7.3 get 测试 16进制

7.4 bitcount 获取位图中为1 的个数

bitcount key [start end]:如果没有给出 start.end为搜索全部(PHP中没有第二个和第三个参数 为全部搜索

7.5 bitop 做多个BitMap的and(交集)、or(并集)、not(非)、xor(异或)操作并将结果保存在destKey中

bitop op destKey key1 [key2…]: op为 and/or/not/xor

$data = $redis->setBit('bit', 0, 1);
$data = $redis->setBit('bit', 2, 0);
$data = $redis->setBit('bit', 3, 1);
$data = $redis->setBit('bit', 4, 1);
$data = $redis->setBit('bit1', 0, 1);
$data = $redis->setBit('bit1', 2, 0);
$data = $redis->setBit('bit1', 3, 0);
$data = $redis->getBit('bit', 3); // 1
$data = $redis->bitCount('bit'); //  3
$data = $redis->bitOp('and', 'target', 'bit', 'bit1'); // 1
$data = $redis->getBit('target', 0);  // 1
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值