Redis 存储一条用户信息

本文探讨了使用Redis存储用户信息的三种方式:普通key/value结构的两种变体及利用Hash结构的方法。对比了它们各自的优缺点,最终推荐使用Hash结构以达到更好的性能和资源利用率。

一、方式1

如果用普通的key/value结构来存储,主要有以下2种存储方式:

第一种方式将用户ID作为查找key,把其他信息封装成一个对象以序列化的方式存储,

​ 如:set u001 “李三,18,20010101”

​ 这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入CAS等复杂问题。

二、方式2

第二种方法是这个用户信息对象有多少成员就存成多少个key-value对儿,用用户ID+对应属性的名称作为唯一标识来取得对应属性的值,

​ 如:mset user:001:name “李三 “user:001:age18 user:001:birthday “20010101”

​ 虽然省去了序列化开销和并发问题,但是用户ID为重复存储,如果存在大量这样的数据,内存浪费还是非常可观的。

三、最好的办法

那么Redis提供的Hash很好的解决了这个问题,Redis的Hash实际是内部存储的Value为一个HashMap,

​ 并提供了直接存取这个Map成员的接口,

​ 如:hmset user:001 name “李三” age 18 birthday “20010101”

​ 也就是说,Key仍然是用户ID,value是一个Map,这个Map的key是成员的属性名,value是属性值, 这样对数据的修改和存取都可以直接通过其内部Map的Key(Redis里称内部Map的key为field), 也就是通过

​ key(用户ID) + field(属性标签) 操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题。很好的解决了问题。

在比较 Redis 和 PostgreSQL 的存储效率时,需要理解两者的设计目标和应用场景。Redis 是一种内存数据库,数据主要存储在 RAM 中,追求的是高性能和低延迟;而 PostgreSQL 是基于磁盘的数据库,设计目标是持久化存储和复杂查询能力,因此在存储效率上通常优于 Redis。 ### 优化 Redis 存储效率的方法 1. **使用合适的数据结构** Redis 提供了多种数据结构,如 String、Hash、List、Set、Sorted Set 等。选择合适的数据结构可以显著减少内存占用: - 使用 `Hash` 来存储对象,而不是多个 String 键对。 - 使用 `Ziplist` 编码的 List 或 Hash 来节省内存[^3]。 - 使用 `IntSet` 存储整数集合,相比普通 Set 更节省空间。 2. **调整配置参数** Redis 提供了一些配置参数来优化内存使用: - `hash-max-ziplist-entries` 和 `hash-max-ziplist-value` 可控制 Hash 使用 Ziplist 编码的阈。 - `list-max-ziplist-entries` 和 `list-max-ziplist-value` 控制 List 使用 Ziplist 编码的条件[^3]。 - 启用 `Redis 模块(RedisJSON)` 处理 JSON 数据时更高效。 3. **压缩数据** 对于较长的字符串或二进制数据,可以在客户端进行压缩后再写入 Redis,读取时再解压。例如使用 GZIP 压缩数据,可有效降低内存消耗。 4. **使用 Redis 的整数集合(IntSet)** 如果存储的是整数集合,Redis 的 IntSet 结构会比普通的 Set 更节省内存。 5. **淘汰策略优化** 如果 Redis 内存已满,可以通过配置合适的淘汰策略(如 `allkeys-lru` 或 `volatile-lru`)来保留热点数据,避免频繁写入数据导致内存溢出[^1]。 6. **使用 Redis 的模块扩展** 如 RedisJSON、RedisTimeSeries 等模块提供了针对特定数据类型的优化存储方式。 ### PostgreSQL 存储优化方法 PostgreSQL 作为关系型数据库,其存储效率依赖于表结构设计和数据类型选择: 1. **合理选择数据类型** PostgreSQL 支持丰富的数据类型,应根据实际需求选择最紧凑的数据类型。例如: - 使用 `SMALLINT` 而不是 `INTEGER`。 - 使用 `CHAR(n)` 而不是 `VARCHAR(n)` 当长度固定时。 - 使用 `DATE` 而不是 `TIMESTAMP` 如果不需要时间部分。 2. **规范化与反规范化权衡** 数据库规范化有助于减少冗余,但过度规范化可能增加 JOIN 操作开销。对于读多写少的场景,适当反规范化可以提高性能并减少存储碎片。 3. **使用 TOAST 技术** PostgreSQL 对大字段(如 TEXT、JSONB)采用 TOAST(The Oversized-Attribute Storage Technique)机制,将大字段外存存储以减少主表体积。 4. **定期执行 VACUUM 和 REINDEX** 频繁更新操作会导致表膨胀和索引碎片,定期运行 `VACUUM FULL` 和 `REINDEX` 可以回收空间并优化存储。 5. **启用压缩** PostgreSQL 支持使用外部扩展(如 `pglz`、`TOAST`)对数据进行压缩存储。 ### 示例:使用 Redis Hash 存储用户信息 ```python # 用户信息存储为 Hash redis.hset("user:1001", mapping={ "name": "Alice", "age": 30, "email": "alice@example.com" }) ``` 相比之下,如果使用多个 String 键: ```python redis.set("user:1001:name", "Alice") redis.set("user:1001:age", 30) redis.set("user:1001:email", "alice@example.com") ``` 后者将占用更多内存,因为每个键都包含额外的元数据开销。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值