当前位置: 首页 > news >正文

认识Redis

        从这个系列开始,就要开始更新Redis的学习历程了,欢迎大家点赞阅读!

目录

1 什么是Redis

2 Redis特性

2.1 速度快

2.2 基于键值对的数据结构

2.3 持久化

2.4 批量执行

2.5 可扩展性

2.6 集群

2.7 高可用性

3 配置Redis

3.1 符号链接

3.2 Redis配置文件

4 启动Redis

5 停止Redis

6 进入redis客户端


1 什么是Redis

        Redis是一种基于键值对的NoSQL数据库,数据存储在内存中,可作为数据库、缓存、消息中间件(消息队列,削峰填谷)等许多功能的使用。

        由于存储在内存,因此Redis最大的特性就是“快”,基于谷歌给出的各层硬件执行速率:基于内存的是100ns,而基于磁盘的是10000000ns,可见Redis要比MySQL快近5个数量级。为什么需要Redis而不直接定义变量(因为变量也是存储在内存的)?Redis的初衷是作为消息中间件使用,消息中间件用于进程间通信。基于网络,在分布式系统中,由于进程的隔离性,多机间的进程就需要通信,而Redis可以把数据存储在内存中,让多机都可以访问自己内存的数据,因此Redis的应用场景是分布式系统

        然而Redis的缺点是存储容量小,因此常常把Redis和MySQL结合使用。“二八原则”,20%的热点数据能满足80%的访问需求。Redis作为缓存存储热点数据(满足经常访问的需求),而MySQL作为数据存储的主容器,存储全量数据(全部的数据)。就可以让系统同时满足高性能和大容量存储的特性,不过这也会引发Redis和MySQL的数据一致性问题,后续介绍。

2 Redis特性

2.1 速度快

        Redis的速度快(相对于MySQL之类的关系型数据库)主要有以下原因:

        (1)存储在内存中。

        (2)使用单线程。多线程并不一定可以提高速度,多线程的优势是CPU计算密集型任务,而Redis大多是对内存中的数据存取和修改,不会消耗很多CPU时间,此时频繁加锁解锁和线程间的阻塞唤醒就会成为速度的累赘。

        (3)Redis的底层实现简单,核心业务简单,都是简单的操作内存中的数据结构。

        (4)Redis在网络方面使用IO多路复用,一个线程管理多个socket。

        注意:什么是IO多路复用?客户端服务器结构下,一个服务器会对多个客户端同时服务。基于http协议,客户端访问服务器时,通常建立连接,即使用一个线程并分配一个socket来接收请求。如果有多个客户端同时访问就需要多个线程并分配多个socket来处理。但是同一时间并不是所有的socket都在工作,因此可以用一个线程管理多个socket,这就是IO多路复用。

        Linux提供了3套API来控制IO多路复用:select、poll和epoll。现在主要都使用epoll(运行效率最高),Java标准库中提供NIO库来使用epoll进行IO多路复用。epoll就是在IO多路复用机制上增加事件通知/回调机制,即一个事件到来时会通知线程进行执行(对应就是哪个socket中有新到的请求需要处理,在操作系统层面epoll就会通知该socket所属的线程来进行处理)。当然IO多路复用的前提是socket请求不频繁,否则一个线程就处理不过来。

        (5)Redis使用C语言编写,C语言更接近底层。(存疑,因为MySQL也是C语言开发的,并不是因为用什么语言导致快慢,而是做的事不同导致的快慢。MySQL主要做了更多复杂的操作,并且从硬盘中读取,因此更慢)

2.2 基于键值对的数据结构

        Redis主要基于键值对存储,对于键通常采用String类型,对于值有多种类型:S字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(ordered set/zet),同时在字符串的基础之上演变出了位图(Bitmaps)和HyperLogLog两种神奇的数据结构。

2.3 持久化

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

2.4 批量执行

        Redis既支持简单的交互命令来操作,又支持通过脚本语言(Lua)来批量执行命令。

2.5 可扩展性

        Redis提供一组API,可以通过C、C++和Rust等编程语言来编写动态链接库(比如Windows的dll文件、Linux的so文件)来扩展Redis的功能,比如支持更多数据结构和命令。

2.6 集群

        Redis支持集群,可以通过引入多个主机部署多个Redis节点来实现水平扩展。类似数据库的分库分表,每个节点各自存储部分数据,避免查询压力过大。

