在谈选择使用hash还是string存储之前,先了解一下Redis的hash和string结构。以下资料引用自老钱的Redis深度奇遇。stringstring和hash都是Redis的一种数据结构。字符串结构常用于缓存用户信息。通常使用JSON将用户信息结构序列化为字符串,然后将序列化后的字符串存入Redis进行缓存。Redis字符串是可以修改的动态字符串。内部结构类似于Java的ArrayList。它使用预先分配的冗余空间来减少内存的频繁分配。如上图所示,实际为当前字符串分配的内部空间容量一般要高于实际字符串长度len。使用的指令包括set、get、mset、mget等。hashRedis的hash相当于Java的HashMap,其内部结构与HashMap一致,即数组+链表结构。但是Redis的hash值只能是字符串,rehash的方式不同。为了提高性能,Redis保留了新旧哈希结构,并采用了渐进式rehash策略。查询时,会同时查询这两个哈希结构。在后续的定时任务和hash操作说明中,旧hash的内容会逐步迁移到xinhash。,直到旧哈希被完全替换。hash去掉最后一个元素后,会自动删除,回收内存。前面说了字符串适合存储用户信息,哈希结构也可以存储用户信息,但是每个字段都是单独存储的,所以查询的时候可以获取到部分字段的信息,节省网络流量。于是就引出了这篇文章,存储结构信息的是hash还是string?以下信息来自StackOverflowRedisstringsvsRedishashestorepresentJSON:efficiency?我想将JSON有效负载存储到redis中。我真的有两种方法可以做到这一点:1.一种使用简单的字符串键和值。键:用户,值:有效载荷(整个JSONblob可以是100-200KB)SETuser:1payload2。UsinghashesHSETuser:1username"someone"HSETuser:1location"NY"HSETuser:1bio"STRINGWITHOVER100lines"请记住,如果我使用散列,值长度是不可预测的。它们并不都像上面的生物示例那样短。哪个内存效率更高?使用字符串键和值,还是使用散列?用户也是同样的问题,因为value的长度是不确定的,所以不知道用string存储还是hash存储效率更高。这个问题有开发者很好的回答。这里翻译一下,供大家一起学习讨论。如果有更好的首先答主推荐参考redis官方内存优化文章:https://redis.io/topics/memory-optimization了解官方开发者在内存优化方面是基于哪些考虑.之后,答主列出了四种方案,并给出了每种方案的优缺点1.存储整个对象,这里使用JSON序列化字符串作为keyINCRid:usersSETuser:{id}'{"name":"Fred","age":25}'SADDusers{id}优点:可以认为是“最佳实践”,因为每个对象都是一个全功能键,JSON解析特别块状,尤其是一次查询很多字段缺点:如果只查询一个字段,速度会比较慢2.将每个对象的属性存储在hash中INCRid:usersHMSETuser:{id}name"Fred"age25SADDusers{id}优点:这样也可以做认为是最好的时机。每个对象都是一个功能齐全的密钥。不需要解析JSON字符串缺点:如果要查询对象的所有字段,会比较慢。嵌套类型的对象(即对象仍然包裹在对象中)不容易存储3.将对象转换成JSON字符串存储在哈希结构中INCRid:usersHMSETusers{id}'{"name":"Fred","age":25}'这个方案只能用两个key,不需要很多key。但是不可能为每个用户对象都设置TTL(TimetoLive),因为对象只是hash中的一个字段,并不是一个全功能的key优点:JSON解析非常快,特别是一次查询多个字段的时候,对主键的命名空间污染较少。缺点:如果要存储很多对象,内存占用与方案一相当。当只需要查询一个字段时,会比方案二慢。受访者认为这不是“最佳实践”4.将一个对象的每个属性存储为一个单独的keyINCRid:usersSETuser:{id}:name"Fred"SETuser:{id}:age25SADDusers{id}根据上面的文章,也就是redis内存优化,不推荐这种方案(除非对象的属性需要专门设置TTL或者其他设置)。优点:对象的属性是一个全功能键,更适合应用。缺点:速度慢,内存更贵,不是“最佳实践”。主键的命名空间有很多污染。一般来说,选项4是最不推荐的。选项1和选项2非常相似,也很常见。受访者更喜欢选项1,因为此选项允许存储更复杂的对象(即对象可以有多层嵌套)。方案三通常用在对namespace要求比较多的场景,比如不想key太多,不关心TTL等参数。参考《Redis深度历险》https://juejin.im/book/5afc2e...https://stackoverflow.com/que...
