redis复习

2023-10-28

1 关系型数据库和非关系型数据库

关系型数据库 (Relational Database) 和非关系型数据库 (Non-relational Database 或 NoSQL Database) 之间的主要区别可以从以下几个方面进行理解:

1.1 数据结构:

关系型数据库:以表格形式存储数据,每个字段(列)具有明确的类型,每个记录(行)都遵循同一种模式。它们使用 SQL(Structured Query Language,结构化查询语言)进行查询。

非关系型数据库:没有固定的数据模式。数据可能被存储为键值对、宽列、文档或图形等。它们不需要严格的模式定义和复杂的关系设计。

1.2 可扩展性:

关系型数据库:通常通过增加计算资源(例如,CPU、RAM或硬盘驱动器空间)来进行垂直扩展(scaling up)。然而,这种方法的缺点是成本较高并存在扩展限制。

垂直扩展(Vertical Scaling),也被称为“扩大”,是通过增加数据库服务器的硬件性能来提升数据库系统的处理能力。这通常意味着增加 CPUs,RAM 或 SSD 等资源。
具体来说,以下是垂直扩展可能包括的一些步骤:

  • 增加 CPU 资源:可以提供更多的计算能力,使得数据库能够处理更复杂或者数量更大的任务。
  • 增加内存 (RAM):有更多的数据可以在内存中快速访问,从而加快查询和其他数据库操作。
  • 增加存储空间:可以容纳更多的数据和索引,从而支持大量的读写操作。

垂直扩展的优点包括:

  • 实施简单,只需要对现有硬件进行升级。
  • 数据一致性和完整性更易于维护,因为所有的数据都在一个地方。
  • 然而,垂直扩展也有一些限制:
  • 物理限制:每台服务器的硬件升级都有其极限。当达到这个极限时,就无法通过增加硬件资源来提高性能了。
  • 价格问题:高性能的硬件成本往往非常高。
  • 可用性问题:如果所有数据都在一台服务器上,那么这台服务器出现故障就会导致整个系统不可用。

非关系型数据库:更易于水平扩展(scaling out),即添加更多服务器到数据库中进行分区,以处理更大的数据量和交易负载。这种方式提供了更好的可扩展性,并且成本效益更高。

水平扩展,也被称为“扩大”,是通过添加更多的机器到你的资源池(如数据库服务器)以处理更多的负载的方法。这种方法通常涉及到分区或者数据分片,其中每个机器承担部分负载。
例如,在数据库的上下文中,水平扩展可能意味着增加更多的服务器来分散数据库查询的负载。通常情况下,数据库会被分解成多个分片,每个分片持有一部分整体数据,并且由单独的服务器托管。这样,查询可以在多个服务器上同时进行,从而提高了性能并减小了任何单台服务器的负载。
总的来说,水平扩展提供的是良好的可扩展性和容错性,但可能带来更复杂的数据管理和应用程序设计问题。

1.3 事务性

关系型数据库:支持ACID(原子性、一致性、隔离性和持久性)事务,在并发控制和回滚操作中都支持完整的事务管理,能够保证数据的正确性和完整性。

非关系型数据库:不是所有的NoSQL数据库都支持ACID事务。许多NoSQL数据库更倾向于实现 BASE(基本可用,软状态,最终一致)模型,牺牲一部分一致性以获得更高的可用性和可扩展性。

1.4 应用场景

关系型数据库:适合需要处理复杂事务和业务的场景,如银行系统、库存系统等。

非关系型数据库:适合需要处理海量数据并要求快速读写的场景,如社交网络、实时分析、推荐引擎等。

2 Redis优点

2.1 基于内存操作

内存读写速度快

2.2 支持多种数据类型
2.2.1 String

String的一个读写例子:

redis> SET mykey "Hello World"
OK
redis> GET mykey
"Hello World"
2.2.2 Hash

Redis 的哈希类型用于存储键值对的集合。以下是一个使用哈希类型数据操作的例子。 假设我们有一个名为 user1000 的哈希,它包含用户的基本信息。

  • 设置哈希字段和值
HSET user1000 "name" "John Doe"
HSET user1000 "email" "john.doe@example.com"
HSET user1000 "password" "s3cret"
  • 获取哈希的全部字段和值:HGETALL user1000

返回值:

