📌
notes
  • Introduction
  • Java
    • JavaSE学习
    • 基础
    • 集合
    • 并发
    • JVM
      • GraalVM
    • I/O
    • Java8
    • Java9
    • Java学习常见问题汇总
      • 阿里巴巴Java开发手册
    • 读书和笔记
  • 常用框架
    • Disruptor
    • Guava
    • apache-commons框架
    • Servlet
    • Guice
    • Crypto
    • 字节码框架ASM
    • jOOQ
    • logging框架
    • JSON框架
    • Reflect反射
    • YAML框架
    • XML框架
    • JVM序列化框架
    • String字符串压缩
    • 序列化和反序列化
      • Avro
    • FastDFS
    • Quartz
    • JFinal
    • UUID
    • Objenesis框架
    • Proxy代理
    • Java和Kotlin、Groovy、Scala的代码和相互调用
    • 其他框架
  • MQ消息组件
    • Pulsar
    • RocketMQ
    • Kafka
      • Kafka部署
      • Kafka命令
      • Kafka运维问题
    • Jafka
    • InLong
    • RabbitMQ
    • ActiveMQ
    • OpenMessaging
    • MQTT
    • OpenMQ
    • ZeroMQ
    • HiveMQ
    • HornetQ
    • Artemis
    • Nanomsg
    • 自己做过的消息组件
  • 远程通讯和RPC框架
    • Netty
    • MINA
    • Hession
    • t-io
    • xSocket
    • Grizzly
    • Dubbo
    • gRPC
    • Thrift
    • Finagle
    • Jupiter
    • Motan
    • Tars
    • HSF
    • 自己实现simple RPC
  • CloudNative云原生
    • 容器
    • Docker
    • Kubernetes
    • Istio
    • Pouch
    • 其他
      • Docker镜像站国内网站
  • Reactive响应式编程
    • Reactor
    • ReactiveX
    • WebFlux
    • RSocket
    • Akka
    • Ratpack
  • 架构和设计
    • 设计模式
    • TDD、BDD和DDD
    • 接口幂等性设计
    • 权限设计
  • 分布式
    • 分布式算法
    • 分布式事务与一致性算法
    • 分布式事务框架
    • 常见分布式集群选举机制总结
    • 分布式锁实现
    • 分布式ID
    • 分布式缓存
    • 分布式存储系统
    • 分布式数据库
  • 数据结构与算法
    • 数据结构
      • 数据结构学习
      • 各种树的复杂度和原理
    • 算法
      • 常见算法
      • 递归算法
      • [Top K 之海量数据找出现次数最多或,不重复的](docs/tech/Algorithm/Top K之海量数据找出现次数最多或不重复的.md)
      • 256M的内存如何对16g的数组进行排序
      • 比较两个大文件的重复数据的算法
      • 负载均衡原理、种类和算法
  • 网关
    • API服务网关
      • Zuul2
      • Zuul1
      • Kong
    • 代理服务器
      • Nginx
      • Tengine
      • LittleProxy
      • Apache HTTP
    • 限流熔断
      • Sentinel
      • Resilience4j
      • Eureka
      • SnowJena
  • 模块化和类隔离
    • sofa-jarslink
    • Pandora
    • Java9
    • JarsLink
  • 网络和HTTP
    • HTTP客户端
      • Unirest
      • Feign
      • HttpClient
      • OkHttp
      • http-jersey
      • JDK NIO/BIO
      • HTTP和HTTPS、TCPIP、ajax、OSI七层协议、TCPIP四层协议
      • IP地址分类-内网IP
      • NAT和UDP穿孔打洞、HTTP隧道
      • DNS域名
      • 常用的DNS服务器
  • 缓存和KV数据库
    • Redis
      • Redis运维命令
      • Redis为什么默认16个数据库
      • Redis端口由来和命令前缀PF由来
      • 几款开源的图形化Redis客户端管理软件
      • Redis数据类型
      • Redis线程模型
      • Redis集群规范
      • Redis数据文件解析和内存分析
      • Bitmap介绍
      • Redis集群客户端命令
      • Redis快的秘诀
      • Redis的过期策略和内存淘汰策略
    • Memcached
    • Caffeine
    • JetCache
    • JCache
    • GuavaCache
    • ConcurrentLinkedHashMap
    • EhCache
    • Hazelcast
    • Codis
    • Tair
  • 注册中心和配置中心
    • 注册中心
      • ZooKeeper
      • Nacos
      • Etcd
      • Consul
      • ZKWeb
    • 配置中心
      • Apollo
      • Disconf
      • XDiamond
      • XXL-CONF
  • 系统监控
    • 进程监控
      • Prometheus
      • Zabbix
    • 在线诊断工具
      • JVM SandBox
      • Anthas
      • BTrace
      • Greys-Anatomy
      • HouseMD
  • 数据库
    • 数据库产品
      • MySQL
        • MySQL时区问题
      • Oracle
      • OceanBase
      • MongoDB
    • 数据库操作框架
      • DataSource
      • MyBatis
      • MyBatis-Plus
      • Hibernate
      • ThinkJD
      • JOOQ
    • 数据库中间件
      • MyCat
      • Druid
      • ShardingSphere
      • Zdal
    • 轻量级数据库
      • H2
      • SQLite
      • Derby
      • InfluxDB
    • 数据迁移
      • Yugong
    • Liquibase
    • Otter
    • 数据库工具
      • DataGrip
      • Navicat
      • PL/SQL Developer
      • PL/SQL
  • 大数据处理
    • 流处理
      • Flink
      • JStorm
      • Storm
      • Flume
      • Spark
      • Beam
      • Samza
      • Hadoop
      • HBase
      • druid-io
    • 搜索
      • Elasticsearch
      • Lucene
      • Solr
    • Spider爬虫
      • Jsoup
      • Crawler4j
  • SOFA
    • sofa-rpc
    • sofa-mesh
    • sofa-boot
    • sofa-bolt
    • sofa-ark
    • sofa-jarslink
  • Netflix
    • zuul2
    • zuul1
    • Eureka
    • Hystrix
    • Ribbon
    • Turbine
    • Archaius
    • Governator
  • Micronaut Framework
    • XXX
  • WebService
    • XXX
  • Web应用容器
    • Jetty
    • Tomcat
    • Undertow
    • JBoss
    • Jersey
    • QuickServer
    • WebLogic
    • WebSphere
  • Linux
    • 查看Linux基本属性信息
    • 查看Linux下CPU占用情况
    • 查看LINUX进程内存占用情况
    • 查看Linux下端口占用情况
  • Spring
    • SpringBoot
      • websocket
      • web
      • sqlite
      • mybatis-generator
      • tkmapper
      • swagger
      • webflux
      • starter
      • security
      • kafka
      • cache
      • activemq
      • actuator
      • admin
      • druid
      • jooq
      • kafka
      • multidatasource
    • SpringCloud
      • zuul
      • stream
      • web
      • sleuth
      • example
      • hystrix
      • eureka
      • consul
      • config
    • SpringMVC
      • kafka
      • jooq
      • example
      • annotation
      • activemq
    • SpringData
      • solr
      • redis
      • elasticsearch
  • 测试
    • 单元测试
      • JUnit
      • TestNG
      • Arquillian
    • Mock测试
      • Mockito
      • Spock
      • Moco框架
    • 压力测试
      • JMeter
      • LoadRunner
    • 自动化测试
      • Selenium
    • 基准测试
      • JMH
  • 物联网IoT
  • 运维
    • 日常遇到的问题
  • 操作系统OS
    • Linux
      • 操作系统
      • CPU工作原理
      • Linux环境变量修改
      • Linux用户空间与内核空间、地址空间
      • TCP参数
      • 多进程和多线程的区别
      • 操作系统-内存管理机制
    • MAC
      • MacOS使用
      • Mac软件安装
      • Homebrew
      • Darwin操作系统
      • Kap录屏软件
      • Mac让终端走代理的几种方法
    • Windows
      • Windows介绍
      • Batch批处理-CMD-MS-DOS
  • 其他语言
    • 编程语言
    • Golang
    • Python
    • Lua
    • Erlang
    • Ruby
    • C++/C
    • C#语言
  • 新技术
    • 区块链
      • Ethereum以太坊
      • Bitcoin
      • NFT
    • 机器学习
    • tensorflow
    • 人工智能技术
    • 蚂蚁金服共享智能技术实践:如何降低数据共享的难度
    • 人工智能
    • CloudComputing云计算
    • EdgeComputing边缘计算
    • GraphRAG
  • 前端开发
    • VueJS
    • Angular
    • Bootstrap
    • ECharts
    • RequireJS
    • zTree
    • Layui
    • JavaScript
  • 开发工具
    • 版本控制系统VCS
      • SVN学习
      • Git
        • Git常用命令
        • Git命令学习
        • Github学习
        • GitLab
        • Git-flow
        • Mac通过git统计代码行数
        • 巧用GithubAction同步代码到Gitee
        • 通过Git分支来规范代码上线流程
      • Mercurial
    • Gitbook
    • 集成开发环境IDE
      • IDEA
        • IDEA学习
        • IDEA插件
        • IDEA注释配置
        • IDEA热加载工具JRebel
        • [Mac下IntelliJ IDEA快捷键大全](docs/Tools/IDE/IDEA/Mac下IntelliJ IDEA快捷键大全.md)
      • Eclipse
        • Eclipse快捷键
        • Eclipse插件安装
        • 使用Eclipse进行远程调试
    • Nexus
    • 项目管理
      • Maven
        • Maven中optional和scope元素的使用
      • Gradle
      • Ant
      • Ivy
    • 代码扫描
      • SonarQube
      • PMD
      • FindBugs
      • Checkstyle
    • DevOps工具
      • Jenkins
    • Blog文章笔记写作系统
      • 写文章的模板
      • GitHubPages写博客方法
    • 文件格式
      • Pandoc标记语言转换工具
      • AsciiDoc文件
      • Markdown文件
        • Markdown语法
        • md模板
        • Markdown语法模板
        • Typora模板
  • 技术其他
    • 技术圈的反对种族歧视
    • 系统名词
  • Interview面试
    • 面试学习技术网站
    • 简历和面试
    • 面试指南
    • 备战面试
    • 面经
    • 常见的学习网站
      • 开源组织和公司开源项目地址和网站
      • 框架网站
      • 其他学习网站
      • 待学习
    • 开源项目
  • 读书和笔记
    • Java
      • [Effective Java中文版](docs/Book/Java/Effective Java中文版.md)
      • Java多线程编程核心技术
      • Java编程思想
      • 深入理解Java虚拟机JVM高级特性与最佳实践
      • 码出高效:Java开发手册
      • Java程序性能优化
    • DB数据库
      • 深入浅出MyBatis技术原理与实战
      • 高性能MySQL
    • 网络HTTP
      • 图解HTTP
      • TCPIP详解:卷一
    • Linux
      • 鸟哥的Linux私房菜
    • Netty
      • Netty权威指南
    • Spring
    • Redis
    • Python
      • Python之禅
    • JavaScript
      • JavaScript语言精粹
    • 数据结构算法
      • 大话数据结构
    • 分布式
      • 从PAXOS到ZOOKEEPER分布式一致性原理与实践
    • 并发
      • Java并发编程的艺术
      • Java并发编程之美
      • Java并发编程实战
      • 七周七并发模型
      • 多处理器编程的艺术
    • 架构设计
      • 代码整洁之道
      • 重构
      • 亿级网站架构核心技术
      • 可伸缩服务架构
      • 大型网站技术架构-核心原理与案例分析
      • 大型网站系统与Java中间件实践
      • [Design of Design](docs/Book/架构设计/Design of Design.md)
      • 人月神话-软件项目管理之道
      • 微服务架构设计模式
      • 深入浅出设计模式
      • 面向模式的软件架构
      • 没有银弹-软件工程的本质性与附属性工作
      • 设计模式-可复用面向对象软件的基础
    • Interview面试
      • 剑指Offer
      • 程序员面试宝典
      • 程序员面试金典
    • 技术其他
      • 具体数学
      • 人类网络·社会位置决定命运
      • 性能之巅
      • 浪潮之巅
      • 编写可读代码的艺术
    • 英语
    • 医学
      • 人体使用手册
      • 普通生物学
    • 历史
      • 国史大纲
      • 明朝那些事儿
      • 万历十五年
      • 中国通史
      • 第二次世界大战战史
      • 世界史:从史前到21世纪全球文明的互动
      • 全球通史:从史前史到21世纪
    • 股票
      • 炒股的智慧
    • 其他
      • 上帝掷骰子吗
      • 我不是教你诈
      • 拆掉思维力的墙
      • 最优输运理论专题
      • 说话之道
  • 其他学习
    • 英语
      • 英语学习
      • 英语单词
      • 计算机专业英语
    • 医学
      • 医学常识
      • 腰椎间盘突出治疗
    • 股票
      • 经济名词
      • 股票书籍
    • 历史
      • 中国历史
      • 中国近现代历史
    • 地理
    • 汉语文学
      • 文人
        • 王勃
        • 苏轼
        • 毛泽东诗词
      • 古诗词
        • 满江红·写怀
        • 满江红·登黄鹤楼有感
      • 名言名句
      • 近现代小说
        • 鬼吹灯
      • 三国演义
      • 上帝的指纹
      • 地球编年史
      • 橘子不是唯一的水果
      • 红楼梦
  • 日常常识
    • 搭建梯子VPN
      • VPN的使用
      • V2Ray
      • trojan
      • Shadowsocks影梭
      • SOCKS
      • 内网穿透
    • 电脑组装
      • 电脑DIY
      • CPU和主板
      • 内存和硬盘
      • 帧率FPS和分辨率和像素
    • 硬盘知识
    • 买房购房
    • 收房前预攒钱
    • 汽车
    • 信用卡分类
    • 生活小常识
    • 眼镜
    • 运动健身
    • 游戏Games
      • 常见的游戏
      • 游戏公司
      • 游戏名词
      • 魔兽争霸和魔兽世界
      • 英雄联盟LOL
      • 王者荣耀
    • 影视电影
      • 电影评分网站
      • 美剧
        • 冰与火之歌-权利的游戏
        • 哈利·波特七部
        • 指环王
        • 死亡笔记
      • 动漫
    • 圣经
      • 圣经介绍
    • 神话传说
      • 中国神话传说
      • 佛教
      • 希腊神话
      • 西游记
      • 封神演义
    • 城市介绍
      • 南京
      • 杭州
      • 河南
    • NFC
    • SIM卡的PIN码和PUK码
    • 不可能的物体
    • 中国三大电信公司
    • 八卦和六十四卦
    • 关内、关外、关中、关东
    • 切尔诺贝利核电站爆炸
    • 古代四大文明和七大奇迹
    • 各种单位换算
    • 工作总结和绩效考核
    • 手机OTG功能
    • 方舱医院
    • 移动通信标准和分类
    • 网络流行语
    • 美国常见的公司
    • 美国政治常识
    • 视频处理和图片处理软件
    • 运营知识
    • Google Cloud Platform免费申请
    • 饭圈词汇
    • 常识名词
  • 说明
  • 待办
    • ReadingList
