PHP操作Redis的五大数据类型及持久化的实现

连接Redis:
//实例化redis
$redis = new Redis();
//连接 ip + 端口号
$redis->connect('127.0.0.1', 6379);
//检测是否连接成功
echo "Server is running: " . $redis->ping();
// 输出结果 Server is running: +PONG

连接成功,我们就可以使用php操作redis啦;下面分别介绍Redis的5大数据类型的一些主要命令的使用。

1-1. String类型

Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字,常用的命令有:

  • set key value: 设置指定 key 的值;
  • get key: 获取指定 key 的值;
  • incr key: 将 key 中储存的数字值增 1;
  • incrby key increment: 将 key 所储存的值加上给定的增量值(increment);
  • decr key: 将 key 中储存的数字值减 1;
  • decrby key decrement: key 所储存的值减去给定的减量值(decrement);
演示:
// 设置一个字符串的值
$redis->set('name', 'giant');

//获取一个字符串的值
echo $redis->get('name').'<br/>'; // giant

// 设置一个数值
$redis->set('age', 26);
echo $redis->get('age').'<br/>'; // 26

// 递增1
$redis->incr('age');
echo $redis->get('age').'<br/>'; // 27

// 递减1
$redis->decr('age');
echo $redis->get('age').'<br/>'; // 26

//随机递增
$redis->incrby('age',4);
echo $redis->get('age').'<br/>'; // 30

//随机递减
$redis->incrby('age',-5);
echo $redis->get('age').'<br/>'; // 25

1-2. List类型

Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,常用命令:

  • lpop key:移出并获取列表的第一个元素
  • lpush key value1 [value2]:将一个或多个值插入到列表头部
  • lpushx key value:将值value插入到列表key的表头,当且仅当key存在并且是一个列表
  • rpop key:移除并获取列表最后一个元素
  • rpush key value1 [value2]:在列表中添加一个或多个值
  • rpushx key value:为已存在的列表添加值
  • lrange key start stop:获取列表指定范围内的元素,lrange key 0 -1 表示输出所有元素
  • lrem key count value:根据参数count的值(count > 0:从表头向表尾搜索,数量为count,count < 0从表尾向表头搜索,数量为count的绝对值,count = 0 移除表中所有与value相等的值),移除列表中与参数value相等的元素
  • lset key index value:通过索引设置列表元素的值
  • lindex key index:通过索引获取列表中的元素
  • llen key:获取列表长度
演示:
//存储数据到列表中
$redis->lpush('list1','php');
$redis->lpush('list1','redis');
$redis->lpush('list1','mysql');
$redis->lpush('list1','linux');

//获取列表中所有的值
$list = $redis->lrange('list1', 0, -1);
print_r($list);echo '<br>';
// 结果:Array ( [0] => linux [1] => mysql [2] => redis [3] => php )

//从右侧加入一个
$redis->rpush('list1', 'cache');
$list = $redis->lrange('list1', 0, -1);
print_r($list);echo '<br>';
// 结果: Array ( [0] => linux [1] => mysql [2] => redis [3] => php [4] => cache )

//从左侧弹出一个
$redis->lpop('list1');
$list = $redis->lrange('list1', 0, -1);
print_r($list);echo '<br>';
// 结果:Array ( [0] => mysql [1] => redis [2] => php [3] => cache )

//从右侧弹出一个
$redis->rpop('list1');
$list = $redis->lrange('list1', 0, -1);
print_r($list);echo '<br>';
// 结果:Array ( [0] => mysql [1] => redis [2] => php )

//获取列表的长度
$length = $redis->lsize('list1');
echo $length.'<br>';   // 3

//返回列表key中index位置的值
echo $redis->lget('list1', 0);  // mysql
echo $redis->lindex('list1', 2);  // php

//返回key中从start到end位置间的元素
$list = $redis->lrange('list1', 0, 2);
print_r($list);echo '<br>';
// 结果:Array ( [0] => redis [1] => php )

//设置列表中index位置的值
$redis->lset('list1', 2, 'php-fpm');
$list = $redis->lrange('list1', 0, -1);
print_r($list);echo '<br>';
// 结果:Array ( [0] => mysql [1] => redis [2] => php-fpm )