2.7 高可用性

        Redis支持备份/冗余,使用主从节点,从节点作为主节点的备份,一旦主节点崩溃,从节点将会代替主节点继续运行。

3 配置Redis

        安装Redis的过程这里省略(这里使用redis 5),通常是安装在Linux环境下,这里用到的系统是centOS 7。

3.1 符号链接

        由于安装目录很深,不便于Redis查找需要的命令和文件,因此配置符号链接。

        符号链接类似于快捷方式,该符号链接指向了真正的文件或可执行程序,因此通过该链接就可以方便地操作Redis。

        命令:in -s 原文件路径 链接名

        通常bin目录下存储的是可执行命令,etc目录下存储的是配置文件。

3.2 Redis配置文件

        配置bind的ip为0.0.0.0,表示Redis可以被其他主机访问到。

        protected-mode no表示不启动保护模式,允许其他主机连接。

        daemonize yes表示设置守护进程(后台进程)方式启动。这样即使终端关闭进程也不会杀死。

        dir /var/lib/redis表示Redis的工作目录为该目录,这时候Redis如果创建的数据文件都会存储在该目录下面(首先要确保使用mkdir -p创建了该目录)。

        logfile /var/log/redis/redis-server.log是配置Redis的日志目录。

4 启动Redis

        使用Redis安装目录下的src/redis-server命令搭配配置文件即可成功启动(../redis.conf表示redis.conf文件在当前目录的上一级目录下):

        cd /usr/local/redis-5.0.14/src./redis-server ../redis.conf

        如果配置了符号链接,使用符号链接名+配置文件的符合链接名也可以成功启动:

5 停止Redis

        查看Redis的pid:ps aux | grep redis

        杀死pid对应的进程:kill pid

6 进入redis客户端

        由于已经提前配置了进入redis客户端命令的符号链接,因此直接在bin目录下使用符号链接即可:

        其他主机连接redis客户端时,需要使用:redis-cli -h { host } -p { port },host是redis所在主机的ip,port是端口号(默认6379)。

        注意:Redis的特性最重要的是快,但是快一定是相对的。对比直接操作内存的数据结构,通过Redis来操作内存,实际上是要慢。因为Redis是客户端-服务器系统。我们访问的都是客户端,而客户端和服务器之间通过网络通信。因此使用Redis操作内存多了网络通信的开销,比直接操作内存更慢。

        对于可以引入Redis的场合,一定是因为Redis可以解决一些问题。比如作为数据库,Redis可以保证数据不会丢失,关机重启后内存数据会丢失,而Redis有持久化的特性,因此可以保证数据不会丢。作为缓存,Redis的访问速度被MySQL更快,因此存储热点数据更合适。

下篇文章:

http://www.dtcms.com/a/267725.html

相关文章:

  • Chat Model API
  • 60天python训练营打卡day52
  • 运算方法和运算器补充
  • 如何录制带备注的演示文稿(LaTex Beamer + Pympress)
  • Codeforces Round 919 (Div. 2) D. Array Repetition(分块,1900)
  • 【深圳大学机器学习】实验一:PCA算法
  • 【ACL系列论文写作指北15-如何进行reveiw】-公平、公正、公开
  • 大数据学习1:Hadoop单机版环境搭建
  • Redis 哨兵模式部署--docker版本
  • C++面试-auto,auto,auto 的区别
  • 【ESP32】2.多任务处理
  • 相机位姿估计
  • 使用接口测试工具类Postman和浏览器的差异
  • C++ 语言特性31 - 协程介绍(2)
  • 用 Turbo Vision 2 为 Qt 6 控制台应用创建 TUI 字符 MainFrame
  • Redis性能优化
  • 五、Python新特性指定类型用法
  • AI大模型(六)Langchain核心模块与实战(一)
  • 使用LVM和扩展文件系统增加root分区存储容量
  • 信号和槽(4)
  • 3dmax物理材质转换标准材质,物理材质转VR材质,VR材质转标准材质3dmax物理材质转标准材质插件
  • 98.验证二叉搜索树
  • python实现简单的地图绘制与标记20250705
  • 【每天一个知识点】子空间聚类(Subspace Clustering)
  • 零基础保姆级本地化部署文心大模型4.5开源系列
  • Unity文件夹标签 —— FolderTag
  • SpinLock (TTAS) C-A-S 自旋锁实现原理
  • 人工智能学习60-Yolo
  • TCP协议概念和特性
  • cmd 的sftp传输;Conda出现环境问题: error: invalid value for --gpu-architecture (-arch)