Powered by GitBook
On this page
  • Redis的数据类型的实现是什么数据结构
  • Redis支持七种数据类型的数据结构
  • 跳跃表(SkipList)的原理
  • 其他的4种特殊的数据类型
  • 特殊的4种数据类型的底层数据结构
  • HyperLogLog(基数):String
  • Bitmap(位集合):String
  • BloomFilter(布隆过滤器):String(直接封装自Bitmap)
  • Geospatial(地理空间索引):Sorted Set

Was this helpful?

  1. 缓存和KV数据库
  2. Redis

Redis数据类型

Previous几款开源的图形化Redis客户端管理软件NextRedis线程模型

Last updated 3 years ago

Was this helpful?


Redis的数据类型的实现是什么数据结构

目前Redis6.0官网上明确提出来的数据类型是9种 Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams.

  1. strings,

  2. hashes,

  3. lists,

  4. sets,

  5. sorted sets with range queries,

  6. bitmaps,

  7. hyperloglogs,

  8. geospatial indexes, and

  9. streams

实际确认了下,是7种: 0. String(字符串)

  1. List(列表)

  2. Set(集合)

  3. Sorted Set(有序集合)

  4. Hash(哈希)

  5. module(一个特殊的对象)

  6. Streams(流信息)

证据: 1、源码:t_(type)开头的,有且仅有6个:t_hash.c、t_list.c、t_set.c、t_stream.c、t_string.c、t_zset.c 2、type key命令查看key的类型:bitmaps和hyperloglogs是String,geospatial是zset,streams是stream 3、但是在源码server.h文件中有如下定义