1) "name"
2) "John Doe"
3) "email"
4) "john.doe@example.com"
5) "password"
6) "s3cret"
  • 获取特定字段的值:HGET user1000 "name"
  • 检查哈希中是否存在某个字段:HEXISTS user1000 "email"
  • 删除哈希中的某个字段:HDEL user1000 "password"
  • 获取哈希中的字段数量:HLEN user1000
2.2.3 List
  • 创建一个List:
lpush mylist "apple"
# (integer) 1
  • 将更多元素添加到List中
lpush mylist "banana"
# (integer) 2
lpush mylist "cherry"
# (integer) 3
  • 显示List的所有元素
lrange mylist 0 -1
# 1) "cherry"
# 2) "banana"
# 3) "apple"
  • 删除List中的元素
lrem mylist 1 "banana"
# (integer) 1

https://www.nowcoder.com/discuss/500466833489666048?sourceSSR=search

1 redis的数据结构

Redis 支持多种数据结构,包括:

字符串(String): 这是最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。这个字符串类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。

哈希表(Hashes): Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

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

集合(Sets): Redis set 是 string 类型的无序集合。也不允许重复的成员。

有序集合(Sorted sets): Redis sorted sets 和 set 一样也是 string 类型的集合,另外每个元素都会关联一个 double 类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

位图(Bitmaps): 位图其实就是字符串,但是对位提供了直接操作。通过bit命令,我们可以对字符串指定偏移量上的位(bit)直接进行操作。

HyperLogLogs: 这种数据结构主要用来统计唯一值,也就是用来做基数统计。

流(Streams): Redis Streams 是 Redis 5.0 引入的新特性,它是一个类似于日志系统的数据结构,支持存储多个键值对的时间戳,并且保持插入顺序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

