redis高性能键值数据库技术简介

什么是redis

redis是远程字典服务(Remote Dictionary Server )的简写,是一个完全开源的高性能的Key-Value数据库,提供了丰富的数据结构如string、Hash、List、SetSortedset等等。数据是存在内存中的,同时Redis支持事务、持久化、LUA脚本、发布订阅、缓存淘汰、流技术等特性,提供了主从模式、Redis Sentinel和Redis cluster集群架构方案。

安装redis

yum方式安装

sudo yum install redis
sudo systemctl enable redis
sudo systemctl start redis

yum方式版本比较落后,无法安装最新版的redis,如果需要安装最新版本的redis需要使用源码安装的方式

源码方式安装

# 检查环境依赖
yum install gcc -y
# 下载Redis源码,一般下载到/opt目录下,/opt/software
wget http://download.redis.io/releases/redis-7.0.2.tar.gz
# 解压缩到当前目录(/opt/module)  
tar zxvf /opt/software/redis-7.0.2.tar.gz  
# 编译并安装 redis  (默认安装在/usr/local/bin目录下)
make && make install 
# 启动redis	
redis-server

安装目录(/usr/local/bin)中的文件结构
安装目录
配置redis.conf文件

# 进入redis解压目录
cd redis-7.0.2
# 备份redis.conf文件
cp redis.conf redis.conf.bak
# 将redis改为后台执行,替换daemonize no为daemonize yes
sed -i 's/^daemonize no/daemonize yes/' "redis.conf"

# 将redis改为可在外网访问,替换bind 127.0.0.1 -::1为bind 0.0.0.0
sed -i 's/^bind 127.0.0.1 -::1/bind 0.0.0.0/' "redis.conf"

# 配置redis密码,这里使用root作为密码,替换requirepass foobared为requirepass root
sed -i 's/^# requirepass foobared/requirepass root/' "redis.conf"

# 按照配置文件要求启动redis服务
redis-server redis.cnof

redis数据类型

数据类型解释作用
String字符串类型二进制安全的数据类型,可以用来存储任何类型的数据
List列表类型Redis列表是简单的字符串列表,按照插入顺序排序
Hash哈希表存储键值对,使用存储对象
Set集合类型String类型的无序集合,集合中不能存在重复的数据。底层通过hash来实现
ZSet有序集合String类型的有序集合,集合中不能存在重复的数据。每个元素关联一个double类型的分数,底层通过hash来实现。
GEO地理空间地理位置,坐标、距离等
HyperLogLog基数统计在输入元素数量或体积非常大时,计算基数所需时间和空间总是固定的
Bitmap位图二进制的bit数组
Bitfield位域连续的比特位
Stream用于消息队列(一般不是用)

String类型底层原理
String类型是redis最基本的数据类型,
SDS 简单动态字符串,SDS有的三个属性int len、int free、char buf[]。
len保存了字符串的长度
free表示buf数组中未使用的字节数量
buf数组则是保存字符串的每一个字符元素
在这里插入图片描述

Redis与C原生字符串相比:
1、C原生字符串不会记录长度,每次获取字符串长度时间复杂度都为O(n),Redis读取len中的数值即可,时间复杂度为O(1)。
2、C原生字符串拼接,如果分配空间不够会造成缓存区溢出的情况,SDS会现根据len中的数值判断空间是否足够,如果不够会进行相应的空间扩展,所以不会出现缓存区溢出的情况。
3、SDS提供空间预分配和惰性空间释放两种策略,在给字符串分配空间时,分配的空间比字符串实际所需空间大很多,这样能减少字符串增长带来的内存重新分配次数。当字符串被缩短时,SDS不会立即收回空间,而是通过free属性将空余的空间记录下来,等后面需要使用的时候再释放这些空间。
空间分配原则:当修改字符串后的长度len小于1MB,就会预分配和len一样长度的空间,即len=free;若是len大于1MB,free分配的空间大小就为1MB。
举个例子:
如果进行修改之后, SDS 的 len 将变成 13 字节, 那么程序也会分配 13 字节的未使用空间, SDS 的 buf 数组的实际长度将变成 13 + 13 + 1 = 27 字节(额外的一字节用于保存空字符)。
如果进行修改之后, SDS 的 len 将变成 30 MB , 那么程序会分配 1 MB 的未使用空间, SDS 的 buf 数组的实际长度将为 30 MB + 1 MB + 1 byte 。

List类型底层源码分析
redis3,2版本后,List类型通过quickList作为默认底层实现,quickList本质上是一个双端链表,可以认为是linkedList和ZipList的结合体。
LinkedList
LinkedList是一个普通的链表,LinkedList每一个节点的空间都是不连续的,所以可能造成过多的空间碎片。
ziplist
ziplist是为了节省内存而开发的一种压缩列表数据结构
zipList结构