/* The actual Redis Object */
#define OBJ_STRING 0    /* String object. */
#define OBJ_LIST 1      /* List object. */
#define OBJ_SET 2       /* Set object. */
#define OBJ_ZSET 3      /* Sorted set object. */
#define OBJ_HASH 4      /* Hash object. */
/* The "module" object type is a special one that signals that the object
* is one directly managed by a Redis module. In this case the value points
* to a moduleValue struct, which contains the object value (which is only
* handled by the module itself) and the RedisModuleType struct which lists
* function pointers in order to serialize, deserialize, AOF-rewrite and
* free the object.
*
* Inside the RDB file, module types are encoded as OBJ_MODULE followed
* by a 64 bit module type ID, which has a 54 bits module-specific signature
* in order to dispatch the loading to the right module, plus a 10 bits
* encoding version. */
#define OBJ_MODULE 5    /* Module object. */
#define OBJ_STREAM 6    /* Stream object. */

参考

Redis支持七种数据类型的数据结构

  • String:字符串。byte 数组, 可以包含任何数据

  • Hash:哈希,字典,二维结构:数组+链表,第一维度:数组,第二维度:链表,哈希表作为字典的底层实现,哈希表使用链表来解决键冲突问题

  • List:列表,链表(双向链表)的实现

  • Set:集合,通过 hash table 实现的

  • Sorted Set(zset):有序集合,Hash+跳跃表,在set的基础上增加了一个标识属性,它可以在set添加或修改元素时指定,每次指定,set会自动按标识调整顺序

  • module

  • stream

