【Redis】初识 Redis

文章目录

  • 1 什么是 Redis
  • 2 Redis 的特点
    • 2.1 速度快
    • 2.2 可编程性
    • 2.3 可拓展性
    • 2.4 持久化
    • 2.5 主从复制
    • 2.5 高可用和分布式
    • 2.6 客户端语言多
  • 3 Redis 使用场景
    • 3.1 实时数据存储
    • 3.2 缓存和 Session 存储
    • 3.3 消息队列
  • 4 Redis 重大版本
  • 5 CentOS7 安装 Redis5

1 什么是 Redis

Redis 是一种基于键值对(key-value)的 NoSQL 数据库,与很多键值对数据库不同的是,Redis 中的键固定为 string,但值可以由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成,因此 Redis 可以满足很多的应用场景,而且因为 Redis 会将所有数据都存放在内存中,所以它的读写性能非常惊人。不仅如此,Redis 还可以将内存的数据利用快照和日志的形式保存到硬盘上,这样在发生类似断电或者机器故障的时候,内存中的数据不会“丢失”。除了上述功能以外,Redis 还提供了键过期、发布订阅、事务、流水线、Lua 脚本等附加功能。总之,如果在合适的场景使用 Redis,它就会像一把瑞士军刀一样所向披靡。

2008年,Redis 的作者 Salvatore Sanfilippo 在开发一个叫 LLOOGG 的网站时,需要实现一个高性能的队列功能,最开始是使用 MySQL来实现的,但后来发现无论怎么优化 SQL 语句等都不能使网站的性能提高上去,再加上自己囊中羞涩,于是他决定自己做一个专属于 LLOOGG 的数据库,这就是 Redis 的前身。后来,Salvatore Sanfilippo 将 Redis 1.0 的源码发布到 Github 上,可能连他自己都没想到,Redis 后来如此受欢迎。

假如现在有人问 Redis 的作者都有谁在使用 Redis,我想他可以开玩笑的回答:还有谁不使用 Redis,当然这只是开玩笑,但是从Redis 的官方公司统计来看,有很多重量级的公司都在使用 Redis,如国外的 Twitter、Instagram、Stack Overflow、Github 等,国内就更多了,如果单单从体量来统计,新浪微博可以说是全球最大的 Redis 使用者,除了新浪微博,还有像阿里巴巴、腾讯、搜狐、优酷土豆、美团、小米、唯品会等公司都是 Redis 的使用者。除此之外,许多开源技术像 ELK 等已经把 Redis 作为它们组件中的重要一环,而且 Redis 还提供了模块系统让第三方人员实现功能扩展,让 Redis 发挥出更大的威力。所以,可以这么说,熟练使用和运维 Redis 已经成为开发运维人员的必备技能。

2 Redis 的特点

Redis 之所以受到如此多公司的青睐,必然有之过人之处,下面是关于 Redis 的几个重要特性。

2.1 速度快

速度快是 Redis 最大的特点。Redis 执行命令的速度非常快,官方给出的数字是读写性能可以达到 10 万 / 秒,当然这也取决于机器的性能。下面是 Redis 速度快的几个原因:

  • Redis 的所有数据都是存放在内存中的,因此相较于 MySQL 这种数据存储在硬盘中的数据库,访问速度要快很多,这是Redis 速度快的最主要原因。下图谷歌公司 2009 年给出的各层级硬件执行速度,可以看到内存的访问速度大约是硬盘的十万倍。

    image-20240710160132472

  • Redis 的核心功能通过操作内存中的数据结构完成,相较于 MySQL 操作表来说,逻辑上要简单很多,所耗费的 CPU 资源也少很多。

  • Redis 使用的是单线程模型,减少了多线程之间线程切换、锁的竞争等资源消耗。(Redis 在 6.0 版本引入了多线程机制,但主要也是在处理网络和 IO,不涉及到数据命令,即命令的执行仍然采用了单线程模式)
    注意:我们之前学习多线程的时候,总是说多线程能够提高效率,它的前提是处理 CPU 密集型任务,多线程能够充分利用多核资源;但 Redis 核心功能通过操作内存数据结构就能够完成,这并不会占用很多 CPU,因此单线程可以充分利用现代处理器的高速缓存,减少上下文切换的开销,从而实现高性能。

  • Redis 是用 C 语言实现的,一般来说 C语言 实现的程序 “距离” 操作系统更近,执行速度相对会更快。(网上对这一点说法存在争议,因为我们说 Redis 快一般是和 MySQL 进行比较的,而 MySQL 也是使用 C语言 实现的。)

  • 作者对于 Redis 源代码可以说是精打细磨,曾经有人评价 Redis 是少有的集性能和优雅于一身的开源代码。