zlbytes: 4字节,记录 ziplist 整个结构体的占用空间大小。用于内存重分配或计算zlend位置。
zltail: 4字节, 记录整个 ziplist 中最后一个 entry 的偏移量。用于快速定位到尾节点。
zllen: 4字节, 记录 entry 的数量,该值被固定为 2^16 - 1。 大于这个值就必须要遍历整个结构了。
entry: 真正存数据的结构。
zlend: 1字节, 为 ziplist 的结束标识。

entry节点结构
prelen:记录了前一个节点的长度。通过这个值,可以进行指针计算,从而跳转到上一个节点。如果前一节点的长度小于254字节,则prelen属性需要用1字节长的空间来保存;如果前一节点的长度大于等于254字节,则需要用5字节长的空间来保存。
encoding:记录了节点的content属性所保存数据的类型以及长度。编码的最高位用于标识数据类型(整数或字节数组),其余位用于表示内容的长度。
entry-data:保存节点的值

quicklist
quicklist存储了一个双向列表,每个列表的节点是一个ziplist
quickList结构图
quicklist同样采用了linkedlist的双端列表特性,然后quicklist中的每个节点又是一个ziplist,所以quicklist就是综合平衡考虑了空间碎片和读写性能两个维度。使用quicklist需要注意以下2点:
1、如果ziplist中的entry个数过少,极端情况就是只有1个entry,此时就相当于退化成了一个普通的linkedlist。
2、如果ziplist中的entry过多,那么也会导致一次性需要申请的内存空间过大,而且因为ziplist本身的就是以时间换空间,所以会过多entry也会影响到列表对象的读写性能。
ziplist中的entry个数可以通过参数list-max-ziplist-size来控制

Redis持久化
redis为什么需要持久化?
Redis持久化的意义就是为了保证突然宕机,内存数据不会全部丢失。
RDB机制
RDB持久化是周期性的把redis当前内存中的全量数据写入到一个快照文件中
快照文件是一个二进制文件,包含了 Redis 在某个时间点内的所有数据。

在redis6.0之前,RDB的频率为15分钟1个变化、5分钟10个变化,1分钟1万个变化,
在redis6.2之后,RDB的频率为1小时1个变化,5分钟100个变化,1分钟1万个变化。

自动触发
再配置文件redis.conf中修改以下配置:
修改快照时间
save 5 2
修改文件保存路径
dir 文件路径
修改文件名称
dbfilename 文件名称.rdb

进入redis检查配置文件是否成功
config get save
config get dir
config get dbfilename

RDB会读取dump.rdb文件进行恢复,所以服务要与备份分机隔离。不可以把备份文件dump.rdb与生茶redis服务器放在同一台机器上,必须分开各自存储,以防止生产机物理损坏后备份文件也跟着挂了。

手动触发
手动执行有两个命令:save和bgsave

save:阻塞主进程,直到生成新的RDB文件;执行save命令期间,Redis不能处理其他命令。在生产中严禁使用该命令。
bgsave:异步生成RDB文件,fork子进程去生成新的RDB文件,主进程不阻塞。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

进程信号

目录 信号入门 1. 生活角度的信号 2. 技术应用角度的信号 3. 注意 4. 信号概念 5. 用kill -l命令可以察看系统定义的信号列表 6. 信号处理常见方式概览 产生信号 1. 通过终端按键产生信号 Core Dump 2. 调用系统函数向进程发信号 3. 由软件条件产生信号 4. 硬件异…

NotePad++中安装XML Tools插件

一、概述 作为开发人员,日常开发中大部的数据是标准的json格式,但是对于一些古老的应用,例如webservice接口,由于其响应结果是xml,那么我们拿到xml格式的数据后,常常会对其进行格式化,以便阅读。…

Java基础——多线程

1. 线程 是一个程序内部的一条执行流程程序中如果只有一条执行流程,那这个程序就是单线程的程序 2. 多线程 指从软硬件上实现的多条执行流程的技术(多条线程由CPU负责调度执行) 2.1. 如何创建多条线程 Java通过java.lang.Thread类的对象…

HarmonyOS ArkUI(基于ArkTS) 常用组件