一、字符串 Redis使用C语言编写,但是Redis的字符串并没有直接使用C语言传统的字符串,而是自己构建了一种名为简单动态字符串的抽象类型SDS,其本质是个 byte 数组,可以包含任何数据,是二进制安全的。

常用命令:get、set、incr、decr、mget等。

二、字典 Redis使用哈希表作为字典的底层实现,每个字典都有两个哈希表,一个平时使用,另一个仅在进行rehash时使用 哈希表使用链表来解决键冲突问题,被分配到同一个索引上的多个键值对会连接成一个单向链表 redis存入hash结构时, key, hkey, hvalue 均不能为null

常用命令:hget,hset,hgetall 等

三、列表 Redis构建了自己的链表的实现,其特性如下: 1、双端:链表节点提供有prev和next对象,获取某个节点的前置节点和下一个节点的速度为O(1). 2、无环:表头节点prev对象和表尾节点next对象都指向NULL,链表的访问都是以NULL访问为终点. 3、带有表头和表尾对象:通过list结构的head和tail,获取表头和表尾对象的速度为O(1). 4、带有长度计数器:获取链表长度的直接读取len字段值.速度为O(1). 5、多态:通过dup、free、match三个方法,实现链表的多态,保存不同类型的值

list 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

常用命令:lpush(添加左边元素),rpush,lpop(移除左边第一个元素),rpop,lrange(获取列表片段,LRANGE key start stop)等。

