redis 学习(4)-- 哈希类型
redis 学习(4)-- 哈希类型
介绍
redis 中哈希键值结构:
可以看出:哈希键值包括 key,field,value 这三部分,即键,属性,值这三部分。可以这样来表示:
key, (field, value)
即将 key, (field, value) 看成一组键值对,将 field, value 看成另一组键值对。
其中:
field 不能相同,value 可以相同
哈希其实就是一个 small redis。
API 介绍
命令 | 含义 |
---|---|
hget key field | 获取存储在哈希表中指定field的值 |
hset key field value | 将哈希表中指定field的值设置为value |
hdel key field1 [field2...] | 删除哈希表中一个或多个field |
hexists key field | 判断哈希表中,指定field是否存在 |
hlen key | 获取哈希表中字段的数量 |
hmget key field1 [field2...] | 取哈希表中所有给定field的值 |
hmset key field1 value1 [field2 value2...] | 同时将一个或多个field-value对设置到哈希表中 |
hincrby key fiel increment | 为哈希表中指定field的值加上一个整型增量 |
hsetnx key field value | 只有当哈希表中field不存在时,才设置该field的值 |
hincrbyfloat key field increment | 为哈希表中指定field的值加上一个浮点数增量 |
不建议使用的 API
hgetall key
- 含义:获取哈希表中所有字段和值
- 时间复杂度为O(n),不建议使用
hkeys key
- 含义:获取哈希表中的所有字段
- 时间复杂度为O(n),不建议使用
hvals key
- 含义:获取哈希表中的所有值
- 时间复杂度为O(n),不建议使用
演示
hget、hset、hdel
hexists、hlen
hmget、hmset
实战
- 实现如下功能:记录网站每个用户个人主页的访问量
hincrby user:1:info pageview count
- 实现如下功能:缓存视频的基本信息(数据源在MYSQL中)伪代码
public VideoInfo get(long id) {
String redisKey = redisPrefix + id;
Map<String,String> hashMap = redis.hgetAll(redisKey);
VideoInfo videoInfo = transferMapToVideo(hashMap);
if (videoInfo == null) {
videoInfo = mysql.get(id);
if (videoInfo != null) {
redis.hmset(redisKey, transferVideoToMap(videoInfo));
}
}
return videoInfo;
}
将数据缓存在哈希表中,做序列化,然后取出来,做反序列化。
String 和 Hash 比较
相似的 API
String | Hash |
---|---|
get | hget |
set setnx | hset hsetnx |
del | hdel |
incr incrby decr decrby | hincrby |
mset | hmset |
mget | hmget |
用户信息的实现
1. String 实现
set user:1:serialize(userinfo)
将用户信息序列化为 json、xml、protobuf 等对象,需要的时候再取出来。
2. String 实现 (V2)
set user:1:age 41
set user:1:link tv.sohu.com
将用户的每项信息依次设置 key 和 value。
3. Hash 实现
hset user:1:info: age 41
hset user:1:info link tv.sohu.com
将用户信息存到 哈希表中。
三种方案比较
命令 | 优点 | 缺点 |
---|---|---|
string v1 | 编程简单;可以节省内存 | 序列化开销;设置属性要操作整个数据 |
string v2 | 直观;可以部分更新 | 内存占用较大;key较为分散 |
hash | 直观;节省空间;可以部分更新 | 编程稍微复杂;ttl不好控制 |