×

redis 数据库编程

Redis Api的使用和理解之哈希

feihu1996 feihu1996 发表于2020-05-17 16:55:01 浏览21 评论0

抢沙发发表评论

三、哈希类型

1、哈希键值结构

1.1 key

字符串

1.2 value

field1 value1 field2 value2 ...

1.3 特点

Mapmap?: map 里还有map

small redis: redis里面的小redis

field不能相同,value可以相同

2、命令

2.1 hget

hget key field

获取hash key对应的field的value

时间复杂度为O(1)

2.2 hset

hset key field value

设置hash key对应field的value

时间复杂度为O(1)

2.3 hdel

hdel key field

删除hash key对应的field的value

时间复杂度为O(1)

2.4 hexists

hexists key field

判断hash key是否有field

时间复杂度是O(1)

2.5 hlen

hlen key

获取hash key field的数量

时间复杂度为O(1)

  • 内置计数器,实时记录key field的数量
  • 无需遍历

2.6 hgetall

hgetall key

获取key所有的属性值对

时间复杂度为O(n)

不建议在生产环境中使用

2.7 hvals

hvals key

返回hash key所有对应field的value

时间复杂度为O(n)

2.8 hkeys

hkeys key

返回hash key所有对应field

时间复杂度为O(n)

2.9 hmget

hmget key field1 field2 field3 ...

批量获取hash key的一批field对应的值

时间复杂度为O(n)

2.10 hmset

hmset key field1 value1 field2 value2 ...

批量设置hash key的一批field value

时间复杂度为O(n)

2.11 hsetnx

hsetnx key field value

设置hash key对应的field的value(如果field已经存在,则失败,返回0)

时间复杂度O(1)

2.12 hincrby

hincrby key field intCounter

设置hash key对应的field的value自增intCounter

时间复杂度O(1)

2.13 hincrbyfloat

hincrbyfloat key field floatCounter

hincrby浮点数版

时间复杂度O(1)

3、实战

3.1 记录网站每个用户个人主页的访问量

hincrby user:1:info pageview access _count

3.2 缓存视频的基本信息(数据源在MySQL中)

hset videoId hashMap

client通过videoId向app server发起请求

app server通过videoId向redis发起请求

如果redis中存在对应的视频基本信息,则直接返回给app server,app server返回给client

如果redis中不存在对应的视频基本信息,app server则通过videoId向db server发起请求,db server将数据返回给app server,app server返回给client,同时将数据放进redis

4、hash vs string

相似的api

4.1 字符串

get

set setnx

del

incr incrby decr decrby

mset

mget

4.2 哈希

hget

hset hsetnx

hdel

hincrby

hmset

hmget

4.3 例:更新用户属性

字符串 v1

  • 保存的是一个序列化后的字符串
    set user:1 serialize(userinfo)
  • 优点
    • 编程简单
    • 可能节约内存

      取决于序列化方法

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

字符串 v2

  • 不同的用户属性保存到不同的字符串键值
    set user:1:age 41
  • 优点
    • 直观
    • 可以部分更新
  • 缺点
    • 内存占用较大
    • key较为分散

哈希

  • 保存的是一个完整的对象
    hset user:1:info name 123 age 18
  • 优点
    • 直观
    • 节省空间: 内存优化
    • 可以部分更新
  • 缺点
    • 编程稍微复杂
    • ttl 不好控制

群贤毕至

访客