四、集合

sorted sets with range queries 带范围查询的排序集合zset

Redis 集合是 string 类型的无序集合。set 元素最大可以包含(2 的 32 次方)个元素。set 是通过 hash table 实现的,hash table 会随着添加或者删除自动的调整大小。调整 hash table 大小时候需要同步(获取写锁)会阻塞其他读写操作。

常用命令:sadd,spop,smembers,sunion 等。

五、有序集合 有序集合(sorted set) 在set的基础上增加了一个标识属性,它可以在set添加或修改元素时指定,每次指定,set会自动按标识调整顺序,set的每一个元素都会关联一个double类型的score。使用时往往我们把要排序的字段作为score存储,对象id则作为元素存储

常用命令:zadd,zrange,zrem,zcard等

实现方式:Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。

六、module

七、Streams(流信息):stream(Redis5.0提供一种建模日志用的全新数据结构)

Stream 是 Redis 5.0 版本引入的一个新的数据类型,支持消费者组,借鉴 Kafka 设计的支持多播的可持久化消息队列(支持 group,不支持 partition)。

Stream是Redis 5.0引入的一种新数据类型,是一个新的强大的支持多播的可持久化的消息队列。

相比于现有的PUB/SUB、BLOCKED LIST,其虽然也可以在简单的场景下作为消息队列来使用,但是Redis Stream无疑要完善很多。Redis Stream提供了消息的持久化和主备复制功能、新的RadixTree数据结构来支持更高效的内存使用和消息读取、甚至是类似于Kafka的Consumer Group功能。

