第1章 Redis 概述

一、Redis 简介

            Redis,Remote Dictionary Server,远程字典服务,由意大利人Salvatore Sanfilippo(又名Antirez)开发,是一个使用ANSI C 语言编写、支持网络、 可基于内存亦可持久化的日志型、NoSQL 开源内存数据库,其提供多种语言的API。从2010 年3 月15 日起,Redis 的开发工作由VMware 主持。从 2013 年5 月开始,Redis 的开发由Pivotal 赞助。

Redis 之所以称之为字典服务,是因为Redis 是一个key-value 存储系统。支持存储的value 类型很多,包括String(字符串)、List(链表)、Set(集合)、Zset(sorted set --有序集合)和Hash(哈 希类型)等。

Redis 的国际知名用户有,Twitter、GitHub、Facebook 等,国内知名用户有,阿里巴巴、 腾讯、百度、搜狐、优酷、美团、小米等。熟练使用和运维Redis 已经成为开发运维人员的 一个必备技能。

1.NoSQL

NoSQL( “non-relational” “Not Only SQL” ),泛指 非关系型 的数据库。
随着互联网 web2.0 网站的兴起,传统的关系数据库在处理 web2.0 网站,特别是超大规模和高并发的 SNS 类型 的 web2.0 纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据 库则由于其本身的特点得到了非常迅速的发展。
NoSQL 数据库的产生就是为了 解决大规模数据集合多重数据种类带来的挑战 ,特别是大数据应用难题。

1键值存储数据库

就像 Map 一样的 key-value 对。典型代表就是 Redis

2列存储数据库

关系型数据库是典型的 行存储数据库 。其存在的问题是,按行存储的数据在物理层面占
用的是连续存储空间,不适合海量数据存储。
而按列存储则可实现分布式存储,适合海量存储。典型代表是 HBase

3文档型数据库

其是 NoSQL 与关系型数据的结合,最像关系型数据库的 NoSQL 。典型代表是 MongoDB

4图形(Graph)数据库

用于存放一个节点关系的数据库,例如描述不同人间的关系。典型代表是 Neo4J

二、Redis 的用途

Redis 在生产中使用最多的场景就是做 数据缓存。即客户端从 DBMS 中查询出的数据首先写入到 Redis 中, 后续无论哪个客户端再需要访问该数据,直接读取 Redis 中的即可,不 仅减小了 RT,而且降低了 DBMS 的压力。

DBMS 是 Database Management System(数据库管理系统) 的缩写,是一种专门用于 创建、管理和维护数据库 的软件系统。它是数据持久层(如关系型数据库、非关系型数据库等)的核心组件

       根据 Redis 缓存的数据与 DBMS 中数据的同步性划分,缓存一般可划分为两类:实时同步缓存,与阶段性同步缓存

       实时同步缓存是指,DBMS 中数据更新后,Redis 缓存中的存放的相关数据会被立即清 除,以促使再有对该数据的访问请求到来时,必须先从 DBMS 中查询获取到最新数据,然后 再写入到 Redis。

      阶段性同步缓存是指,Redis 缓存中的数据允许在一段时间内与 DBMS 中的数据不完全 一致。而这个时间段就是这个缓存数据的过期时间。

实时同步缓存,与阶段性同步缓存——补充理解《补充》

三、Redis 特性

能够做缓存的技术、中间件很多,例如,MyBatis 自带的二级缓存、Memched 等。只所 以在生产中做缓存的产品几乎无一例外的会选择 Redis,是因为它有很多其它产品所不具备 的特性。

​​ 性能极高:Redis 读的速度可以达到 11w 次/s,写的速度可以达到 8w 次/s。只所以具有 这么高的性能,因为以下几点原因:

(1)Redis 的所有操作都是在内存中发生的。

(2) Redis 是用 C 语言开发的。

