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

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

介绍

redis 中哈希键值结构:

1240

可以看出:哈希键值包括 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

1240

hexists、hlen

1240

hmget、hmset

1240

实战

  1. 实现如下功能:记录网站每个用户个人主页的访问量
hincrby user:1:info pageview count
  1. 实现如下功能:缓存视频的基本信息(数据源在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
StringHash
gethget
set setnxhset hsetnx
delhdel
incr incrby decr decrbyhincrby
msethmset
mgethmget
用户信息的实现
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不好控制

转载于:https://www.cnblogs.com/weixuqin/p/10931833.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值