2.2 可编程性

我们可以通过简单的交互式命令对 Redis 进行操作,也可以通过一些脚本的方式,如 Lua 脚本,来批量执行一些操作或创建新的 Redis 命令。

2.3 可拓展性

Redis 是一种基于键值对(key-value)的 NoSQL 数据库,Redis 中的键固定为 string,但值可以由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成,这使得 Redis 不仅能便于在许多应用场景的开发,同时也能提高开发效率。

同时,Redis 还支持通过 C/C++/Rust 来编写 Redis 拓展 (本质上是一个动态链接库),这样使得公司可以根据自己的业务需要,通过扩展让 Redis 支持更多的数据结构和命令,定制化开发。

2.4 持久化

通常来看,将数据放在内存中是不安全的,一旦发生断电或者机器故障,重要的数据可能就会丢失,因此 Redis 提供了两种持久化方式:RDB 和 AOF,即可以用两种策略将内存的数据保存到硬盘中,这样就保证了数据的可持久性。

image-20240711114529308

2.5 主从复制

Redis 提供了复制功能,实现了多个相同数据的 Redis 副本,复制功能是分布式 Redis 的基础。Redis 主从复制架构如下图所示:

image-20240711114749322

2.5 高可用和分布式

Redis 提供了高可用实现的 Redis 哨兵(Redis Sentinel),能够保证 Redis 结点的故障发现和故障自动转移。也提供了 Redis 集群(Redis Cluster),是真正的分布式实现,提供了高可用、读写和容量的扩展性。

2.6 客户端语言多

Redis 提供了简单的 TCP 通信协议,很多编程语言可以很方便地接入到 Redis,并且由于 Redis 受到社区和各大公司的广泛认可,所以支持 Redis 的客户端语言也非常多,几乎涵盖了主流的编程语言,例如 C、C++、Java、PHP、Python、NodeJS 等。

3 Redis 使用场景

要充分理解 Redis 的作用,需要读者对网站的架构有一定的基础理解,如果你缺少这方面的背景知识,建议先移步我上一篇文章 分布式架构演进之路 ,再继续本篇的学习。

3.1 实时数据存储

Redis 的多种内存数据结构可以为需要低延迟和高吞吐量的实时应用程序构建数据基础设施,即 Redis 可以作为数据库。在大多数情况下,数据存储优先考虑的是容量,但也有一些场景考虑的是速度,比如在商业搜索业务中,由于它对性能要求非常高,因此需要使用类似于 Redis 这样的数据库,将需要检索的数据都存储在内存中。

3.2 缓存和 Session 存储

在缓存方面:由于 MySQL 将数据存储在硬盘中,因此访问速度很慢,又由于存在 “二八原则”,因此我们可以将热点数据拷贝一份放在 Redis 中作为缓存,从而有效提高数据访问速度。Redis 提供了键值过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略,可以很好的实现缓存。

在 Session 方面:

  • 在单机系统中,用户的 Session 信息是直接存储在应用服务器中的,用户访问服务器时服务器根据用户浏览器中的 cookie 信息(SessionId)来辨识用户。
  • 但是在分布式系统中,由于用户请求可能被负载均衡器分配到任意一台应用服务器上,因此就可能会出现需要用户重复登录的情况,因为该用户的 Session 信息只存在于为用户提供过服务的应用服务器中,这显然是不科学的。
  • 为了解决上述问题,我们可以将用户的 Session 信息单独拎出来,放在一组独立的机器上存储,由于服务器为用户提供服务需要先验证用户身份信息,因此存储用户 Session 信息的服务器速度必须要快,此时就可以考虑使用 Redis;并且这样做还有一个好处,就是即使应用服务器重启了,用户的 Session 信息也不会丢失。

Redis 作为数据库和 Redis 作为缓存的区别在于:

  • 在数据库中,Redis 存储的是全量数据,这里的数据是不能随便丢的。
  • 而在缓存中,Redis 中存储的是从全量数据库中拷贝过来的部分数据,即使丢失了影响也不大。

3.3 消息队列