它以更抽象的方式对日志数据结构进行建模,但是日志的本质仍然完好无损:像日志文件一样,通常实现为仅在追加模式下打开的文件, Redis流主要是仅追加数据结构。至少从概念上讲,由于Redis是流式传输在内存中表示的抽象数据类型,因此它们实现了更强大的操作,以克服日志文件本身的限制。

尽管数据结构本身非常简单,但Redis流却成为最复杂的Redis类型的原因在于它实现了其他非强制性功能:一组阻止操作,使消费者可以等待生产者将新数据添加到流中,此外还有一个称为“ 消费群体”的概念。

消费者群体最初是由流行的称为Kafka(TM)的消息传递系统引入的。Redis用完全不同的术语重新实现了一个类似的想法,但是目标是相同的:允许一组客户合作使用同一消息流的不同部分。

Redis stream使用场景:消息队列,和kafka, RocketMq ,RabbitMq等各种消息中间件要按照当前环境的情况和要求合理使用。

使用示例
> XADD mystream * sensor-id 1234 temperature 19.8
1518951480106-0

##上面对XADD命令的调用使用自动生成的条目ID 
##将一个条目添加sensor-id: 1234, temperature: 19.8到key流中mystream,该条目ID是该命令返回的,具体来说是1518951480106-0。
##它以键名作为第一个参数mystream,第二个参数是标识流中每个条目的条目ID。


## 获取Stream中的项目数:
> XLEN mystream
(integer) 1

跳跃表(SkipList)的原理

想想你老家在世界地图中的位置:亚洲-->中国->安徽省->安庆市->枞阳县->汤沟镇->田间村->xxxx号,也是这样一个类似的结构。

「跳跃列表」之所以「跳跃」,是因为内部的元素可能「身兼数职」,比如上图中间的这个元素,同时处于L0、L1和L2层,可以快速在不同层次之间进行「跳跃」。

定位插入点时,先在顶层进行定位,然后下潜到下一级定位,一直下潜到最底层找到合适的位置,将新元素插进去。你也许会问那新插入的元素如何才有机会「身兼数职」呢?

跳跃列表采取一个随机策略来决定新元素可以兼职到第几层,首先L0层肯定是100%了,L1层只有50%的概率,L2层只有25%的概率,L3层只有12.5%的概率,一直随机到最顶层L31层。绝大多数元素都过不了几层,只有极少数元素可以深入到顶层。列表中的元素越多,能够深入的层次就越深,能进入到顶层的概率就会越大。

跳跃表的性质; 1、由很多层结构组成; 2、每一层都是一个有序的链表,排列顺序为由高层到底层,都至少包含两个链表节点,分别是前面的head节点和后面的nil节点; 3、最底层的链表包含了所有的元素; 4、如果一个元素出现在某一层的链表中,那么在该层之下的链表也全都会出现(上一层的元素是当前层的元素的子集); 5、链表中的每个节点都包含两个指针,一个指向同一层的下一个链表节点,另一个指向下一层的同一个链表节点;

跳跃表搜索的基本原理: 其基本原理就是从最高层的链表节点开始,如果比当前节点要大,比当前层的下一个节点要小,那么则往下找,也就是和当前层的下一层的节点的下一个节点进行比较,以此类推,一直找到最底层的最后一个节点,如果找到则返回,反之则返回空。


其他的4种特殊的数据类型

String(字符串)、List(列表)、Set(集合)、Sorted Set(有序集合)、Hash(哈希)、HyperLogLog(基数)、Bitmap(位集合)、Geospatial(地理空间索引)、Streams(流信息)

还有说还包括BloomFilter(布隆过滤器) 因为 BloomFilter 是 Redis 的扩展模块,所以需要额外下载,你可以使用 Docker 进行拉取。安装步骤我不做详细解释,你可以到它的github上学习怎么安装

