哈希篇

Redis哈希(Hashes)是一种数据类型,表示字符串字段和字符串值之间的映射关系。Redis哈希结构存储一组字段值对,设计上不占用太多空间,因此非常适合表示数据对象。它提供了添加、获取或删除单个项、获取整个哈希值或将哈希值中的一个或多个字段用作计数器的功能。

redis-hashes

场景

哈希使用的场景特别广泛,甚至都可以当数据库来用🐶。比如,存储配置信息等等场景。

对象存储

存储对象是哈希最基本的使用场景, 比如用户对象,商品对象,活动对象等等可以说一切的对象。

  • 用户对象

哈希可以用来存储用户对象的信息,每个用户对象可以包含多个字段,如用户名、密码、电子邮件等,这样可以将用户信息组织成一个哈希,方便管理和查询。

  • 商品信息

对于电子商务平台,商品信息可以被存储为哈希,每个商品的各种属性(如名称、价格、库存等)可以作为哈希的字段,这样可以方便地查询和更新商品信息。

// 商品信息
$goods = $user = $activity = [];
$redis->hMSet('goods:1', $goods);

缓存存储

哈希可以用来存储缓存数据,例如将一些常用的计算结果或数据库查询结果存储为哈希,可以提高访问速度并减少数据库压力。


$cacheData = $redis->hGetAll('cache:result');
if (!empty($cacheData)) {
    return $cacheData;
}
// todo 获取或者计算数据操作

配置管理

可以将系统的配置信息存储为哈希,每个配置项对应一个字段,这样可以方便地进行配置的读取和更新。


// 判断某项功能是否开启 
if (!($openComment = $redis->hGet('site:config', 'openComment'))) {
    // todo
    return false
}
// todo


实时计数器

哈希可以用来实现实时计数器,例如统计网站的访问量、用户的登录次数等,每个计数器对应一个字段,通过增减字段的值来实现计数。

// 访问量+1
$redis->hIncrBy('site:20240322', 'visit', 1);
// 在线数+1
$redis->hIncrBy('site:20240322', 'online', 1);
// 登录次数+1
$redis->hIncrBy('site:20240322', 'login_{uid}', 1);

会话管理

哈希可以用来存储用户会话信息,每个用户的会话信息可以存储为一个哈希,包含用户的登录状态、权限信息等。

$session = [
    'uid' => '',
    'roles' => [],
    'email' => '',
];
$redis->hMSet('session_id', $session);

对象关系映射(ORM)

在应用程序中,可以使用哈希来存储对象之间的关系,例如将用户和其关注的人存储为哈希,可以方便地进行好友关系的管理和查询。

// 用户对象
$redis->hMSet('user:1', []);
$redis->hMSet('user:2', []);
$redis->hMSet('user:3', []);
// 1关注的人
$redis->hset('user:1:follows', 2, 1);
$redis->hset('user:1:follows', 3, 1);
// 获取关注列表
$redis->hKeys('user:1:follows');

用户关注的人用集合处理更合适.

秒杀减库存

比如后台创建秒杀商品时将信息存放在hash中,前台直接扣除hash中的库存字段。

// 代表库存没有了
if ($redis->hIncrBy('goods:1', 'stock', -1) < 0) {
    return '你来晚了';
}
// todo


协作

如果你有更多的场景使用用例,可以通过github提交pr请求。有问题可以开issue编辑此页面