在文章最开始介绍 Redis 的时候,我们提到过 Salvatore Sanfilippo 开发 Redis 的初衷其实是用它来实现一个高性能的队列功能,即消息队列,但随着 Redis 的发展,Redis 在用作缓存方面大获成功,用作消息队列方面却显得一般。

消息队列系统可以说是⼀个大型网站的必备基础组件,通过它我们可以实现一个网络版本的生产者消费者模型,从而在分布式系统中做到业务解耦与非实时业务削峰等工作。现在业界存在许多知名的消息队列组件,比如 RabbitMQ、Kafka、RocketMQ等,它们在消息队列中的功能要比 Redis 完善,但如果公司业务对消息队列的功能依赖不是很多,那么使用 Redis 作为消息队列也是完全可以的。

4 Redis 重大版本

Redis自发布以来经历了多个重大版本更新,以下是一些主要的版本及其特点:

  • Redis 2.6 :于2012年发布,引入了服务端Lua脚本支持、键过期时间毫秒级精度、从节点只读功能等多项特性。
  • Redis 2.8 :2013年发布,增加了部分主从复制功能,尝试性地支持IPv6,以及Redis Sentinel的第二版等。
  • Redis 3.0 :2015年发布,引入了官方的分布式实现Redis Cluster,优化了内存访问,并提高了性能。
  • Redis 3.2 :2016年发布,添加了GEO相关功能和新的List编码类型quicklist等。
  • Redis 4.0 :提供了模块系统、PSYNC2.0、新的缓存剔除算法LFU、非阻塞del命令等。
  • Redis 5.0 :引入了新的流数据类型、Redis模块API、RDB增加了LFU和LRU信息等。
  • Redis 6.0 :引入了多线程IO、新模块API、更好的过期循环、支持SSL等。
  • Redis 7.0 :新增Function自定义函数库、支持Client-Eviction、Sharded-Pub/Sub、命令执行耗时直方图等。

每个版本的发布都带来了新特性和性能改进,以满足不同场景下的需求。Redis的版本命名规则是偶数为稳定版本,奇数为开发版本,这种规则有助于用户选择合适的版本进行部署。

关于 Redis 更多版本以及版本更多变更细节可以查看 GitHub:https://github.com/redis/redis/releases

5 CentOS7 安装 Redis5

上面我们介绍了 Redis 几个重要的版本,在这里我们选择 Redis5 版本进行学习,原因是 Redis5 已经支持了大部分的功能特性,同时相较于 Redis7 版本,更容易进行安装使用,而且目前很多企业中使用的也是 Redis5 版本。

Redis 的官方并不支持微软的 Windows 操作系统,因为 Redis 的许多特性都是和操作系统相关的,所以支持 Windows 会增加维护成本,而且更重要的是大部分公司都在使用 Linux 操作系统,而 Redis 在 Linux 操作系统上的表现已经得到实践的证明。当然 Redis 作为一款优秀的开源技术,还是吸引到微软公司的注意,微软公司的开源技术组在 Github 上维护了一个 Redis 分支。不过还是强烈建议大家在 Linux 上使用 Redis。

1. 使用 yum 安装

首先安装 scl 源,再安装 redis:

yum install centos-release-scl-rh
yum install rh-redis5-redis

2. 创建符号链接

默认安装的目录为 /opt/rh/rh-redis5/root/usr/bin/ ,藏的太深了,不方便使用。可以通过符号链接,把需要用到的关键内容设置到方便使用的目录中。

针对可执行程序设置符号链接:

cd /usr/bin
ln -s /opt/rh/rh-redis5/root/usr/bin/redis-server ./redis-server
ln -s /opt/rh/rh-redis5/root/usr/bin/redis-sentinel ./redis-sentinel
ln -s /opt/rh/rh-redis5/root/usr/bin/redis-cli ./redis-cli

针对配置文件设置符号链接:

cd /etc/
ln -s /etc/opt/rh/rh-redis5/ ./redis

CentOS7 yum 源中自带的 Redis 安装包版本是 Redis3.2,因此我们需要通过 scl 源来安装 Redis5 版本。而 CentOS8 yum 源中自带的 Redis 版本是 Redis5,因此直接 yum install redis 即可,不用进行上述一系列操作。

3. 支持远程连接

