redis中的10大数据类型

  1. 字符串(String)

    stringredis 最基本的数据类型, 一个 key 对应一个 value

    string 类型是 二进制安全 的, 意味着 redisstring 可以包含任何数据, 比如 图片 或者 序列化的对象

    string 类型的值最大占用空间是 512M, 但一般情况下不建议直接将图片存储到 redis 中, 即使这会产生一定的延迟。存储文件路径可以节省内存占用,增添灵活性,使项目易于管理,若使用云存储服务,可以降低许多成本。

  2. 列表(List

    redis 列表是简单的字符串列表, 按照插入顺序排序, 用户可以添加一个元素到列表的头部 或 尾部

    redis list 的底层是一个 双端链表, 最多可以包含 2^32 - 1 个元素

  3. 哈希表(hash)

    redis hash 是一个 sting 类型的 fieldvalue 的映射表, hash 特别适合用于存储对象

  4. 集合(Set)

    SetString 类型的无序集合, 集合成员是唯一的, 这意味着集合中不能出现重复的数据, 集合的对象的编码可以是 Intset 或者 hashtable

    Set 底层由 hash 实现, 所以添加, 删除, 查找的时间复杂度都是 O(1)。

  5. 有序集合(ZSet, sorted set)

    zsetset 一样, 也是 string 类型元素的集合, 且不允许重复的元素

    不同点在于: 每个元素都会关联一个 double 类型的分数, redis 通过分数来为集合中的成员进行从小到大的排序。

    zset 成员是唯一的, 但 score(分数) 可以重复

    zset 集合是通过哈希表实现的, 所以添加, 删除, 查找的时间复杂度都是 O(1)。集合中最大的成员数为 2^32-1

  6. 地理空间(GEO)

    GEO 主要用于存储地理位置信息, 并对存储的信息进行操作, 包括 添加地理位置的坐标, 获取地理位置的坐标, 计算两个位置之间的距离, 根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。

  7. 基数统计(HyperLogLog)

    HyperLogLog 是用来做基数统计的算法, HyperLogLog 的优点是: 在输入元素的数量或体积非常大时, 计算基数所需的空间总是固定且很小的.

    每个 HyperLogLog 键只需要花费 12kb 内存, 就可以计算接近 2^64 个不同元素的基数, 这和计算基数时, 元素越多, 耗费内存越多的集合形成鲜明对比

    但是, 因为 HyperLogLog 只会根据元素来计算基数, 而不会存储输入元素本身, 所以 HyperLogLog 不能像集合那样, 返回输入的各个元素

  8. 位图(bitmap)

    由 0 和 1 状态表现的二进制位的 bit 数组, 多用于只有两种结果的数据中

  9. 位域(bitfield)

    通过 bitfield 命令可以一次性操作多个比特位域(指连续的多个比特位), 它会执行一系列操作并返回一个响应数组, 这个数组中的元素对应参数列表中的相应操作的执行结果。

  10. 流(Stream)

    stream 类似于一个消息队列, redis 本身有一个 redis 发布订阅(pub/sub)来实现消息队列的功能, 但有个缺点就是消息无法持久化, 如果出现网络断开, redis 宕机的情况, 消息就会被丢弃。

    stream 提供了消息的持久化和主备复制功能, 可以让任何客户端访问任何时刻的数据, 并且能记住每一个客户端的访问位置, 还能保证消息不丢失

### Redis大数据场景下的数据类型支持 Redis作为一种高性能的内存数据库,在处理大规模数据集时提供了多种高效的数据结构来满足不同的需求。以下是与大数据相关的几种主要数据类型及其特点: #### 1. **字符串(String)** 尽管字符串是最基本的数据类型,但在大数据场景下,它可以用来存储大容量的键值对数据。通过`SET`和`GET`命令操作单个键值对的同时,还可以利用批量写入的方式提升效率。此外,字符串还支持位图(Bitmaps)、计数器以及超大规模的二进制数据存储。 - 字符串的实际存储形式并非简单的字符序列,而是封装在`redisObject`对象中[^1]。 ```python # Python示例:设置和获取字符串值 import redis r = redis.Redis(host='localhost', port=6379, db=0) r.set('key', 'large_value') print(r.get('key')) ``` --- #### 2. **哈希表(Hash)** 哈希表适合存储具有大量字段的对象模型。对于大数据应用而言,可以通过将复杂对象拆分为多个字段的形式减少冗余,提高查询性能。 - 使用场景包括用户资料缓存、商品属性管理等。 - 支持原子级的操作,如增量更新特定字段的数值。 ```lua -- Lua脚本示例:向哈希表添加字段 local key = KEYS[1] local field = ARGV[1] local value = tonumber(ARGV[2]) if not redis.call("HExists", key, field) then redis.call("HSet", key, field, value) else local current_val = tonumber(redis.call("HGet", key, field)) redis.call("HIncrBy", key, field, value - current_val) end return true ``` --- #### 3. **集合(Set/Sorted Set)** 集合特别适用于去重和交集运算,能够快速筛选出共同特征的数据项。有序集合则进一步扩展了这一能力,允许按照权重排序成员。 - `SInter` 和其他集合操作可以帮助分析不同维度之间的关系。 - 对于推荐系统或者社交网络的好友匹配等功能非常有用。 ```bash # Shell命令示例:计算两个用户的共同兴趣爱好 127.0.0.1:6379> SADD user_1_interests music sports travel (integer) 3 127.0.0.1:6379> SADD user_2_interests movies sports gaming (integer) 3 127.0.0.1:6379> SINTER user_1_interests user_2_interests 1) "sports" ``` --- #### 4. **位图(Bitmaps)** 当需要跟踪海量布尔型标志的状态变化时,位图是一种极为节省空间的选择。例如记录某一天内有多少活跃用户登录过平台。 - 结合`BITCOUNT`统计总数目;借助`BITOP`完成逻辑运算。 - 示例展示了如何基于两位用户的活动情况生成新的统计数据[^3]。 ```sql -- SQL风格伪代码展示:模拟日志解析过程 SELECT BIT_COUNT(BIT_AND(user_2001_bits, user_2002_bits)) AS common_activities; ``` --- #### 5. **流(Stream)** 自Redis 5.0版本引入以来,Streams成为解决分布式事件驱动架构的理想工具之一。相比传统的Pub/Sub机制,它具备更强的消息可靠性和可追溯性。 - Streams不仅保留全部历史消息以便后续消费端重新读取,而且支持消费者组的概念以简化负载均衡分配策略。 - 下面的例子说明了一个生产者发送信息给多个消费者的流程[^2]。 ```javascript // JavaScript Node.js SDK演示:创建一条新纪录并广播出去 const { createClient } = require('redis'); async function publishMessage() { const client = createClient(); await client.connect(); let result = await client.xAdd( 'my_stream', '*', ['event_type', 'purchase'], ['product_id', '123'] ); console.log(`Published message ID ${result}`); } publishMessage().catch(console.error); ``` --- #### 6. **HyperLogLog** 最后提到的是专门针对基数估计设计的一种概率算法——HyperLogLog。即使面对TB级别的原始输入源也能保持较低误差率的同时占用极少资源量。 - 应用于UV统计等领域,即估算一段时间内的唯一访客数量而不必保存每条独立记录的具体身份标识。 ```go package main import ( "fmt" "github.com/go-redis/redis/v8" ) func estimateUniqueVisitors(client *redis.Client) uint64 { err := client.PFAdd(ctx, "unique_visitors", "user_a").Err() if err != nil { panic(err) } count, _ := client.PFCount(ctx, "unique_visitors").Result() return count } fmt.Println("Estimated unique visitors:", estimateUniqueVisitors()) ``` --- ### 总结 以上列举了几类常见的Redis高级特性,它们各自擅长应对不同类型的大规模数据分析挑战。开发者应根据实际业务需求选取最合适的方案组合起来构建完整的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值