//删除列表中count个值为value的元素
//列表
$redis->lpush('list', 'html');
$redis->lpush('list', 'html');
$redis->lpush('list', 'css');
$redis->lpush('list', 'php');
$redis->lpush('list', 'mysql');
$redis->lpush('list', 'html');
$redis->lpush('list', 'html');
$redis->lpush('list', 'ajax');
// 结果: Array ( [0] => ajax [1] => html [2] => html [3] => mysql [4] => php [5] => css [6] => html [7] => html )

//从左向右删
 $redis->lrem('list', 'html', 2);
$list = $redis->lrange('list', 0, -1);
print_r($list);echo '<br>';
// 结果: Array ( [0] => ajax [1] => mysql [2] => php [3] => css [4] => html [5] => html )

//从右向左删
$redis->lrem('list', 'html', -1);
$list = $redis->lrange('list', 0, -1);
print_r($list);echo '<br>';
// 结果: Array ( [0] => ajax [1] => mysql [2] => php [3] => css [4] => html )

//删除所有
$redis->lrem('list', 'html', 0);
$list = $redis->lrange('list', 0, -1);
print_r($list);echo '<br>';
// 结果: Array ( [0] => ajax [1] => mysql [2] => php [3] => css )

1-3. Hash类型

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象,常用的命令有:

  • hset key field value:将哈希表 key 中的字段 field 的值设为 value
  • hget key field:获取存储在哈希表中指定字段的值
  • hdel key field2 [field2]:删除一个或多个哈希表字段
  • hkeys key:获取所有哈希表中的字段
  • hvals key:获取哈希表中所有值
  • hexists key field:查看哈希表 key 中,指定的字段是否存在
  • hgetall key:获取在哈希表中指定 key 的所有字段和值
  • hlen key:获取哈希表中字段的数量
  • hmset key field1 value1 [field2 value2 ]:同时将多个 field-value (域-值)对设置到哈希表 key 中
  • hmget key field1 [field2]:获取所有给定字段的值
演示:
# 给hash表中某个key设置value
// 如果字段是哈希表中的一个新建字段,并且值设置成功,返回 1 ; 如果哈希表中该字段已经存在且旧值已被新值覆盖,返回 0 。
$redis->hset('myhash', 'field1', 'php');
$redis->hset('myhash', 'cat', 'miao');
$redis->hset('myhash', 'dog', 'wang');

# 获取hash中某个key的值
echo $redis->hget('myhash', 'field1'); // php

# 设置一个新域
$redis->hset('myhash', 'field2', 'value2');
# 覆盖一个旧域
$redis->hset('myhash', 'field2', 'new-value2');

# 获取哈希表中所有字段
$keys = $redis->hkeys('myhash');
print_r($keys);

# 获取哈希表中所有值
$values = $redis->hvals('myhash');
print_r($values);

# 获取在哈希表中指定 key 的所有字段和值
$arr = $redis->hgetall('myhash');
print_r($arr);

# 获取哈希表中字段的数量
$len = $redis->hlen('myhash');

# 删除一个或多个哈希表字段
// 如果表不存在或key不存在则返回false
echo $redis->hdel('myhash', 'dog');
var_dump($redis->hdel('myhash', 'bird'));

# 批量设置多个key的值
$arr = [1=>1, 2=>2, 3=>3, 4=>4, 5=>5];
$redis->hmset('hash', $arr);
print_r($redis->hgetall('hash'));

# 批量获得额多个key的值
$arr = [1, 2, 3, 5];
$hash = $redis->hmget('hash', $arr);
print_r($hash);

# 检测hash中某个key知否存在
echo $redis->hexists('hash', '1');
var_dump($redis->hexists('hash', 'cat'));

print_r($redis->hgetall('hash'));

# 给hash表中key增加一个整数值
$redis->hincrby('hash', '1', 1);
print_r($redis->hgetall('hash'));

1-4. Set类型