默认情况下,Redis 只绑定在 127.0.0.1 接口上,即只允许从 127.0.0.1(localhost)上进行连接 Redis 服务,为了允许 Redis 接受远程访问,需要修改 Redis 的配置文件 /etc/redis.conf

  • 定位到 bind 127.0.0.1 开头的一行,修改为 bind 0.0.0.0 以添加全接口支持。
  • 关闭保护模式,protected-mode no
bind 0.0.0.0 
protected-mode no 

同时,我们还可以将 daemonize 修改为 yes,让 redis-server 变为守护进程:

daemonize yes

4. 设置工作目录

先先创建工作目录:

mkdir -p /var/lib/redis 

再在 /etc/redis.conf 配置文件中,设置 Redis 工作目录:

dir /var/lib/redis

5. 设置日志目录

先创建日志目录:

mkdir -p /var/log/redis/ 

再在 /etc/redis.conf 配置文件中,设置 Redis 日志目录:

logfile /var/log/redis/redis-server.log

至此,Redis5 安装以及相关配置完成。

启动 redis-server

Redis 是一个 客户端-服务器 结构的程序,Redis 服务器,即 redis-server 是 Redis 本体,负责存储和管理数据;而 Redis 客户端,即 redis-cli 通过网络访问 redis-server 中的数据

redis-server /etc/redis/redis.conf 

启动 redis-cli

redis-cli -h {host} -p {port}

启动 redis-cli 之后,我们可以输入 ping 命令,如果返回 pong,说明 redis-cli 可以连通 redis-server。

image-20240711145149055

停止 redis-server

首先通过 netstat 命令查看 redis-server 对应的 PID,然后 kill -9 即可:

netstat -nltp | grep redis
kill -9 xxx

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

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

相关文章

CSS实现超链接标签:鼠标光标为手形、取消下划线、当鼠标悬停时显示下划线

1、鼠标光标为手形 cursor: pointer; 2、显示/取消下划线 text-decoration: none; /* 文本取消下划线 */ text-decoration: underline; /* 文本添加下划线 */ 3、伪类选择器 伪类选择器是 CSS 中已经定义好的选择器,因此程序员不能随意命令。伪类选择器…

JVM系列 | 垃圾收集算法

JVM系列 | 垃圾收集算法 文章目录 前言如何判断对象已"死"?引用计数法可达性分析算法可达性分析2.0版 | 引用的增强对象的消亡过程回收方法区主要回收目标:回收操作 垃圾收集算法分代收集理论 与 跨代引用假说分代收集理论跨带引用假说 垃圾收…

《GroupViT: Semantic Segmentation Emerges from Text Supervision》论文解读

会议:CVPR 年份:2022 代码:https://github.com/NVlabs/GroupViT 研究背景与动机: 传统深度学习系统中,图像区域的Grouping通常是隐式通过像素级识别标签的自上而下监督来实现的。作者提出将Grouping机制重新引入深…

LeetCode热题100刷题12:20. 有效的括号、394. 字符串解码、739. 每日温度、155. 最小栈、139. 单词拆分

