Redis代码实践总结

一、背景: redis从安装到实践,做一些具体的记录。

1.1 Redis和 RedisStack和Redis Enterprise

redis简介

Redis 是一种开源(BSD 许可)内存中数据结构存储,用作数据库、缓存、消息代理和流引擎
Redis 提供数据结构,例如 字符串、散列、列表、集合、带范围查询的排序集、位图、超级日志、地理空间索引和流
Redis 具有内置复制、Lua 脚本、LRU 驱逐、事务和不同级别的磁盘持久性,并通过Redis SentinelRedis Cluster自动分区提供高可用性。
您可以对这些类型运行原子操作 ,例如附加到字符串; 增加哈希中的值;将元素推入列表;计算集合的交、 并、差;或获取排序集中排名最高的成员。
为了实现最佳性能,Redis 使用 内存数据集
根据您的使用案例,Redis 可以通过定期将数据集转储到磁盘 或将每个命令附加到基于磁盘的日志来持久保存您的数据。如果您只需要功能丰富的网络内存缓存,您还可以禁用持久性。
Redis 支持异步复制,具有快速非阻塞同步和自动重新连接以及网络分割上的部分重新同步。
Redis 还包括:
交易
发布/订阅
Lua脚本
密钥的生存时间有限
LRU 驱逐键
自动故障转移

总结:

1. 这是从官网摘抄的介绍,实际上点明了redis的用处和使用场景。换句话说,如果我们能知道简介里的这些功能是如何使用的,那redis也就掌握了。

2.一般我称呼redis叫内存数据库。

redisStack简介

除了Redis OSS的所有功能之外,Redis Stack还支持:
1、概率数据结构 ; 2、可查询的 JSON 文档;3、 跨哈希和 JSON 文档查询; 4、时间序列数据支持(摄取和查询),包括全文搜索

Redis Stack 的创建是为了让开发人员能够使用后端数据平台构建实时应用程序,该平台可以在毫秒或更短的时间内可靠地处理请求。

开始使用 Redis Stack 的最佳方法是使用RedisInsight,这是一个用于理解和优化 Redis 数据的可视化工具。

RedisInsight 允许您:

使用浏览器工具直观地查看数据结构,并根据名称空间对键进行分组。
在大多数 Redis Stack 数据结构上使用 CRUD。
利用 Workbench,这是一种高级命令行界面,具有智能命令自动完成功能和复杂的数据可视化功能。
使用 Profiler 工具实时分析 Redis 的流量。
随时使用嵌入式 Redis CLI。
使用内存分析工具分析内存使用情况。
使用 Slowlog 工具识别并排除瓶颈。

总结: 看介绍,这是给我们提供了一个可见页面和更多工具用来观测和使用redis的桌面UI工具。从运维的角度来说, 看起来不错。但我还没用过。试过后会补充一些介绍的。

Redis Enterprise

企业级 Redis,可在本地和云中(在 AWS、Google Cloud 或 Azure 上)使用。Redis Enterprise 简化了操作、扩展和多租户,包括许多集成(例如 Kubernetes),并提供多层支持。

总结: 看起来不错,但也许你在跨国外企工作时,才有必要使用它。毫无疑问。它和阿里的redis内存数据库Tair一样,都是收费的。当你作为项目经理时,你才需要考虑这两者的收费标准。

二、开始使用 Redis

2.1 安装和调试

