当前位置: 首页 > article >正文

Redis学习笔记之——数据类型篇(一)

Redis的五种基本数据类型(String、Hash、List、Set、Zset)以及三种特殊数据类型(HyperLogLog、Bitmap、Geospatial)学习记录。

一、基础数据结构

  • String(字符串)

    • 描述:String是Redis中最基本的数据结构,可以存储任意类型的数据,如数字、文本、序列化的对象等。
    • 最大容量:单个String类型的值最大可以存储512MB的数据。
    • 编码方式:根据存储的数据类型和大小,String类型会采用不同的编码方式,包括int编码(整数表示,节省内存)、embstr编码(小字符串优化)和raw编码(大字符串或无法表示为整数的字符串)。
    • 底层数据结构:简单动态字符串(SDS)。相比于C的原生字符串,Redis的SDS不仅可以保存文本数据,还可以保存二进制数据,并且获取字符串长度复杂度为O(1)。

    • 实现原理:Redis使用自己构建的SDS来表示字符串,而不是直接使用C的字符串。SDS提供了更丰富的功能和更高的性能。

    • 应用场景:常用于缓存数据、计数器、存储序列化对象等。
    • 常用操作命令

      • SET key value:设置指定key的值。
      • GET key:获取指定key的值。
      • INCR key:将key中储存的数字值增一。
      • DECR key:将key中储存的数字值减一。
      • MSET key1 value1 key2 value2 ...:设置一个或多个指定key的值。
      • MGET key1 key2 ...:获取一个或多个指定key的值。
      • STRLEN key:返回key所储存的字符串值的长度。
      • EXISTS key:判断指定key是否存在。
      • DEL key:删除指定的key。
      • EXPIRE key seconds:给指定key设置过期时间。
  • Hash(哈希)

    • 描述:Hash是一个键值对的集合,其中每个键值对的值可以是字符串、列表或其他哈希类型。
    • 内部编码:根据元素数量和大小,Hash类型可以采用ziplist(压缩列表,节省内存)或hashtable(哈希表,支持快速随机访问)作为内部编码。
    • 底层数据结构:ZipList(当哈希表中的字段和值都比较小时)或Dict(当哈希表中的字段和值较大时)。

    • 实现原理:Redis使用哈希表来实现Hash,支持快速的字段查找和删除操作。当哈希表中的字段和值都比较小时,Redis可能会使用ZipList来优化存储和查找性能。

    • 应用场景:适用于存储对象信息,如用户信息等,方便进行查询和更新操作。
    • 常用操作命令

      • HSET key field value:向哈希表添加一个字段和值。
      • HGET key field:获取哈希表中指定字段的值。
      • HDEL key field:删除哈希表中指定的字段。
  • List(列表)

    • 描述:List是一个有序的字符串列表,支持在列表的头部或尾部添加元素,也支持在列表任意位置插入或删除元素。
    • 内部编码:Redis 3.2之前,List的底层实现是LinkedList(双向链表)或ZipList(压缩列表);Redis 3.2之后,引入了QuickList(快速列表),它是LinkedList和ZipList的结合,旨在优化性能和内存使用。从Redis 7.0开始,ZipList被ListPack取代。
    • 底层数据结构:在Redis 3.2之前,List的底层实现是LinkedList或者ZipList。从Redis 3.2开始,引入了QuickList(LinkedList和ZipList的结合),List的底层实现变为QuickList。从Redis 7.0开始,ZipList被ListPack取代。

    • 实现原理:Redis使用双向链表来实现List,支持反向查找和遍历。QuickList结合了LinkedList和ZipList的优点,提供了更高的性能和更灵活的内存使用

    • 应用场景:常用于实现消息队列、时间序列、排行榜等功能。
    • 常用操作命令

      • RPUSH key value1 value2 ...:在指定列表的尾部添加一个或多个元素。
      • LPUSH key value1 value2 ...:在指定列表的头部添加一个或多个元素。
      • LPOP key:移除并获取指定列表的第一个元素。
      • RPOP key:移除并获取指定列表的最后一个元素。
      • LRANGE key start end:获取列表指定范围内的元素。
      • LLEN key:获取列表元素的数量。
  • Set(集合)

    • 描述:Set是一个无序的字符串集合,其中每个元素都是唯一的,不允许重复。
    • 内部编码:根据元素类型和数量,Set类型可以采用intset(整数集合,节省内存)或hashtable(哈希表,支持快速随机访问)作为内部编码。
    • 底层数据结构:Intset(当集合中的元素都是整数时)或Hash(当集合中的元素不是整数时)。

    • 实现原理:Redis使用哈希表来实现Set,支持快速的成员查找和删除操作。当集合中的元素数量较少且都是整数时,Redis可能会使用Intset来优化存储和查找性能。

    • 应用场景:适用于需要存储一组不重复的数据,并支持集合操作的场景,如标签系统、好友关系等。
    • 常用操作命令

      • SADD key member1 member2 ...:向集合添加一个或多个成员。
      • SREM key member1 member2 ...:移除集合中一个或多个成员。
      • SMEMBERS key:返回集合中的所有成员。
  • Zset(有序集合)

    • 描述:Zset是一个有序的字符串集合,与Set类似,但每个元素都关联一个分数,用于排序。
    • 内部编码:通常采用skiplist(跳跃表)和ziplist(压缩列表,当元素较少且较小时使用)作为内部编码。
    • 底层数据结构:SkipList(跳跃表)和Dict(哈希表)。

    • 实现原理:Redis使用跳跃表和哈希表的组合来实现Zset,支持快速的成员查找、删除和按分数排序操作。跳跃表提供了高效的按分数查找和范围查询性能,而哈希表则用于快速的成员查找和删除操作。

    • 应用场景:适用于需要存储一组有序的数据,并支持排序和范围查询的场景,如排行榜、时间序列查询等。
    • 常用操作命令

      • ZADD key score1 member1 score2 member2 ...:向有序集合添加一个或多个成员,或者更新现有成员的分数。
      • ZREM key member1 member2 ...:移除有序集合中一个或多个成员。
      • ZRANGE key start stop [WITHSCORES]:按照分数从小到大返回有序集合中的指定范围的成员和分数。