20. 有效的括号 class Solution { public:bool isValid(string s) {if(s.size()%2 !0)return false;stack<char> st;for(int i0;i<s.size();i) {if(s[i]( || s[i]{ || s[i][)st.push(s[i]);else if(st.empty() && (s[i]} || s[i]] || s[i])))return false;els…

MySQL 数据库(基础)- 约束

MySQL 数据库&#xff08;基础&#xff09;- 约束 概念&#xff1a;约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。目的&#xff1a;保证数据库中数据的正确&#xff0c;有效性和完成性。分类&#xff1a; 注意&#xff1a;约束是作用在表中字段上的&am…

yoloV8导出engine模型

yoloV8导出engine模型 引言&#xff1a; 目的是TensorRT加速YOLO实例分割模型。 本博客记录达成此目的所需的步骤&#xff0c;及步骤中可能遇到的问题。 as follow&#xff1a; 1. 首先导出onnx模型的脚本命令&#xff1a; yolo export modelbest.pt formatonnx opset12 simpl…

[misc]-流量包-find the pass

提示&#xff1a;黑客抓到一段流量&#xff0c;找找管理员的密码是多少 直接追踪流发现pass flag ffb7567a1d4f4abdffdb54e022f8facd

【RNN练习】天气预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、环境及数据准备 1. 我的环境 语言环境&#xff1a;Python3.11.9编译器&#xff1a;Jupyter notebook深度学习框架&#xff1a;TensorFlow 2.15.0 2. 导…

2024的开放式耳机排行榜,看这六个耳机选购的小Tips

在选择适合散步聊天和听歌的耳机时&#xff0c;开放式耳机是一个很好的选择。相对于传统的入耳式耳机&#xff0c;开放式耳机不会过度隔离你与周围环境&#xff0c;这意味着你可以更自然地与朋友交流&#xff0c;并且更加安全地行走在路上。市面上有许多开放式耳机可供选择&…

01. Hibernate 教程简介

1. 前言 大家好&#xff01;本节课将和大家一起学习鼎鼎有名的 Hibernate 框架。 本节课程将向大家介绍&#xff1a; Hibernate 的功能 、特点&#xff1b;Hibernate 产生的背景&#xff1b;并初步探讨编写 Jdbc 框架的基础构建思路。 2. Hibernate 是什么&#xff1f; 简而…

尚硅谷js

原型模式 原型对象就是相当于java的static,所有实例对象可以直接用静态的属性或者方法 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script type"text/javascript&q…

3D工艺大师快速生成装配动画,驱动汽车工业装配流程革新

在现代制造业的一般生产流程中&#xff0c;车间装配环节是产品由蓝图迈向市场前至关重要的一道工序。随着产品结构的日益复杂化和个性化需求的不断增长&#xff0c;车间装配工作面临着前所未有的挑战。高精密度的装配要求、错综复杂的组件关系以及频繁变更的生产计划&#xff0…

Java单边表的局部翻转

反转链表 II 这是上一个翻转全部链表的进阶版&#xff0c;大家可以先去看我的上一篇博客 Java算法之单链表的全部翻转-CSDN博客 题目描述 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节…

在VSCode上创建Vue项目详细教程

1.前期环境准备 搭建Vue项目使用的是Vue-cli 脚手架。前期环境需要准备Node.js环境&#xff0c;就像Java开发要依赖JDK环境一样。 1.1 Node.js环境配置 1&#xff09;具体安装步骤操作即可&#xff1a; npm 安装教程_如何安装npm-CSDN博客文章浏览阅读836次。本文主要在Win…

使用 lmdeploy 部署 internlm/internlm2_5-7b-chat

使用 lmdeploy 部署 internlm/internlm2_5-7b-chat 0. 引言1. lmdeploy 性能2. lmdeploy 支持的模型3. 快速开始 0. 引言 LMDeploy 由 MMDeploy 和 MMRazor 团队联合开发&#xff0c;是涵盖了 LLM 任务的全套轻量化、部署和服务解决方案。 这个强大的工具箱提供以下核心功能&a…

webRtc架构与目录结构

整体架构 目录结构 webrtc Modules目录

Redis实践经验

优雅的Key结构 Key实践约定&#xff1a; 遵循基本格式&#xff1a;[业务名称]:[数据名]:id例&#xff1a;login:user:10长度步超过44字节&#xff08;版本不同&#xff0c;上限不同&#xff09;不包含特殊字符 优点&#xff1a; 可读性强避免key冲突方便管理节省内存&#x…

使用 Unstructured.io 和 Elasticsearch 向量数据库搜索复杂文档

作者&#xff1a;来自 Elastic Amy Ghate, Rishikesh Radhakrishnan, Hemant Malik 使用非结构化和 Elasticsearch 向量数据库为 RAG 应用程序提取和搜索复杂的专有文档 在使信息可搜索之前解析文档是构建实际 RAG 应用程序的重要步骤。Unstructured.io 和 Elasticsearch 在此…

mybatis动态传入参数 pgsql 日期 Interval ,day,minute

mybatis动态传入参数 pgsql 日期 Interval 在navicat中&#xff0c;标准写法 SELECT * FROM test WHERE time > (NOW() - INTERVAL 5 day)在mybatis中&#xff0c;错误写法 SELECT * FROM test WHERE time > (NOW() - INTERVAL#{numbers,jdbcTypeINTEGER} day)报错内…

CSS【详解】层叠 z-index (含 z-index 的层叠规则,不同样式的层叠效果)

仅对已定位的元素&#xff08; position:relative&#xff0c;position:absolute&#xff0c;position:fixed &#xff09;有效&#xff0c;默认值为0&#xff0c;可以为负值。 z-index 的层叠规则 z-index 值从小到大层叠 兄弟元素 z-index 值相同时&#xff0c;后面的元素在…