Set是string类型的无序集合。集合成员是唯一的。
常用命令:

  • sadd key member1 [member2]:向集合添加一个或多个成员
  • sdiff key1 [key2]:返回给定所有集合的差集
  • sdiffstore destination key1 [key2]:返回给定所有集合的差集并存储在 destination 中
  • sinter key1 [key2]:返回给定所有集合的交集
  • sinterstore destination key1 [key2]:返回给定所有集合的交集并存储在 destination 中
  • sunion key1 [key2]:返回所有给定集合的并集
  • sunionstore destination key1 [key2]:所有给定集合的并集存储在 destination 集合中
  • smove source destination member:将 member 元素从 source 集合移动到 destination 集合
  • spop key:移除并返回集合中的一个随机元素
  • srandmember key [count]:返回集合中一个或多个随机数
  • srem key member1 [member2]:移除集合中一个或多个成员
  • smembers key:返回集合中的所有成员
  • sismember key member:判断 member 元素是否是集合 key 的成员
  • scard key:获取集合的成员数
演示:
# 向集合添加一个或多个成员
$redis->sadd('animals', 'cat');
$redis->sadd('animals', 'cat');
$redis->sadd('animals', 'dog');
$redis->sadd('animals', 'rabbit');
$redis->sadd('animals', 'bear');
$redis->sadd('animals', 'horse');

# 查看集合中所有的元素
$set = $redis->smembers('animals');
print_r($set);

# 删除集合中的value
echo $redis->srem('animals', 'cat');
var_dump($redis->srem('animals', 'bird'));

$set = $redis->smembers('animals');
print_r($set);

# 判断元素是否是set的成员
var_dump($redis->sismember('animals', 'dog'));
var_dump($redis->sismember('animals', 'bird'));

# 查看集合中成员的数量
echo $redis->scard('animals');
1-5. Sort Set类型

Sorted Set和Set一样也是string类型元素的集合,且不允许重复的成员。不同的是Sorted Set每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
常用命令:

  • zadd key score1 member1 [score2 member2]:向有序集合添加一个或多个成员,或者更新已存在成员的分数
  • zcard key:获取有序集合的成员数
  • zcount key min max:计算在有序集合中指定区间分数的成员数
  • zrange key start stop [withscores]:通过索引区间返回有序集合成指定区间内的成员
  • zremrange key start stop [withscores]:返回有序集中指定区间内的成员,通过索引,分数从高到底
  • zrangebyscore key min max [withscores] [limit]:通过分数返回有序集合指定区间内的成员
  • zremrangebyscore key min max:移除有序集合中给定的分数区间的所有成员
  • zrank key member:返回有序集合中指定成员的索引
  • zrevrank key member:返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
  • zrem key member [member ...]:移除有序集合中的一个或多个成员
  • zremrangebyrank key start stop:移除有序集合中给定的排名区间的所有成员
  • zrevrangebyscore key max min [withscores]:返回有序集中指定分数区间内的成员,分数从高到低排序
  • zscore key member:返回有序集中,成员的分数值
演示:
# 添加元素
$redis->zadd('animals', 1, 'cat');
$redis->zadd('animals', 2, 'dog');
$redis->zadd('animals', 3, 'fish');
$redis->zadd('animals', 4, 'dog');
$redis->zadd('animals', 4, 'bird');

# 返回集合中的所有元素
print_r($redis->zrange('animals', 0, -1));
print_r($redis->zrange('animals', 0, -1, true));

# 返回元素的score值
echo $redis->zscore('animals', 'dog');

# 返回存储的个数
echo $redis->zcard('animals');

# 删除指定成员
$redis->zrem('animals', 'cat');
print_r($redis->zrange('animals', 0, -1));
0 人推荐

声明:本文原创发布于加藤非博客,转载请注明出处:加藤非博客 jiatengfei.com 。如有侵权,请联系本站删除。

加藤非博客
请先登录再发表评论
  • 最新评论

  • 总共1条评论
加藤非博客

天使东方不败_84395:不错哟

2018-06-30 08:16:09 回复

加藤非博客
  • 加藤非 回复 天使东方不败_84395:谢谢
  • 2018-06-30 08:16:52 回复
加藤非博客
  • 天使东方不败_84395 回复 加藤非:关注了
  • 2018-06-30 08:17:43 回复