Redis入门(一):Redis 简介

作者:PHPYuan 时间:2018-07-23 03:41:00

Redis 是什么?

Redis是一个开源(BSD许可)的,利用内存进行存储的数据结构存储系统;它可以用作数据库、缓存和消息中间件。redis由意大利人 Salvatore Sanfilippo 使用C语言开发

redis支持字符串(string)、列表(list)、集合(set)、有序集合(zset)、散列表(hash)五种基本数据结构类型

redis从 2.2.0 版本开始支持bitmap;在 2.8.9 版本添加了 HyperLogLog 用以进行基数统计;在 3.2 版本中新增了对GEO(地理位置)的支持

redis支持简单事物与数据持久化,提供 RDB、AOF两种可选的持久化方式

redis可以用作数据库、缓存、消息队列等

Redis 数据结构

value 对应的五种数据结构

Redis存储key-value键值对数据,其中key类型为字符串,value对应五种数据结构,如下图所示:

value 对应的五种数据结构字符串(string)类型的数据结构,对应的就是一个普通的字符串

散列表(hash)类型的数据结构,对应的就是一个hash table,散列表特别适合用于存储对象

列表(list)类型的数据结构,对应的就是一个双向列表,按照插入顺序排序

集合(set)类型的数据结构,对应的就是一个string类型的无序集合,集合中的数据不能重复出现

有序集合(zset)类型的数据结构, 对应的就是一个string类型的有序集合,排序因子为每个元素附带的一个double型的分数

Redis 核心对象 redisObject

在redis的 key-value存储系统中,value 类型则为 redis 对象 redisObject, redisObject对象可以绑定对应的五种数据类型,如下图所示:

Redis 核心对象 redisObject数据类型(type),对应五种数据类型

编码方式(encoding),指定所绑定数据类型的编码方式

数据指针(ptr), 指向对象底层实现的数据结构

虚拟内存(vm), 该功能默认处于关闭状态,只有打开了redis的虚拟内存功能,才会给vm分配真正的内存

编码方式(encoding)raw RAW编码方式使用简单动态字符串来保存字符串对象,才有预分配空间的方式来避免字符串修改时频繁的分配释放内存

int INT编码方式以整数保存字符串数据,仅限能用long类型值表达的字符串

embstr 从Redis 3.0版本开始字符串引入了EMBSTR编码方式,长度小于OBJ_ENCODING_EMBSTR_SIZE_LIMIT(39)的字符串将以EMBSTR方式存储。采用这个方式可以减少内存分配的次数,提高内存分配的效率,降低内存碎片率。

hashtable 当数据类型无法满足使用ziplist的条件时,Redis会使用hashtable作为数据结构的内部实现

ziplist 列表(List),散列表(Hash),有序集合(Sorted Set)在成员较少,成员值较小的时候都会采用压缩列表(ZIPLIST)编码方式进行存储;成员值”较小”的标准可以通过配置项进行配置;压缩列表简单来说就是一系列连续的内存数据块,其内存利用率很高,但增删改查效率较低,所以只会在成员较少,值较小的情况下使用。

linkedlist 在Redis 3.2版本之前,一般的链表使用LINKDEDLIST编码。在Redis 3.2版本开始,所有的链表都是用QUICKLIST编码。两者都是使用基本的双端链表数据结构,区别是QUICKLIST每个节点的值都是使用ZIPLIST进行存储的。

skiplist 跳跃表(SKIPLIST)编码方式为有序集合对象专用,有序集合对象采用了字典+跳跃表的方式实现;其中字典里面保存了有序集合中member与score的键值对,跳跃表则用于实现按score排序的功能

intset 当一个集合只包含整数值元素, 并且这个集合的元素数量不多时, Redis 就会使用整数集合作为集合键的底层实现

Redis这种通过redisObject指定数据结构编码方式的设计有两个好处:可以改进内部编码,而对外的数据结构和命令没有影响,这样一旦开发开发出优秀的内部编码,无需改动外部数据结构和命令。

多种内部编码实现可以在不同场景下发挥各自的优势。例如ziplist比较节省内存,但是在列表元素比较多的情况下,性能会有所下降,这时候Redis会根据配置选项将列表类型的内部实现转换为linkedlist。

Redis 五种数据结构对应的内部编码

Redis在不同的情况下会为数据对象选择适合的编码方式

Redis 五种数据结构对应的内部编码

stringint:8个字节的长整型

embstr:小于等于39个字节的字符串

raw:大于39个字节的字符串

hashziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个),同时所有值都小于hash-max-ziplist-value配置(默认64个字节)时,Redis会使用ziplist作为哈希的内部实现ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀

hashtable(哈希表):当哈希类型无法满足ziplist的条件时,Redis会使用hashtable作为哈希的内部实现。因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1)

listziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)同时所有值都小于hash-max-ziplist-value配置(默认64个字节)时,Redis会使用ziplist作为哈希的内部实现

linkedlist(链表):当列表类型无法满足ziplist的条件时,Redis会使用linkedlist作为列表的内部实现

setintset(整数集合):当集合中的元素都是整数且元素个数小于set-max-intset-entries配置(默认512个)时,Redis会选用intset来作为集合内部实现,从而减少内存的使用。

hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使用hashtable作为集合的内部实现

zsetziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplist-entries配置(默认128个)同时每个元素的值小于zset-max-ziplist-value配置(默认64个字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist可以有效减少内存使用

skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作为内部实现,因为此时zip的读写效率会下降

referenceredis中文官网

菜鸟教程-Redis

Redis数据编码方式详解

Redis的五种数据结构的内部编码

分享到:

<< 上一篇:使用Redis的原因-功能分析 (2018-07-23 03:41)

php redis 菜鸟,Redis入门(一):Redis 简介相关推荐

  1. Redis入门四:Redis基本配置一:redis常用配置简介;后台运行(daemonize);

    本篇博客内容: (1)在[Redis入门二:Linux系统下安装Redis:]中已将安装了redis,并且启动了redis了.其实,redis是有很多配置项的:本篇博客主要介绍redis各种配置项中的 ...

  2. redis学习与入门~~~

    redis学习与入门~~~ 一. Redis 简介: 通常而言目前的数据库分类有几种,包括 SQL/NSQL,,关系数据库,键值数据库等等,分类的标准也不1,Redis本质上也是一种键值数据库的,但它 ...

  3. 关于redis 小白从入门到大神

    文章目录 一.Redis 介绍 一.简介 二.发展历史 二.Redis 的安装与配置 三.Redis 命令 四.Redis 发布订阅模式 五.Redis 事务操作 六.Redis 性能测试 七.Red ...

  4. 超详细Redis入门教程——Redis概述

    前言 本文小新为大家带来 超详细Redis入门教程--Redis概述 相关知识,具体内容包括Redis简介,Redis的用途,Redis的特性,Redis的IO模型(包括:单线程模型,混合线程模型,多 ...

  5. Redis 小白指南(一)- 简介、安装、GUI 和 C# 驱动介绍

    原文:Redis 小白指南(一)- 简介.安装.GUI 和 C# 驱动介绍 Redis 小白指南(一)- 简介.安装.GUI 和 C# 驱动介绍 目录 简介 安装 入门指令 GUI 工具 C# 驱动介 ...

  6. Redis数据库(一)——Redis简介、部署及常用命令

    文章目录 一.关系数据库与非关系型数据库概述 1.关系型数据库 2.非关系型数据库 3.关系数据库与非关系型数据库区别 ①.数据存储方式不同 ②.扩展方式不同 ③.对事务性的支持不同 4.非关系型数据 ...

  7. Lua:给Redis用户的入门指导

    可能你已经听说过Redis中嵌入了脚本语言,但是你还没有亲自去尝试吧? 这个入门教程会让你学会在你的Redis 服务器上使用强大的lua语言. Hello, Lua! 我们的第一个Redis Lua ...

  8. Redis入门之Redis安装、配置及常用指令

    Redis入门 NoSQL 引言 为什么使用 NoSQL? NoSQL 的四大分类(键值.列存储.文档.图形) NoSQL 应用场景 Redis 介绍 Redis 安装 与 配置 Redis 启动服务 ...

  9. redis指定配置文件启动_Redis【简介amp;安装篇】

    1 Redis简介 1.1 Redis是什么 Redis是一个开源的,使用ANSI C 编写的,高性能Key-Value的NoSQL数据库. 1.2 Redis特点 i. 基于内存. ii. 可持久化 ...

最新文章

  1. mysql忘记密码重置
  2. .net 从txt中读取行数据_Python读取txt数据并绘图
  3. 人工智能进入新的发展阶段
  4. bootstrap-反色导航条
  5. 数据分析能力到底有多重要
  6. synamic-datasource-spring-boot-starter实现动态数据源Mysql和Sqlserver
  7. 【2020任燕翔-考研专业院校选择指南】【计算机考研——针对教材、攻略】
  8. AS3 调用外部SWF中元件库中的元件 【转】
  9. RabbitMQ的消息确认机制
  10. 终于过审了!腾讯给了我20万红包封面,我得发出去。。。
  11. python xlwings api_Python - xlwings基本使用
  12. flutter笔记5:官方资料搬运-安卓客户端打包
  13. 1月 23 surface pro 3. windows ubuntu 双系统安装
  14. 基于FormsAuthentication的用户、角色身份认证
  15. Android自定义视频播放器
  16. 百度地图内置 市级+县级 区域代码
  17. 风云2号卫星云图_世界气象日话说54所与风云气象卫星的“不解之缘”
  18. 【NOI2011】 阿狸的打字机(AC自动机+树状数组)
  19. ttl转rs232发送十六进制_浅析 UART、RS232、TTL 之间的关系(转)
  20. 6年java工作经验总结

热门文章

  1. 剑指offer: 自上而下分析问题自下而上解决问题系列(java)
  2. dws连接db2使用教程_DB2使用手册
  3. 基于SSM的网辩平台的设计与实现
  4. 正则表达式 匹配常用手机号 (13、15\17\18开头的十一位手机号)
  5. VSCode+MSVC编写C/C++程序
  6. 统计学(三):几种常见的概率分布
  7. Vue2.0 Vue路由_路由的几个注意点
  8. Java毕业设计_基于Android的智能导游APP设计与实现
  9. Termux Software
  10. 面试思考题:25匹马5条跑道选前三