likes
comments
collection
share

Redis存储结构体信息是用hash还是string

作者站长头像
站长
· 阅读数 19

先简单回顾下,Redis的hash和string结构。

string

我们可以将用户信息结构体使用JSON序列化成字符串,然后将序列化后的字符串存入Redis进行缓存。

Redis存储结构体信息是用hash还是string

string数据结构

由于Redis的字符串是动态字符串,可以修改,内部结构类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。如上图所示,内部为当前字符串实际分配的空间capacity,一般高于实际字符串长度len。

假设我们要存储的结构是:

{
    "name": "xiaowang",
    "age": "35"
}

如果此时将此用户信息的name改为“xiaoli”,再存到redis中,redis是不需要重新分配空间的。

而且我们在读取和存储数据的时候只需要对做Json序列化与反序列化,比较方便。

hash

Redis的hash相当于Java的HashMap,内部结构实现与HashMap一致,即数组+链表结构。只是rehash方式不一样,

Redis存储结构体信息是用hash还是string

hash数据结构

前面说到string适合存储用户信息,而hash结构也可以存储用户信息,不过是对每个字段单独存储,因此可以在查询时获取部分字段的信息,节省网络流量。不过Redis的hash的值只能是字符串,存储上面的那个例子还好,如果存储的用户信息变为:

{
    "name": "xiaowang",
    "age": 25,
    "clothes": {
        "shirt": "gray",
        "pants": "read"
    }
}

那么该如何存储"clothes"属性又变成了该用string还是hash的问题。

既然两种数据结构都可以存储结构体信息。到底哪种更加合适呢?StackOverflow上也有人问了相同的问题,我们先来看看网友的讨论。

用hash还是string

以下信息出自StackOverflow Redis strings vs Redis hashes to represent JSON: efficiency?

Redis存储结构体信息是用hash还是string

该用户也是同样的疑问, 因为值的长度是不确定的,所以不知道采用string还是hash存储更有效率。

这里主要给大家总结下最高赞的两个答案。

适合用string存储的情况

  • 每次需要访问大量的字段

  • 某些键的值存储差异,不能存储为字符串的时候

适合用hash存储的情况

  • 在大多数情况中只需要访问少量字段

  • 自己始终知道哪些字段可用,防止使用mget时获取不到想要的数据

另外强烈建议参考官方的内存优化的文章:redis.io/topics/memo…,我这里也给出中文网站的文章地址:www.redis.cn/topics/memo…

在官方文档中,作者强烈建议使用hash存储数据:

尽可能使用散列表(hashes)

小散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面.

参考链接

  1. StackOverflow:stackoverflow.com/questions/1…
  2. 官方文档:redis.io/topics/memo…