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 | $redis->hSet('user', 'name', 'zhaosi'); |
批量设置(hMset)
1 | $u1 = [ |
为什么要给存储的数据加一个前缀呢,比如说上面示例的user前缀?
因为我们在 redis 一般需要存储很多业务类型的数据,比如用户登录信息、验证码信息,我们都是以用户唯一标识信息(如id,手机号)作为 key,如果不加前缀就会导致多个业务类型的数据就存到一起了,这是不合理也不应该的。所以我们可以以业务名称作为前缀然后配合上用户唯一标识即前缀:唯一标识作为 key,中间是用冒号 :
分隔,这样就可以把数据按照业务类型分开,这也是业界通用的做法, php 中 session 存储默认也是一 PHPREDIS_SESSION 作为前缀,官方都是这么做了,我们还有什么理由不这样做呢。
获取(hGet)
1 | $redis->hGet('user', 'name'); // zhaosi |
获取全部元素(hGetAll)
1 | $redis->hGetAll('user'); |
删除某个元素(hDle)
1 | $redis->hDel('user', 'address'); |
判断元素是否存在(hExists)
1 | $redis->hExists('user', 'address'); // false |
获取长度(hLen)
1 | $redis->hSet('user', 'name', 'zhaosi'); |