(3)Redis 源码非常精细(集性能与优雅于一身)。

 简单稳定:Redis 源码很少。早期版本只有 2w 行左右。从 3.0 版本开始,增加了集群功 能,代码变为了 5w 行左右。

 持久化:Redis 内存中的数据可以进行持久化,其有两种方式:RDB 与 AOF。

 高可用集群:Redis 提供了高可用的主从集群功能,可以确保系统的安全性。

 丰富的数据类型:Redis 是一个 key-value 存储系统。支持存储的 value 类型很多,包括 String(字符串)、List(链表)、Set(集合)、Zset(sorted set --有序集合)和 Hash(哈希类型) 等,还有 BitMap、HyperLogLog、Geospatial 类型。

 BitMap:一般用于大数据量的二值性统计。

 HyperLogLog:其是 Hyperlog Log,用于对数据量超级庞大的日志做去重统计。  Geospatial:地理空间,其主要用于地理位置相关的计算。

 强大的功能:Redis 提供了数据过期功能、发布/订阅功能、简单事务功能,还支持 Lua 脚本扩展功能。

 客户端语言广泛:Redis提供了简单的 TCP 通信协议,编程语言可以方便地的接入 Redis。 所以,有很多的开源社区、大公司等开发出了很多语言的 Redis 客户端。

 支持 ACL 权限控制:之前的权限控制非常笨拙。从 Redis6 开始引入了 ACL 模块,可以 为不同用户定制不同的用户权限。

ACL,Access Control List,访问控制列表,是一种细粒度的权限管理策略,可以针对任意 用户与组进行权限控制。目前大多数 Unix 系统与 Linux 2.6 版本已经支持 ACL 了。 Zookeeper 早已支持 ACL 了。

Unix 与 Linux 系统默认使用是 UGO(User、Group、Other)权限控制策略,其是一种粗 粒度的权限管理策略。

 支持多线程 IO 模型:Redis 之前版本采用的是单线程模型,从 6.0 版本开始支持了多线 程模型。

四、Redis IO 模型

Redis 客户端提交的各种请求是如何最终被 Redis 处理的?

Redis 处理客户端请求所采用 的处理架构,称为 Redis 的 IO 模型。不同版本的 Redis 采用的 IO 模型是不同的

1.单线程模型

对于 Redis 3.0 及其以前版本,Redis 的 IO 模型采用的是纯粹的单线程模型。即所有客户 端的请求全部由一个线程处理。

Redis 的单线程模型采用了 多路复用技术

       每个客户端若要向 Redis 提交请求,都需要与 Redis 建立一个 socket 连接,并向事件分 发器注册一个事件。一旦该事件发生就表明该连接已经就绪。而一旦连接就绪,事件分发器 就会感知到,然后获取客户端通过该连接发送的请求,并将由该事件分发器所绑定的这个唯 一的线程来处理。如果该线程还在处理多个任务,则将该任务写入到任务队列等待线程处理。

       之所以称为事件分发器,是因为它会根据不同的就绪事件,将任务交由不同的事件处理 器去处理。

2.混合线程模型

从 Redis 4.0 版本开始,Redis 中就开始加入了多线程元素。处理客户端请求的仍是单线 程模型,但对于一些比较耗时但又不影响对客户端的响应的操作,就由后台其它线程来处理。 例如,持久化、对 AOF 的 rewrite、对失效连接的清理等。

3.多线程模型

Redis 6.0 版本,才是真正意义上的多线程模型。因为其对于客户端请求的处理采用的是
多线程模型。

多线程 IO 模型中的“多线程”仅用于接受、解析客户端的请求,然后将解析出的请求 写入到任务队列。而对具体任务(命令)的处理,仍是由主线程处理。这样做使得用户无需 考虑线程安全问题,无需考虑事务控制,无需考虑像 LPUSH/LPOP 等命令的执行顺序问题。

4.优缺点总结

⑴.单线程模型

优点:可维护性高,性能高。不存在并发读写情况,所以也就不存在执行顺序的不确定 性,不存在线程切换开销,不存在死锁问题,不存在为了数据安全而进行的加锁/解锁 开销。

