首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

redis 学习(3)-- 哈希类型

redis 学习(3)-- 哈希类型

介绍

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

实战

  1. 实现如下功能:记录网站每个用户个人主页的访问量
代码语言:javascript
复制
hincrby user:1:info pageview count

  1. 实现如下功能:缓存视频的基本信息(数据源在MYSQL中)伪代码
代码语言:javascript
复制
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 实现
代码语言:javascript
复制
set user:1:serialize(userinfo)

将用户信息序列化为 json、xml、protobuf 等对象,需要的时候再取出来。

2. String 实现 (V2)
代码语言:javascript
复制
set user:1:age 41
set user:1:link tv.sohu.com

将用户的每项信息依次设置 key 和 value。

3. Hash 实现
代码语言:javascript
复制
hset user:1:info: age 41
hset user:1:info link tv.sohu.com

将用户信息存到 哈希表中。

三种方案比较

命令

优点

缺点

string v1

编程简单;可以节省内存

序列化开销;设置属性要操作整个数据

string v2

直观;可以部分更新

内存占用较大;key较为分散

hash

直观;节省空间;可以部分更新

编程稍微复杂;ttl不好控制

下一篇
举报
领券