PHP 中 Redis 常用操作(hash 类型)

Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。

Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。

当前服务器一般都是将用户登录信息保存到Redis中,这里存储用户登录信息就比较适合用hash表。hash表比string更合适,如果我们选择使用string类型来存储用户的信息的时候,我们每次存储的时候就得先序列化(json_encode()、serialize())成字符串才能存储redis,

从redis拿到用户信息后又得反序列化(json_decode()、unserialize())成数组或对象,这样开销比较大。如果使用hash的话我们通过key(用户ID)+field(属性标签)就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题。

设置(hSet)

1
2
3
$redis->hSet('user', 'name', 'zhaosi');
$redis->hSet('user', 'age', 50);
$redis->hSet('user', 'address', '象牙山');

批量设置(hMset)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$u1 = [
'id'=> 1,
'name' => 'liuneng',
'age' => 51,
'address' => '象牙山'
];
$redis->hMSet('user:'.$u1['id'], $u1);

$u2 = [
'id' => 2,
'name' => 'zhaosi',
'age' => 50,
'address' => '象牙山'
];
$redis->hMSet('user:'.$u2['id'], $u2);

为什么要给存储的数据加一个前缀呢,比如说上面示例的user前缀?

因为我们在 redis 一般需要存储很多业务类型的数据,比如用户登录信息、验证码信息,我们都是以用户唯一标识信息(如id,手机号)作为 key,如果不加前缀就会导致多个业务类型的数据就存到一起了,这是不合理也不应该的。所以我们可以以业务名称作为前缀然后配合上用户唯一标识即前缀:唯一标识作为 key,中间是用冒号 : 分隔,这样就可以把数据按照业务类型分开,这也是业界通用的做法, php 中 session 存储默认也是一 PHPREDIS_SESSION 作为前缀,官方都是这么做了,我们还有什么理由不这样做呢。

获取(hGet)

1
$redis->hGet('user', 'name');      // zhaosi

获取全部元素(hGetAll)

1
2
3
4
5
6
$redis->hGetAll('user');
//[
// 'name' => 'zhaosi',
// 'age' => 50,
// 'address' => '象牙山'
//]

删除某个元素(hDle)

1
$redis->hDel('user', 'address');

判断元素是否存在(hExists)

1
$redis->hExists('user', 'address');     // false

获取长度(hLen)

1
2
3
4
$redis->hSet('user', 'name', 'zhaosi');
$redis->hSet('user', 'age', 50);
$redis->hSet('user', 'address', '象牙山');
$redis->hLen('user'); // 3