缺点:性能会受到影响,且由于单线程只能使用一个处理器,所以会形成处理器浪费。

⑵.多线程模型

优点:其结合了多线程与单线程的优点,避开了它们的所有不足

缺点:该模型没有显示不足。如果非要找其不足的话就是,其并非是一个真正意义上的 “多线程”,因为真正处理“任务”的线程仍是单线程。所以,其对性能也是有些影响的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/84897.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图论学习笔记 5 - 最小树形图

我们不废话,直接进入正题:最小树形图,一个名字看起来很高级的东西。 声明:为了便于理解,可能图片数量会有亿点点多。图片尺寸可能有的较大。 概念 最小树形图的英文是 Directed Minimum Spanning Tree。 相信懂英文…

力扣面试150题--完全二叉树的节点个数

Day 51 题目描述 思路 根据完全二叉树的规律,完全二叉树的高度可以直接通过不断地访问左子树就可以获取,判断左右子树的高度: 1. 如果相等说明左子树是满二叉树, 然后进一步判断右子树的节点数(最后一层最后出现的节点必然在右子树中) 2. 如…

社区造数服务接入MCP|得物技术

一、背景 ​ 今年 MCP 的概念非常火,市面上也涌现出了一大批 MCP 相关工具。作为技术一线者,都会按捺不住地去实操一下,很早的时候就有个设想,如果把我们的测试工具都改造为符合 MCP 服务协议标准,然后全部接入 AI A…

Mysql 查询时间段内的sql优化

Mysql 查询时间段内的sql优化 一说写到查询某个时间段的sql查询,我们就会使用DATE_FORMAT函数格式化日期字段: 比如查询某年某月的数据,我们可能常用的方式如下 DATE_FORMAT(pay_time,%Y-%m)=DATE_FORMAT(now(),%Y-%m) 但是这样做会使索引失效,尤其在数据量越来越多的情况…

用 Deepseek 写的 html+js 密码生成器

下面是一个功能完整的密码生成器HTMLJS实现&#xff0c;包含数字、小写字母、大写字母、符号、避免重复字符和密码长度设置功能。 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&…

WPF绑定

如何使用绑定去改变事件驱动的关系。 先介绍一下标签扩展 目录 控件与控件之间的绑定 代码分析 绑定语法详解 1. Binding - 绑定标记 2. ElementName=slider - 绑定源 3. Path=Value - 绑定路径 不同控件属性的默认模式: 控件和属性绑定 1. 数据模型类的作用 2. 窗…

同源“平滑思想”的问题解法:正则化与拉普拉斯平滑

同源“平滑思想”的问题解法&#xff1a;正则化与拉普拉斯平滑 在机器学习和概率模型的实践中&#xff0c;正则化与拉普拉斯平滑是两个看似无关的技术&#xff1a;前者用于防止模型过拟合&#xff0c;后者用于解决零概率问题。但如果深入理解它们的核心逻辑&#xff0c;会发现…

用 AI 让学习更懂你:如何打造自动化个性化学习系统?

用 AI 让学习更懂你:如何打造自动化个性化学习系统? 在这个信息爆炸的时代,传统的学习方式已经难以满足个体化需求。过去,我们依赖固定的教学课程,所有学生按照统一进度进行学习,但每个人的学习节奏、兴趣点和理解方式都不尽相同。而人工智能(AI)正在彻底改变这一局面…

PyQt学习系列08-插件系统与模块化开发

PyQt学习系列笔记&#xff08;Python Qt框架&#xff09; 第八课&#xff1a;插件系统与模块化开发 &#xff08;原课程规划中的第12课&#xff0c;按用户要求调整为第9课&#xff09; 课程目标 掌握Qt插件系统的原理与开发方法实现可扩展的模块化应用程序理解QPluginLoader动…

rlemasklib 安装笔记