redis复习 的相关文章

  • Redis发布/订阅:查看当前订阅了哪些频道

    我目前有兴趣查看我拥有的 Redis 发布 订阅应用程序中订阅了哪些频道 当客户端连接到我们的服务器时 我们将它们注册到如下所示的通道 user user id 这样做的原因是我希望能够看到谁 在线 目前 我在不知道客户端是否在线的情况下盲
  • 如何在Redis中从hmset()切换到hset()?

    我收到弃用警告 即 Redis hmset 已弃用 请改用 Redis hset 但是 hset 采用第三个参数 我不知道是什么name应该是 info users 10 timestamp datetime utcnow strftime
  • Lua中按字符分割字符串

    我有像这样的字符串 ABC DEF 我需要将它们分开 字符并将两个部分分别分配给一个变量 在 Ruby 中 我会这样做 a b ABC DEF split 显然Lua没有这么简单的方法 经过一番挖掘后 我找不到一种简短的方法来实现我所追求的
  • 为什么 Redis TimeSeries 不捕获聚合中的最后一个元素?

    我试图了解 Redis 的时间序列规则创建的工作原理 但我很困惑为什么 Redis 会忽略聚合中的最后一项 并想知道这是否是预期的行为 我在中创建了示例代码redis cli为了显示 127 0 0 1 6379 gt FLUSHALL O
  • redis - 使用哈希

    我正在使用 redis 为我的 Web 应用程序实现社交流和通知系统 我是 redis 的新手 我对哈希值及其效率有一些疑问 我读过这篇很棒的文章Instagram 帖子 http instagram engineering tumblr
  • 如何使 Redis 缓存中数据层次结构(树)的部分内容无效

    我有一些产品数据 需要在 Redis 缓存中存储多个版本 数据由 JSON 序列化对象组成 获取普通 基本 数据的过程很昂贵 将其定制为不同版本的过程也很昂贵 因此我想缓存所有版本以尽可能进行优化 数据结构看起来像这样 BaseProduc
  • Scala 使用的 Redis 客户端库建议

    我正在计划使用 Scala 中的 Redis 实例进行一些工作 并正在寻找有关使用哪些客户端库的建议 理想情况下 如果存在一个好的库 我希望有一个为 Scala 而不是 Java 设计的库 但如果现在这是更好的方法 那么仅使用 Java 客
  • Redis+Docker+Django - 错误 111 连接被拒绝

    我正在尝试使用 Redis 作为使用 Docker Compose 的 Django 项目的 Celery 代理 我无法弄清楚我到底做错了什么 但尽管控制台日志消息告诉我 Redis 正在运行并接受连接 事实上 当我这样做时 docker
  • Amazon Elasticache Redis 集群 - 无法获取端点

    我需要获取 Amazon Elasticache 中 Redis 集群的终端节点 以下代码适用于 Memcached 集群 但不适用于 Redis import com amazonaws auth AWSCredentials impor
  • 如何将“.csv”数据文件导入Redis数据库

    如何将 csv 数据文件导入 Redis 数据库 csv 文件中包含 id 时间 纬度 经度 列 您能否向我建议导入 CSV 文件并能够执行空间查询的最佳方法 这是一个非常广泛的问题 因为我们不知道您想要什么数据结构 您期望什么查询等等 为
  • 如何延长 django-redis 中的缓存 ttl(生存时间)?

    我正在使用 django 1 5 4 和 django redis 3 7 1 我想延长缓存的 ttl 生存时间 当我取回它时 这是示例代码 from django core cache import cache foo cache get
  • Laravel Redis 配置

    我目前正在使用 Laravel 和 Redis 创建一个应用程序 几乎一切都工作正常 我按照文档中的说明扩展了身份验证 用户可以订阅 登录 注销 我可以创建内容 所有内容都存储在 Redis 中 但我有一个问题 我无法运行 php arti
  • ServiceStack.Redis:无法连接:sPort:

    我经常得到 ServiceStack Redis 无法连接 sPort 0 或 ServiceStack Redis 无法连接 sPort 50071 或其他端口号 当我们的网站比较繁忙时 就会出现这种情况 Redis 本身看起来很好 CP
  • 批量将Dictionary中的数据设置到Redis中

    我正在使用 StackExchange Redis DB 插入键值对字典Batch如下 private static StackExchange Redis IDatabase database public void SetAll
  • 为什么我们需要 Redis 来运行 CKAN?

    我想知道为什么我们需要 Redis 服务器来运行 CKAN 如果需要 为什么 我如何使用 CKAN 配置它 附注 我正在 RHEL7 中运行我的 ckan 实例 Update Redis 已成为一项要求从CKAN 2 7开始 https d
  • 在 Rails 应用程序上将 HASH 保存到 Redis

    我刚刚开始使用 Redis 和 Rails 所以这可能是一个愚蠢的问题 我试图将哈希值保存到 Redis 服务器 但是当我检索它时 它只是一个字符串 IE hash field gt value field2 gt value2 redis
  • .NET Core 依赖注入中的“StackExchange.Redis.ConnectionMultiplexer”应该是“AddSingleton”还是“AddScope”?

    我正在使用以下命令将 Redis 连接添加到 NET CoreStackExchange Redis 目前看起来像这样 public static IServiceCollection AddRedisMultiplexer this IS
  • Microsoft.Extensions.Caching.Redis 选择与 db0 不同的数据库

    一个关于了解使用哪个redis数据库以及如何配置它的问题 我有一个默认值ASP NET Core Web 应用程序和默认配置的本地redis服务器 含15个数据库 通过包管理控制台我已经安装了 Install Package Microso
  • 如何在Redis中使用HSCAN命令?

    我想在我的作业中使用 Redis 的 HSCAN 命令 但我不知道它是如何工作的 Redis 的官方页面 http redis io commands hscan http redis io commands hscan 这个命令给了我空白
  • spring中如何使用jackson代替JdkSerializationRedisSerializer

    我在我的一个 Java 应用程序中使用 Redis 并且正在序列化要存储在 Redis 中的对象列表 但是 我注意到使用 RedisTemplate 会使用 JdkSerializationRedisSerializer 相反 我想使用 J