学习在linux上安装就可以了。

  1. 安装包下载。
    你可以在redis官网( https://redis.io/download/)或者github(https://github.com/redis/redis)上下载最新版本。 建议选择tar.gz压缩格式的版本包。
    在这里插入图片描述
    在这里插入图片描述

二、选择一个服务器,把包放上去解压,然后运行,最后查看结果。
推荐在/usr/local目录下解压。 解压命令是

tar -xzvf redis-7.2.1.tar.gz

这样你就会有一个redis-7.2.1的文件夹出现了
在这里插入图片描述
接下来是进入redis目录,执行make命令,会有很多编译过程的输出,等几分钟,让它执行完。

cd redis-7.2.1
make
make install

如果编译成功,您将在src目录中找到几个Redis二进制文件,包括:

  • redis-server:Redis 服务器本身
  • redis-cli是与 Redis 交互的命令行界面实用程序。

启动和停止

#前台启动
redis-server
#后台启动  
redis-server&

Ctrl-c可以停止redis
在这里插入图片描述
在这里插入图片描述

总结: 上面的操作可以对照官网执行,一般这样就可以得到一个启动的redis了。下面是一些多的实践部分。上面图片执行redis-server启动命令后,启动日志里出现了三个warning,下面是解析:

Waring1: 警告表示没有指定配置文件,所以Redis使用默认配置。要使用特定的配置文件,可以使用这个命令指定。

[root@jqvalueadd33 src]# ./redis-server ../redis.conf

在这里插入图片描述
redis.conf文件很重要,有很多参数配置,有的配置我们需要做一些修改。

waring2: 警告表示,尽管Redis试图将TCP的backlog设置为511,但由于系统的/proc/sys/net/core/somaxconn值为128,所以这个设置无法生效。

waring3:警告表示overcommit_memory设置为0可能会在低内存情况下导致背景保存失败。
实际使用中,我建议是忽略掉这个警告。当然,如果你想多了解一些,你可以往下看,不然建议跳过这一部分。

为了修复这个问题,建议在/etc/sysctl.conf中设置vm.overcommit_memory = 1,然后重启或执行指定的命令。
redis官网对这个问题有一些描述,摘抄如下:

Linux 上的后台保存失败并出现 fork() 错误?
简短的回答:echo 1 > /proc/sys/vm/overcommit_memory:)
现在是长篇: forkRedis 后台保存模式依赖于现代操作系统中系统调用的写时复制语义:Redis fork(创建子进程),它是父进程的精确副本。子进程将数据库转储到磁盘上并最终退出。理论上,子进程应该使用与作为副本的父进程一样多的内存,但实际上,由于大多数现代操作系统实现的写时复制语义,父进程和子进程将共享公共内存页面。仅当子页面或父页面发生更改时,页面才会被复制。由于理论上在子进程保存时所有页面都可能发生变化,Linux无法提前知道子进程将占用多少内存,因此如果overcommit_memory如果设置为零,则 fork 将失败,除非有足够多的可用 RAM 来真正复制所有父内存页面。如果您有 3 GB 的 Redis 数据集并且只有 2 GB 的可用内存,它将失败。
设置overcommit_memory为 1 告诉 Linux 放松并以更乐观

下面是我的一些理解:

当我们需要把redis的数据fork到磁盘时,生成一个RDB(Redis数据库快照)文件。 而fork动作会需要linux分配父进程一样多的内存。但实际上使用过程中,父进程和子进程会共享很大一部分内存,而单独使用少部分内存。
overcommit_memory如果设置为零,当物理内存和交换空间不足以分配,那么fork会直接失败,数据持久化到磁盘失败。
overcommit_memory如果设置为1,当物理内存和交换空间不足以分配,会允许fork,持久化会成功,但也有OOM的风险。
overcommit_memory设置:overcommit_memory是Linux内核参数之一,用于控制内存分配策略。它有三个可能的值::
0:表示严格模式,内核将拒绝分配超过物理内存和交换空间总和的内存。这是默认设置。
1:表示按需分配模式,内核允许分配超过物理内存和交换空间总和的内存,但在实际使用时可能会导致OOM(Out of Memory)错误。
2:表示总是允许内存分配,无论物理内存和交换空间的状态如何。
解决方法:为了避免Redis后台保存操作中的fork错误,通常会建议将overcommit_memory设置为1。这允许操作系统更宽松地分配内存,从而更容易执行fork。您可以使用以下命令将overcommit_memory设置为1

fork()动作生成RDB文件的好处:

持久化数据:Redis是一个内存数据库,它将数据存储在内存中以提供高速读写访问。然而,为了确保数据在断电或服务器重启时不会丢失,需要将数据持久化到磁盘上。后台保存是一种将内存中的数据保存到硬盘上的方式,以便在需要时能够恢复数据。
备份数据:后台保存操作的结果是生成一个RDB(Redis数据库快照)文件,该文件包含了Redis数据库的当前状态。这个RDB文件可以用于数据备份和恢复。它提供了一种简单的方法来创建数据库的点对点备份,以防止数据丢失或损坏。
性能优化:由于将数据写入磁盘通常比写入内存慢得多,如果在主线程中执行保存操作,它可能会阻塞Redis服务器的正常响应请求。通过使用后台保存操作,Redis可以将数据保存到磁盘而不会阻塞主进程,从而保持了响应性能。
节省资源:后台保存操作通常是在一个单独的子进程中执行的,这个子进程是通过fork从父进程创建的。由于父进程和子进程共享相同的内存,子进程可以利用写时复制(Copy-On-Write)技术,只有在需要修改数据时才会复制内存页面,因此在保存期间节省了内存资源。
总之,Redis使用fork创建子进程来执行后台保存操作的主要目的是确保数据的持久性、提供备份和恢复功能、优化性能以及节省内存资源。这使得Redis在内存数据库的同时,也具备了数据持久性和可靠性的特性。

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

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

相关文章

(JavaEE)(多线程案例)线程池 (简单介绍了工厂模式)(含经典面试题ThreadPoolExector构造方法)

线程诞生的意义,是因为进程的创建/销毁,太重了(比较慢),虽然和进程比,线程更快了,但是如果进一步提高线程创建销毁的频率,线程的开销就不能忽视了。 这时候我们就要找一些其他的办法…

pte初步认识学习

我们的时间的确很少,但是我们每天都乐意将珍贵的时间浪费在大量毫无意义的事情上 目录 pte介绍 PTE口语评分规则 pte架构 计算机科学23 QS排名 《芭比》 pte介绍 PTE口语评分规则 有抑扬顿挫 对于连读 不能回读 native pte对于个别单词没有读好&#xff0c…

【探索C语言中VS调试技巧】:提高效率和准确性

文章目录 前言1. 什么是bug?2. 调试是什么?有多重要?2.1 调试是什么?2.2 调试的基本步骤2.3 Debug和Release的介绍 3. Windows环境调试介绍3.1 调试环境的准备3.2 学会快捷键3.3 调试的时候查看程序当前信息3.3.1 查看临时变量的值…

C语言生成随机数、C++11按分布生成随机数学习

C语言生成随机数 如果只要产生随机数而不需要设定范围的话,只要用rand()就可以;rand()会返回一随机数值, 范围在0至RAND_MAX 间;RAND_MAX定义在stdlib.h, 其值为2147483647; 如果想要获取在一定范围内的数的话,直接做…

【数据分享】2023年全国地级市点位数据(免费获取\shp格式\excel格式)

地级市点位数据是我们各项研究中经常使用到的数据,在之前的文章中我们分享过2022年度的地级市及以上城市的点位数据(可查看之前的文章获悉详情)。本次我们带来的是2023年度的全国范围的地级市及以上城市的点位数据,点位位置为市政…

大数据Flink(八十四):SQL语法的DML:窗口聚合

文章目录 SQL语法的DML:窗口聚合 一、滚动窗口(TUMBLE)

[激光原理与应用-68]:如何消除50Hz工频干扰和差分信号应对工频干扰

目录 一、什么工频干扰 1.1 什么工频干扰 1.2 工频干扰的幅度 1.3 工频干扰如何进入设备 1.4 工频干扰的负面影响 二、如何消除工频干扰 2.1 要消除工频干扰,可以考虑以下方法: 2.2 要具体消除工频干扰,可以采取以下措施 2.3 使用差…

React(react18)中组件通信04——redux入门

React(react18)中组件通信04——redux入门 1. 前言1.1 React中组件通信的其他方式1.2 介绍redux1.2.1 参考官网1.2.2 redux原理图1.2.3 redux基础介绍1.2.3.1 action1.2.3.2 store1.2.3.3 reducer 1.3 安装redux 2. redux入门例子3. redux入门例子——优…

Mybatis 中 SQL 注入攻击的 3 种方式

SQL注入漏洞作为WEB安全的最常见的漏洞之一,在java中随着预编译与各种ORM框架的使用,注入问题也越来越少。往往对Java Web应用的多个框架组合而心生畏惧,不知如何下手,希望通过Mybatis框架使用不当导致的SQL注入问题为例&#xff…

