Redis数据结构详解

Redis是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生的独一无二的数据模型。

Redis是一个速度非常快的非关系型数据库(non-relational database),它可以存储键(key)与5种不同类型的值(value)之间的映射(mapping),可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分片来扩展写性能。

非关系型数据库

关系型数据库经常用来写关联两个表的数据的SQL查询,而Redis则属于人们常说的NoSQL数据库或者非关系数据库:Redis不使用表,它的数据库也不会预定义或者强制要求用户对Redis存储的不同数据进行关联。

附加特性

内存数据库,一个首要考虑的问题就是:当服务器关闭时,服务器存储的数据何去何从?

Redis拥有两种不同形式的持久化方法,它们都可以用小而紧凑的格式将存储在内存中的数据写入硬盘:

  • 时间点转储(point-in-time-dump)
  • 写入只追加(append-only)文件里面

扩展Redis的读性能,并为Redis提供故障转移(failover)支持,Redis实现了主从复制特性:执行复制的从服务器会连接上主服务器,接收主服务器发送的整个数据库的初始副本(copy);之后主服务器执行的写命令,都会被发送给所有连接着的从服务器去执行,从而实时地更新从服务器地数据集。因此客户端可以向任意一个从服务器发送读请求,以此来避免对主服务器进行集中式的访问。

Redis数据结构简介

Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为:

  • STRING(字符串)
  • LIST(列表)
  • SET(集合)
  • HASH(散列)
  • ZSET(有序集合)
结构类型结构存储的值结构的读写能力
STRING可以是字符串、整数或者浮点数对整个字符串或者字符串的其中一部分执行操作;对整数和浮点数执行自增(increment)或者自减(decrement)操作
LIST一个链表,链表上的每个节点都包含了一个字符串从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值查找或者移除元素
SET包含字符串的无序收集器(unordered collection),并且被包含的每个字符串都是独一无二、各不相同的添加,获取,移除单个元素;检查一个元素是否存在于集合中;计算交集,并集,差集;从集合里随机获取元素
HASH包含键值对的无序散列表添加、获取、移除单个键值对;获取所有键值对
ZSET字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定添加、获取、删除单个元素;根据分值范围(range)或者成员来获取元素

Redis中的字符串

字符串常用命令:

  • GET:获取存储在给定键中的值
  • SET:设置存储在给定键中的值
  • DEL:删除存储在给定键中的值(这个命令可以用于所有类型)

image

使用redis-cli:启动redis-cli客户端。

Redis中的列表

Redis对链表(linked-list)结构的支持使得它在键值存储的世界中独树一帜。一个列表结构可以有序地存储多个字符串

列表常用命令:

  • RPUSH:将给定值推入列表地右端
  • LPUSH:将给定值推入列表地左端
  • LRANGE:获取列表在给定范围上的所有值
  • LINDEX:获取列表在给定位置上的单个元素
  • LPOP:从列表的右端弹出一个值,并返回被弹出的值
  • LPOP:从列表的左端弹出一个值,并返回被弹出的值

image

Redis的集合

Redis的集合和列表都可以存储多个字符串,它们之间的不同在于,列表可以存储多个相同的字符串,而集合则通过使用散列表来保证自己存储的么个字符串都是各不相同的

集合常用命令:

  • SADD:将给定元素添加到集合
  • SMEMBERS:返回集合包含的所有元素
  • SISMEMBER:检查给定元素是否存在于集合中
  • SREM:如果给定的元素存在于集合中,那么移除这个元素

Redis的散列

Redis的散列可以存储多个键值对之间的映射。和字符串一样,散列存储的值既可以是字符串又可以是数字值,并且用户同样可以对散列存储的数字值执行自增操作或者自减操作。

散列常用命令:

  • HSET:在散列里面关联起给定的键值对
  • HGET:获取指定散列键的值
  • HGETALL:获取散列包含的所有键值对
  • HDEL:如果给定键存在于散列里面,那么移除这个键

Redis的有序集合

有序集合和散列一样,都用于存储键值对:有序集合的键被称为成员(member),每个成员都是各不相同的;而有序集合的值则被称为分值(score),分值必须为浮点数。有序集合是Redis里面唯一一个既可以根据成员访问元素(这一点和散列一样),又可以根据分值以及分值的排列顺序来访问元素的结构

有序集合常用命令:

  • ZADD:将一个带有给定分值的成员添加到有序集合里面。
  • ZRANGE:根据元素在有序排列中所处的位置,从有序集合里面获取多个元素。
  • ZRANGEBYSCORE:获取有序集合在给定分值范围内的所有元素。
  • ZREM:如果给定成员存在于有序集合,那么移除这个成员。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis的源码文件结构由多个文件和目录组成,这些文件和目录之间存在一定的关系。 首先是根目录下的文件,包括以下几个主要的文件: 1. `redis.c`:Redis的主要源码文件,包含着Redis的主要功能实现。 2. `Makefile`:用于编译Redis源码的Makefile文件。 3. `redis.conf`:Redis的配置文件,可以通过修改此文件来配置Redis的行为。 除了根目录下的文件之外,Redis的源码还包含了以下几个重要的目录: 1. `src`目录:包含着Redis的核心源码文件,包括网络通信、数据结构、命令解析等核心功能的实现。 - `networking.c`:Redis的网络通信模块的实现。 - `object.c`:Redis数据结构模块的实现。 - `db.c`:Redis的键值对存储模块的实现。 - `server.c`:Redis的服务器模块的实现。 2. `deps`目录:包含了Redis依赖的一些第三方库的源码文件,例如Lua、Jemalloc等。 3. `tests`目录:包含了Redis的测试用例文件,可以通过运行这些测试用例来验证Redis的功能是否正常。 Redis的源码文件之间存在着一定的依赖关系,主要体现在以下几个方面: 1. `redis.c`文件是整个Redis的入口文件,它会调用其他源码文件中的函数来完成Redis的各项功能。 2. `networking.c`文件依赖于`redis.h`头文件,该文件中定义了Redis的数据类型和函数原型。 3. `object.c`文件依赖于`networking.c`文件,因为它需要使用`redis.h`中定义的类型和函数来处理Redis数据结构。 4. `server.c`文件也依赖于`redis.h`文件,因为它需要使用其中定义的类型和函数来处理Redis的服务器相关逻辑。 5. 在编译时,Makefile文件会将各个源码文件进行编译链接,生成可执行文件。 综上所述,Redis的源码文件结构包括了多个文件和目录,这些文件和目录之间存在着一定的依赖关系,通过这些文件和目录的组合和协作,完成了Redis的各项功能实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值