二、特殊数据结构

  • Geo(地理位置)

    • 描述:Geospatial是Redis 3.2版本新增的一种用于处理地理位置信息的数据类型。它支持存储地理坐标(经度和纬度)并可以对这些坐标进行地理空间相关的查询和计算,比如计算两个地理位置之间的距离、查找指定范围内的地理位置等。
    • 应用场景:适用于需要处理地理位置信息的场景,如基于位置的推荐系统、地图应用等。
    • 常用操作命令

      • GEOADD key longitude latitude member:向地理空间集合添加一个地理位置(经纬度、成员)。
      • GEOPOS key member [member ...]:从地理空间集合中获取一个或多个地理位置的坐标。
      • GEODIST key member1 member2 [unit]:计算两个地理位置之间的距离。
      • GEORADIUS key longitude latitude radius unit [withcoord] [withdist] [withhash] [COUNT count] [SORT order]:根据给定的经纬度为中心和半径范围来查询地理位置集合中的成员。
      • GEORADIUSBYMEMBER key member radius unit [withcoord] [withdist] [withhash] [COUNT count] [SORT order]:根据给定的地理位置成员和其周围的半径范围来查询地理位置集合中的成员。
  • HyperLogLog(基数统计)

    • 描述:HyperLogLog是Redis 2.8.9版本新增的一种用于统计基数的数据集合类型。基数统计是指统计一个集合中不重复元素的个数。与Set和Hash类型相比,HyperLogLog非常节省空间,它只需要花费12KB内存就可以计算接近2^64个元素的基数。但需要注意的是,HyperLogLog的统计规则是基于概率完成的,因此它给出的统计结果是有一定误差的,标准误算率是0.81%。
    • 应用场景:适用于需要统计大量数据的唯一元素数量的场景,如用户访问量统计、网页UV统计等。
    • 常用操作命令

      • PFADD key element1 element2 ...:向HyperLogLog添加新元素。
      • PFCOUNT key:返回HyperLogLog的基数统计结果。
      • PFMERGE destkey sourcekey1 sourcekey2 ...:将多个HyperLogLog合并为一个新的HyperLogLog。
  • Bitmaps(位图)

    • 描述:Bitmap是Redis中的一种数据结构,用于表示位图(bit array),由0和1状态表现的二进制位的bit数组。Bitmap是属于Redis的String数据类型的一种特殊用法。Redis中一个字符串类型的值最多能存储512MB的内容,每个字符串由多个字节组成,每个字节又由8个Bit位组成。
    • 应用场景:适用于需要存储和操作二进制数据的场景,如用户签到记录、布隆过滤器等。
    • 常用操作命令

      • SETBIT key offset value:设置指定key在offset位置的bit值为value(0或1)。
      • GETBIT key offset:获取指定key在offset位置的bit值。
      • BITCOUNT key [start end]:统计指定key的bit数组中值为1的bit的数量。
      • BITOP operation destKey key [key ...]:对一个或多个key进行位操作,并将结果保存到destKey中。操作类型包括AND(逻辑与)、OR(逻辑或)、XOR(逻辑异或)和NOT(逻辑非)。


http://www.kler.cn/a/455689.html

相关文章:

  • WPF使用资源定义和样式资源,解耦视图与逻辑(较多样式重复的时候使用)
  • SQL 实战:日期与时间函数 – 统计数据的时间跨度与趋势
  • Excel无法插入新单元格怎么办?有解决方法吗?
  • 【UE5 C++课程系列笔记】13——GameInstanceSubsystem的简单使用
  • 【C++】19___set / multiset 容器
  • 2024-12-24 NO1. XR Interaction ToolKit 环境配置
  • JVM简介—3.JVM的执行子系统
  • 【单片机通讯协议】—— 常用的UART/I2C/SPI等通讯协议的基本原理与时序分析
  • 关键客户转化为会员的重要性及 “开源 AI 智能名片 2 + 1 链动模式商城小程序” 在其中的应用剖析
  • 园区网综合拓扑实验
  • 正则表达式(三剑客之awk)
  • Edge SCDN酷盾安全重塑高效安全内容分发新生态
  • DevNow x Notion
  • 【python因果库实战13】因果生存分析2
  • STM32-笔记11-手写带操作系统的延时函数
  • 笔记:使用python对飞书用户活跃度统计的一个尝试
  • Go Redis实现排行榜
  • 神经网络-ResNet
  • 【社区投稿】自动特征auto trait的扩散规则
  • Effective C++ 条款32:确定你的 public 继承塑模出 is-a 关系
  • Pytorch | 利用IE-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
  • 如何在 Spring Boot 微服务中设置和管理多个数据库
  • 对外发PDF设置打开次数
  • Python机器学习笔记(十五、聚类算法的对比和评估)
  • 【JavaEE进阶】@RequestMapping注解
  • 《一文读懂BP神经网络:从原理到应用》