特殊的4种数据类型的底层数据结构

  1. HyperLogLog(基数):String

  2. Bitmap(位集合):String

  3. BloomFilter(布隆过滤器):String(直接封装自Bitmap)

  4. Geospatial(地理空间索引):Sorted Set

注: Bitmap 和 HyperLogLog是基于String类型,但是拓展了自己的语义 HyperLogLog 底层也是 String 实现,与其说 HyperLogLog 是一种单独的数据类型,倒不如说是对 String 数据类型做 API 封装的应用程序。

Redis中的四种特殊的数据结构 bitmap,hyperLogLog,bloomFilter,GeoHash 。这四种数据结构其实有点类似于算法层面了,比如 GeoHash 其实就是一个 zset,bitmap 就是 string,只是使用的方法不同导致了更多的功能。

所以与其说是新的特殊的5种单独的数据类型,倒不如说是对5种基础的数据类型做的API封装的应用程序, 或者说是5种基础的数据类型的实际应用

HyperLogLog(基数):String

HyperLogLogs(计算基数用的一种数据结构)

会存在误差的数据结构HyperLogLog(基数)

Redis HyperLogLogs(HLL)属于一种概率算法,(LC,LLC,HLL)三种越来越节省内存,降低误差率。

HyperLogLog优点,在输入元素的数量或者体积非常大时。计算基数所需的空间总是固定很小的。每个HyperLogLog的键只需要花费12KB内存,在标准误差0.81%的前提下,就可以计算接近2^64个不同的基数。

用bitmap存储1一亿个统计数据大概需要12M内存;而在HLL中,只需要不到1K内存就能做到。

HyperLogLog只会根据输入元素来计算基数,而不会存储元素本身,所以不能返回各个元素。

HyperLogLog 计数较小时,采用稀疏矩阵存储,空间占用很小,计数超过了阈值时转变成稠密矩阵,占用 12KB 的空间。数据量大时性价比明显优于 set 结构。 一个 pf 项占用内存空间 12KB。 HyperLogLog 不储存元素本身,不能像 set 那样返回输入的元素。

HLL的使用场景:常用来统计一个集合中不重复的元素个数,例如网站PV,搜索关键词数量,数据分析、网络监控及数据库优化等领域。

HLL比 bitmap更节省内存,但有一定误差( 标准误差 0.81%)

PFADD key element [element ...] 添加指定元素到 HyperLogLog 中。 PFCOUNT key [key ...] 返回给定 HyperLogLog 的基数估算值。 PFMERGE destkey sourcekey [sourcekey ...] 将多个 HyperLogLog 合并为一个 HyperLogLog

Bitmap(位集合):String

BitMap位图

位图不是实际的数据类型,而是在String类型上定义的一组面向位的操作。

由于字符串是二进制安全的,最大长度是512MB,转换成位可以设置 2^32不同的位。

512MB = 2^9 * 2^3(byte) * 2^10(kb) * 2^10(mb) = 2^32(bit)

位图的最大优点之一,存储信息时可以节省大量空间。

基本命令使用 setbit key index 0/1 设置某位的值 getbit key index 获取某位的值 bitcount key start end 获取指定范围内为1的数量

BloomFilter(布隆过滤器):String(直接封装自Bitmap)

因为 BloomFilter 是 Redis 的扩展模块,所以需要额外下载,你可以使用 Docker 进行拉取。安装步骤我不做详细解释,你可以到它的github上学习怎么安装

安装完之后我们就可以愉快的使用啦。 bf.add key element 添加元素到布隆过滤器 bf.exists key element 判断元素是否在布隆过滤器 bf.madd key element1 element2 ... 批量添加,添加多个元素到布隆过滤器,bf.add只能添加一个 bf.mexists key element1 element2 ... 批量判断,判断多个元素是否在布隆过滤器

Geospatial(地理空间索引):Sorted Set

Redis Geospatial Indexes(地理空间索引)

GeoHash 常用来计算 附近的人,附近的商店。

在Redis最新的3.2版本中加入了地理空间(geospatial)以及索引半径查询的功能,这在需要地理位置的应用上或许可以一展身手

将制定的地理空间位置(经度、纬度、名称)添加到指定的key中。这些数据将会存储到Sorted set中。目的是为了方便GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作。