随机推荐

  • python 读取图片名并写入excel

    参考博客python实现将数据写入Excel文件中 前端技术的博客 CSDN博客 python写excel 代码 path img path import os import xlwt import xlsxwriter worksheet
  • postgresql 查询所有表名

    SELECT tablename FROM pg tables WHERE tablename NOT LIKE pg AND tablename NOT LIKE sql ORDER BY tablename 或 select table
  • 面试题——1

    3 无重复字符的最长子串 206 反转链表 215 数组中的第K个最大元素
  • ValueError: Input 0 of layer sequential is incompatible with the layer: : expected min_ndim=4, found

    最近在做猫狗二分类实验的时候 在网上找到了教程 然后跟着教程打代码发现最后出现了ValueError Input 0 of layer sequential is incompatible with the layer expected m
  • Java访问权限修饰符

    private 私有的 只有在同一个类才能访问 内部类 成员变量 方法 default friendly 默认的 同一个包中可以访问 其他包中不能访问 类 成员变量 方法 接口 protected 受保护的 同一个包中可以访问 不同的包需要
  • KubeSphere 部署安装

    使用 kubeadm 搭建的 Kubernetes 1 15 2 版本集群 Helm v2 12 2 版本 使用 NFS 作为集群存储后端 下载安装脚本 mkdir root kubeSphere cd root kubeSphere gi
  • Git仓库完全迁移,包括所有的分支和标签,当然也包括日志。

    度娘了一堆git仓库迁移的内容 一个个都比较麻烦 而且本地下了代码 还要删去库地址 再切换到新库的地址上传 一般这种操作都只是master分支 其他分支还要一个一个来 后来在51CTO上找了一个文章 简单明了 一下就全搞定了 包括所有的分支
  • 二进制安装Docker

    下载 安装 wget https download docker com linux static stable x86 64 docker 19 03 6 tgz tar zvxf docker 19 03 6 tgz 把文件copy到
  • 计算机常用控温算法,常用温度控制方法原理 -解决方案-华强电子网

    常用PID调节器 温控仪控制算法包括常规PID 模糊控制 神经网络 Fuzzy PID 神经网络PID 模糊神经网络 遗传PID及广义预测等算法 常规PID控制易于建立线性温度控制系统被控对象模型 模糊控制基于规则库 并以绝对或增量形式给出
  • random函数汇总

    1 random random random random 用于生成一个0到1之间的随机浮点数 0 lt n lt 1 gt gt gt random random 0 7086588033796296 2 random uniform r
  • 【Django知识补充 - 1】:admin站点和rest_framework实现文件的上传和下载

    文章目录 项目准备 settings py中的配置 主路由urls py的配置 子应用中的文件代码 init py admin py models py serializers py urls py views py 演示 在admin中上
  • java实现-合并两个有序数组

    合并两个有序数组 给你两个有序整数数组 nums1 和 nums2 请你将 nums2 合并到 nums1 中 使 nums1 成为一个有序数组 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 你可以假设 nums1 的空
  • 移动端 文件预览(所有文档文件类型)

  • Java21天打卡-Day15 数组

    import java util Arrays public class Day15 数组 题目1 创建一个长度是8的字符串数组 使用8个长度是5的随机字符串初始化这个数组 对这个数组进行排序 按照每个字符串的首字母排序 无视大小写 注1
  • PermissionX 1.7发布,全面支持Android 13运行时权限

    各位小伙伴们大家早上好 一年一度的PermissionX升级又来了 还记得上次发布PermissionX 1 6版本还是在去年10月份的时候 当时是对Android 12系统进行了支持 详情可以参考这篇文章 PermissionX 1 6发
  • 深度学习框架Pytorch傻瓜式安装教程

    前提 已经安装完minianaconda和pycharm minianaconda直接官网下载即可 minianaconda比起anaconda体量很小 pycharm专业版2020下载百度网盘链接 链接 https pan baidu c
  • 【Detectron2】入门02-使用自己的数据集

    Detectron2 official Documents https detectron2 readthedocs io tutorials datasets html 目录 COCO格式数据集 Standard dataset dict
  • Qt对象树

    对象树 Qt提供了对象树机制 能够自动 有效的组织和管理继承自QObject的Qt对象 每个继承自QObject类的对象通过它的对象链表 QObjectList 来管理子类对象 当用户创建一个子对象时 其对象链表相应更新子类对象信息 对象链
  • JVM优化

    java运行时数据区 程序计数器 线程私有 java虚拟机栈 线程私有 本地方法栈 线程私有 java堆 线程公用 方法区 线程公用 jvm内存分配 栈内存分配 私有的 不会存在线程安全 保存参数 局部变量 中间计算过程和其他的数据 退出方
  • redis复习

    1 关系型数据库和非关系型数据库 关系型数据库 Relational Database 和非关系型数据库 Non relational Database 或 NoSQL Database 之间的主要区别可以从以下几个方面进行理解 1 1 数