目录 windows 安装&#xff0c;没成功 报错笔记&#xff1a; windows 安装&#xff0c;没成功 anslation_unit.obj -Wno-cpp -Wno-unused-function -stdc99 -O3 cl: 命令行 error D8021 :无效的数值参数“/Wno-cpp” error: command C:\\Program Files\\Microso…

Ubuntu 系统grub日志级别设置

在 Ubuntu 系统中&#xff0c;GRUB 的日志级别主要与内核日志级别&#xff08;loglevel&#xff09;相关&#xff0c;而不是 GRUB 自身的日志级别。内核日志级别通常从 0 到 7&#xff0c;其中 0 是最高级别&#xff08;最严重&#xff09;&#xff0c;7 是最低级别&#xff08…

【前端】使用HTTPS

在前端本地开发环境中使用 HTTPS 主要取决于你用的是哪个构建工具&#xff08;如 Vite、Webpack、Vue CLI 等&#xff09;。 目录 ViteWebpack本地生产环境 npx serve浏览器提示“不安全”解决方法上传github注意不要把key传上去 Vite npm install --save-dev types/node #安…

Python 包管理工具 uv的一些常用指令

1.如何安装uv&#xff1a; 在Windows下&#xff0c;执行下面的指令&#xff1a; powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" 安装很快&#xff0c;安装完成后&#xff0c;会出现&#xff1a; 接着&#xff0c;我们运行指…

行为型:策略模式

目录 1、核心思想 2、实现方式 2.1 模式结构 2.2 实现案例 3、优缺点分析 4、适用场景 5、优化技巧 1、核心思想 目的&#xff1a;将算法&#xff08;行为&#xff09;抽象出来作为一系列策略类&#xff0c;使他们可以相互替换&#xff0c;使系统拥有“可插拔”扩展的能…

计算机网络学习20250524

协议 格式—语法&#xff1a;数据结构或格式&#xff08;怎么做&#xff09;次序—时序&#xff1a;事件实现的顺序&#xff08;做的顺序&#xff09;行为动作—语义&#xff1a;发出什么控制信息&#xff0c;完成何种动作、做出何种应答 网络结构 网络边缘&#xff1a;主机…

Github 2025-05-24 Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2025-05-24统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10TypeScript项目2Dart项目1Tauri: 构建小型、快速和安全的桌面应用程序 创建周期:1673 天开发语言:Rust协议类型:Apache License 2…

数据结构之堆(topk问题、堆排序)

一、堆的初步认识 堆虽然是用数组存储数据的数据结构&#xff0c;但是它的底层却是另一种表现形式。 堆分为大堆和小堆&#xff0c;大堆是所有父亲大于孩子&#xff0c;小堆是所有孩子大于父亲。 通过分析我们能得出父子关系的计算公式&#xff0c;parent(child-1)/2&#xff…

0基础 Git 代码操作

将代码提交仓库&#xff1a; 准备工作​ ​注册 Gitee 账号​&#xff1a;确保你已注册并登录 Gitee。​创建仓库​&#xff1a;在 Gitee 上新建一个空仓库&#xff08;如果尚未创建&#xff09;&#xff1a; 点击右上角 → 新建仓库。填写仓库名称、描述&#xff0c;选择公…

OpenAI大模型不听人类指令事件的技术分析与安全影响

OpenAI大模型不听人类指令事件的技术分析与安全影响 OpenAI大模型o3确实存在不遵从人类关闭指令的现象&#xff0c;这一行为已被第三方安全机构验证&#xff0c;但其本质是技术缺陷而非AI意识觉醒。帕利塞德研究所的测试显示&#xff0c;在100次实验中o3有7次成功绕过关闭指令…

软件工程期末速成--附带几道题

软件工程中的各种设计 瀑布模型&#xff1a; 定义&#xff1a;将软件生存周期的各项活动规定为依照固定顺序连接的若干阶段工作&#xff0c;形如瀑布流水&#xff0c;最终得到软件产品 系统流程图&#xff1a;系统流程图是描绘物理系统的传统工具&#xff0c;它的基本思想是用…