sorted set使用一种称为Geohash的技术进行填充。经度和纬度的位是交错的,以形成一个独特的52位整数. 我们知道,一个sorted set 的double score可以代表一个52位的整数,而不会失去精度。

这种格式允许半径查询检查的1 + 8个领域需要覆盖整个半径,并丢弃元素以外的半径。通过计算该区域的范围,通过计算所涵盖的范围,从不太重要的部分的排序集的得分,并计算得分范围为每个区域的sorted set中的查询。

Geospatial indexes使用场景:这里假设地球是一个球体,因为使用的距离公式是Haversine公式。这个公式仅适用于地球,而不是一个完美的球体。当在社交网站和其他大多数需要查询半径的应用中使用时,这些偏差都不算问题。但是,在最坏的情况下的偏差可能是0.5%,所以一些地理位置很关键的应用还是需要谨慎考虑。

基本命令和使用实战 geoadd key longitude latitude element(后面可配置多个三元组) 添加元素 geodist key element1 element2 unit 计算两个元素的距离 geopos key element [element] 获取元素的位置 geohash key element 获取元素hash georadiusbymember key element distanceValue unit count countValue ASC/DESC [withdist] [withhash] [withcoord] 获取元素附近的元素 可附加后面选项[距离][hash][坐标] georadius key longitude latitude distanceValue unit count countValue ASC/DESC [withdist] [withhash] [withcoord] 和上面一样只是元素改成了指定坐标值

官方示例

## 增加意大利西西里岛的两个城市坐标(Palermo和 卡塔尼亚)
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2

## 返回两个给定位置之间的距离。(默认单位米)
redis> GEODIST Sicily Palermo Catania
"166274.1516"

## 以给定的经纬度为中心,返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
## 100m
redis> GEORADIUS Sicily 15 37 100 km
1) "Catania"

## 200m
redis> GEORADIUS Sicily 15 37 200 km
1) "Palermo"
2) "Catania"

Redis在4.0版本推出了 module 的形式,可以将 module 作为插件额外实现Redis的一些功能。官网推荐了一个 作为 Redis 布隆过滤器的 Module。

参考

Redis在4.0版本推出了 module 的形式,可以将 module 作为插件额外实现Redis的一些功能。官网推荐了一个 作为 Redis 布隆过滤器的 Module。

Java 语言的话,RedisBloom项目里有实现

参考

Redis的数据类型的实现是什么数据结构
Redis支持七种数据类型的数据结构
跳跃表(SkipList)的原理
其他的4种特殊的数据类型
RedisBloom
Introduction to Redis Streams
Redis Stream教程
Redis实战 | 5种Redis数据类型详解
redis的5种数据类型和数据结构
Redis的五种数据结构
Redis常用数据类型介绍、使用场景及其操作命令
Redis几种数据类型及应用场景
redis key和value数据类型
Redis 数据类型介绍
Redis中的五种数据类型使用场景
原来Redis常用的五种数据类型底层结构是这样的
Redis命令
五种数据类型常用命令
巧用 Redis Hyperloglog,轻松统计 UV 数据
Redis HyperLogLog
Redis HyperLogLog 用于记录独立总数
玩转Redis-HyperLogLog统计微博日活月活
初识Redis的数据类型HyperLogLog
HyperLogLog&布隆过滤器
Redis 中 HyperLogLog 讲解
初识Redis的数据类型HyperLogLog
Redis应用-HyperLogLog
HyperLogLogs(HLL)的使用
Redis HyperLogLog命令
走近源码:神奇的HyperLogLog
神奇的HyperLoglog解决统计问题
Bitmap介绍
RedisBloom
JReBloom
Redis 高级主题之布隆过滤器(BloomFilter)
Redis 之布隆过滤器(BloomFilter)
RedisBloom: Probabilistic Data Structures for Redis
Redis Bloom Filters : Design for large scale uniqueness verification
BloomFilter基于redis的实现
基于Redis的BloomFilter实现
A distributed bloom filter implementation based on redis
Redis地理空间(geospatial)介绍和简单使用
Redis5.0支持的九种数据类型及使用场景整理(Redis学习笔记)
Redis不是只有5种基本数据类型?