[Qt/C/C++]JSON和程序发布

文章摘于 爱编程的大丙 文章目录 1. JSON1.1 Json数组1.2 Json对象1.3 注意事项 2. Qt中JSON操作2.1 QJsonValue2.2 QJsonObject2.3 QJsonArray2.4 QJsonDocument2.5 举例2.5.1 写文件2.5.2 读文件 3. cjson库的使用3.1 cJSON结构体3.2 cJson API3.2.1 数据的封装3.2.2 Json对…

Kotlin File FileTreeWalk walkTopDown onEnter onLeave

Kotlin File FileTreeWalk walkTopDown onEnter onLeave Python遍历文件目录os.walk_for subfolder in subfolders: print(foldername/_zhangphil的博客-CSDN博客import osfor folderName, subfolders, filenames in os.walk(rD:\code\vs_code): print(当前文件夹: folderName…

踩坑:Invalid character found in method name. HTTP method names must be tokens

一、原因 在进行本地小程序与服务端请求时,由于加了签名认证,访问接口时报错 Spring boot端 小程序端 二、解决方案 2.1 更改访问路径 将https:更换成http: 示例:https://localhost:8080 改为 http://localhost:8080 2.2其他原因 ssl证书到期了Tomcat的header缓冲区大小不…

Python 搭建编程环境

一、搭建编程环境 1、下载python 官网:https://www.python.org 2、开始安装 下载安装版本,双击下载的安装包,如下: 步骤一: 步骤二: 步骤三: 安装完成后执行下面的操作,判断是否…

用Jmeter进行压测详解

简介: 1.概述 一款工具,功能往往是很多的,细枝末节的地方也很多,实际的测试工作中,绝大多数场景会用到的也就是一些核心功能,根本不需要我们事无巨细的去掌握工具的所有功能。所以本文将用带价最小的方式讲…

vue的由来、vue教程和M-V-VM架构思想、vue的使用、nodejs

vue vue的由来 vue教程和M-V-VM架构思想 vue的初步简单使用 nodejs vue的由来 # 1 HTML(5)、CSS(3)、JavaScript(ES5、ES6、ES11):编写一个个的页面 -> 给后端(PHP、Python、Go、Java) -> 后端嵌入模板语法 -> 后端渲染完数据 -> 返回数据给前端 ->…

国泰君安基本操作学习

对于主面板 1.放大或者缩小k线方法:按着ctrl键滚轮 2.切到历史k线:不断缩小k线后,把鼠标放置k线位置再按着ctrl滚轮放到可以切到当时的历史数据。 ★3.上下切换股票:滚轮。 ★4.面板直接输入股票代码后,自动弹出窗…

驱动开发练习,platform驱动模型的使用

一.总线模型介绍 linux中将一个挂载在总线上的驱动的驱动模型分为三部分:device、driver和bus; device部分:用来保存设备信息对象,在内核中一个klist_device链表中进行管理; driver部分:用来保存驱动信息对…

“毛细血管”的进化:华为分销业务如何让伙伴也有“高能级”

作者 | 曾响铃 文 | 响铃说 数字化蓬勃发展的大时代,除了那些中、大型企业,数量更为庞大的小微企业同样有借助数字化产品、服务来提升企业经营的需求,由此也带来了广袤的数字化分销市场。 这里处在聚光灯之外,很少被数字化时代…

PHP8的类与对象的基本操作之成员变量-PHP8知识详解

成员变量是指在类中定义的变量。在类中可以声明多个变量,所以对象中可以存在多个成员变量,每个变量将存储不同的对象属性信息。 例如以下定义: public class Goods { 关键字 $name; //类的成员变量 }成员属性必须使用关键词进行修饰&#xf…

无涯教程-JavaScript - SUMIFS函数

描述 SUMIFS函数添加其满足多个条件的所有参数。 语法 SUMIFS (sum_range, criteria_range1, criteria1, [criteria_range2, criteria2] ...)争论 Argument描述Required/OptionalSum_rangeThe range of cells to sum.RequiredCriteria_range1 使用Criteria1测试的范围。 Cr…