一 Button 按钮 Button是按钮组件,通常用于响应用户的点击操作,可以加子组件 Button(我是button)Button(){Text(我是button)}type 按钮类型 Button有三种可选类型,分别为胶囊类型(Capsule)、圆形按钮(Circle&#xf…

【FPGA开发】AXI-Stream总线协议解读

文章目录 AXI-Stream概述协议中一些定义字节定义流的定义 数据流类别字节流连续对齐流连续不对齐流稀疏流 协议的信号信号列表 文章为个人理解整理,如有错误,欢迎指正! 参考文献 ARM官方手册 《IHI0051B》 AXI-Stream概述 协议中一些定义 A…

谷粒商城のMySQL集群分库分表

文章目录 前言一、MySQL的集群架构二、MySQL主从同步实践1.创建主节点实例2.创建从节点实例3.修改配置4.开始同步4.测试主从同步效果5.小结 三、MySQL分库分表1.配置sharding-proxy2.测试sharding-proxy3.小结 前言 本篇是谷粒商城集群部署篇,搭建MySQL集群以及分库…

计算机组成原理对于学习嵌入式开发的意义

计算机组成原理对于学习嵌入式开发的意义 前言 最近有位同学向我咨询,问学习嵌入式开发需不需要学习硬件?进而引申到了需不需要学习计算机组成原理呢? 正文 首先计算机组成原理是计算机科学与技术专业的一门核心基础课程,它深入…

npm list -g --depth=0(用来列出全局安装的所有 npm 软件包而不显示它们的依赖项)

您提供的命令 npm list -g --depth0 是在 Node Package Manager (npm) 的上下文中使用的,用来列出全局安装的所有 npm 软件包而不显示它们的依赖项。 这是它的运作方式: npm list -g --depth0-g: 指定列表应包括全局安装的软件包。--depth0: 限制树形结…

SpringBoot 2.2.10 无法执行Test单元测试

很早之前的项目今天clone现在,想执行一个业务订单的检查,该检查的代码放在test单元测试中,启动也是好好的,当点击对应的方法执行Test的时候就报错 tip:已添加spring-boot-test-starter 所以本身就引入了junit5的库 No…

多表查询综合归纳

目录 1. 多表关系 1.1 一对多(多对一) 1.2 多对多 1.3 一对一 2. 多表查询概述 2.1 熟悉表 2.2 笛卡尔积 2.3 消除笛卡尔积 2.4 多表查询分类 3. 内连接 3.1 隐式内连接 3.2 显式内连接 4. 外连接 4.1 左外连接 4.2 右外连接 5. 自连接 …

python爬虫(二)爬取国家博物馆的信息

import requests from bs4 import BeautifulSoup# 起始网址 url https://www.chnmuseum.cn/zx/xingnew/index_1.shtml # 用于存储所有数据 all_data [] page 1 global_index 1 # 定义全局序号变量并初始化为1 while True:html_url requests.get(url).textif requests.get…

基于NI Vision和MATLAB的图像颜色识别与透视变换

1. 任务概述 利用LabVIEW的NI Vision模块读取图片,对图像中具有特征颜色的部分进行识别,并对识别的颜色区域进行标记。接着,通过图像处理算法检测图像的四个顶点(左上、左下、右上、右下),并识别每个顶点周…

Qt_day7_文件IO

目录 文件IO 1. QFileDialog 文件对话框(熟悉) 2. QFileInfo 文件信息类(熟悉) 3. QFile 文件读写类(掌握) 4. UI操作与耗时操作(掌握) 5. 多线程(掌握)…

[论文笔记]An LLM Compiler for Parallel Function Calling

引言 今天带来一篇优化函数调用的论文笔记——An LLM Compiler for Parallel Function Calling。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 当前的函数(工具)调用方法通常需要对每个函数进行顺序推理和操作&…

网络性能测试

一、iperf网络性能测试工具 测试udp丢包率 在服务器启动 iperf 服务端 iperf -p 9000 -s -u -i 1参数说明: -p : 端口号 -s : 表示服务端 -u : 表示 udp 协议 -i : 检测的时间间隔(单位,秒) 在客户端,启动 iperf 客户端 iperf -c xxx.xxx.14…

Rust语言在系统编程中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 Rust语言在系统编程中的应用 Rust语言在系统编程中的应用 Rust语言在系统编程中的应用 引言 Rust 概述 定义与原理 发展历程 Ru…

1-Equity-Transformer:求解NP-Hard Min-Max路由问题的顺序生成算法(AAAI-24)(完)(code)

文章目录 AbstractIntroduction问题表述Methodology多智能体位置编码公平上下文编码训练方案ExperimentsmTSP的性能评估mPDP的性能评估Related WorkConclusionAbstract 最小最大路由问题旨在通过智能体合作完成任务来最小化多个智能体中最长行程的长度。这些问题包括对现实世界…

数字后端教程之Innovus report_property和get_property使用方法及应用案例

数字IC后端实现Innovus中使用report_property可以报告出各种各样object的属性,主要有cell,net,PG Net,Pin,时钟clock,时序库lib属性,Design属性,timing path,timin arc等…

【Vitepress报错】Error: [vitepress] 8 dead link(s) found.

原因 VitePress 在编译时,发现 死链接(dead links) 会构建失败!具体在哪我也找不到… 解决方案 如图第一行蓝色提示信息,设置 Vitepress 属性 ignoredeadlinks 为 true 可忽略报错。 .vuepress/config.js export default defineConfig(…

【开源风云】从若依系列脚手架汲取编程之道(七)

📕开源风云系列 本篇文字量巨大,甚至在发表编辑之时造成编辑器卡顿,哈哈,最近在忙人生的另一项规划,文章更新就逐渐缓慢了,希望我们都逐渐走向自己的道路呀! 🍊本系列将从开源名将若…