分布式Redis详解
目录
- 前言
- 安装redis的俩种方法
- Redis 与 MySQL的区别
- Redis可以实现那些功能
- Redis常用的数据类型
- 有序列表的底层是如何实现的?
- 什么是跳跃表
- Redis在Spring中的使用
- Redis 中为什么单线程比多线程快
- Redis的分布式锁如何实现
- Redis 分布式锁可能出现的问题
- Redis保持数据不丢失的方式
- AOF持久化序列的方式有哪些
- Redis 的内存淘汰策略有哪些
前言
Redis我们最近学习必备工具之一了, 接下来我们将讲解Redis的简单应用 ,以及相关原理
安装redis的俩种方法
第一种: 在Linux上安装Redis
yum -y install redis
启动Redis
redis-server /etc/redis.conf &
链接Redis
redis-cli
出现这个说明链接成功了

简单的读和取数据

设置远程链接
- 将redis的配置文件下载到本地: 配置文件是Linux底下的 /etc/redis.conf 目录
cd /etc 进入目录
- 下载文件
sz redis.conf
- 查找文件中的bind 127.0.0.1 将找到的这一行注释掉(ctrl + F 查找快捷键)


4. 将redis.conf 中的protected-mode yes 中的yes 改为no

5. 保存文件,将修改后的文件在上传到Linux中etc 的目录下
6. 使用命令 redis-cli shutdown 先关闭redis 服务 ,再使用 redis-server /etc/redis.conf & 启动redis命令
7. 最后,如果不能远程访问, 请试着查看服务器是否开放了6379的端口号

第二种 在Windows中安装 Redis
Redis 与 MySQL的区别
MySQL : 是关系型数据库
Redis : 是文档型数据库 (以键值对的方式存储)(也叫非关系型数据库)
关系型数据局库描述的是对象与对象之间的关系
而文档型数据库中 , 没有关系,是动态的,所有内容都在一块, 增加删除数据不影响之前的数据,所以说Redis天然支持分布式
举个例子
我们都知道session 信息, 一般是存储在服务器中的 ,而加入有多台服务器的话, session还是存储在每个服务器中, 那么就意味着一个用户, 每次访问不同的服务器(物理上的多台),就必须重新验证一下session , 这不得烦死. 而Redis就 向一个安检门一样, 你在我这里验证一次, 无论进那台服务器都不需要再次验证了 , 这就是分布式
Redis可以实现那些功能
- 会话存储 -也就是上面我们说的存储session
- 存储缓存 - 这个也很好理解: 我们的服务器可以不停的买, 然后来突破单台服务器的瓶颈, 但是我们的数据库怎么办呢? 所以在企业中数据库是最容易达到瓶颈的 ,虽然我们可以分库分表, 但是这样的库 和表过多的时候 ,我们查询的效率无疑会大大降低, 这时候 ,就需要将数据库的一部分数据 添加到Redis中的缓存中, 让服务器查询数据的时候先去缓存中查询, 查不到再去数据库中查, 这样就大大提高了数据库查询的效率
- 实现分布式锁 - 与存储会话功能一样 ,是换个用途
- 简单的消息队列
Redis常用的数据类型
String字符串类型
Redis支持的字符串类型不是定长分配的字符串,是动态变长字符串,修改字符串在没有增加特别多内容的情况下不需要重新分配内存空间,
字符串类型常用的场景有以下这些:
(1)缓存结构体信息:
(2)计数功能:
List列表类型
常用使用场景
(1)list列表结构常用来做异步队列使用
(2)list可用于秒杀抢购场景
Hash数据类型
常用使用场景
(1)保存结构体信息
Set集合类型
用在一些去重的场景里
Zset有序集合
常用使用场景
(1)各类热门排序场景
有序列表的底层是如何实现的?
答:当数据比较少时,有序集合是压缩列表ziplist实现的,反之则为跳跃表skiplist实现。使用压缩列表存储必满足以下两个条件:
1有序集合保存的元素个数要小于128个;
2有序集合保存的所有元素成员的长度都必须小于64字节。
如果不能满足以上两个条件中的任意一个,有序集合将会使用跳跃表skiplist结构进行存储。
什么是跳跃表
答:跳跃表SkipList,也称之为跳表,是一种数据结构,用于在有序元素的集合中进行高效的查找操作。它通过添加多层链表的方式,提供了一种以空间换时间的方式来加速查找。
跳跃表由一个带有多层节点的链表组成,每一层都是原始链表的一个子集。最底层是一个完整的有序链表,包含所有元素。每个更高层级都是下层级的子集,通过添加额外的指针来跳过一些元素。这些额外的指针称为“跳跃指针”,它们允许快速访问更远的节点,从而减少了查找所需的比较次数。
跳跃表的平均查找时间复杂度为O(logn),其中n是元素的数量。这使得它比普通的有序链表具有更快的查找性能,并目与平衡二叉搜索树(如红黑树)相比,实现起来更为简单。

目录
- 前言
- 安装redis的俩种方法
- Redis 与 MySQL的区别
- Redis可以实现那些功能
- Redis常用的数据类型
- 有序列表的底层是如何实现的?
- 什么是跳跃表
- Redis在Spring中的使用
- Redis 中为什么单线程比多线程快
- Redis的分布式锁如何实现
- Redis 分布式锁可能出现的问题
- Redis保持数据不丢失的方式
- AOF持久化序列的方式有哪些
- Redis 的内存淘汰策略有哪些
Redis在Spring中的使用
- 添加依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId></dependency>
- 配置全局文件
# 设置redis的相关信息
# 链接那台redis : 这里拦截的是本地的 - 要开启服务
spring.redis.host = 127.0.0.1
# redis的端口号 : 默认是6379
spring.redis.port = 6379
# 密码没有就空着, 也可以不写
spring.redis.password=
# 默认是16个库
spring.redis.database = 1
#以上是最关键的配置, 其他可以不设置
- 使用Redis来读取
package com.example.demo.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestController {@Autowiredprivate RedisTemplate redisTemplate;// 自动装配@RequestMapping("/serval")public void setval(String val){redisTemplate.opsForValue().set("test",val);//得到操作redis的类型,(String)}@RequestMapping("/getval")public String getval(){return (String) redisTemplate.opsForValue().get("test");}
}
Redis 中为什么单线程比多线程快
Redis使用键值对的方式存储数据, 所以查询的时候很快, 单线程效率完全够用, 如果引入多线程的话, 多个线程抢占一个操作的事情就会发生, 结果效率反而会变慢
Redis的分布式锁如何实现
前提启动redis
使用 setnx lock true 命令实现, 如果出现1 则表示加锁成功 , 如果出现0 则表示加锁失败
使用 del lock 释放锁
当一个线程加锁的时候, 其他线程再去尝试加锁就会失败

Redis 分布式锁可能出现的问题
1: 死锁
Redis分布式锁可能出现死锁, 在什么场景下呢. 就是当 一个线程给Redis加上锁之后 ,经历停电, 或是线程崩溃等情况, 那么Redis的锁就释放不掉了,形成了死锁 (在Redis中默认是持久占用的),
解决方案: 给Redis加上超时时间(也是Mysql的解决方法) , 但是 如果 先获取到锁在去设置超时时间 , 这样就变成了俩步操作了 , 依然可能出现问题, Redis 给我们提供了一条原子命令来 完成这俩个操作, 这样俩个步骤合二为一, 就解决了死锁的问题
set lock true ex 30 nx
这里解释下含义 , ex 是设置超时时间 ,nx 是为元素非空判断,用来判断是否能正确使用锁
2: 误删
那误删又是一种什么情况呢, 假设有这么一种情况, 一个线程 上锁 并 设置了超时时间, 但是 当这个 线程 过了超时时间还在使用, 在这个线程A还在使用的时间段中, 线程B 也上锁了 并且锁的名称与线程A之前设置锁的名称一样, 那么当线程A 工作结束, 释放锁的时候, 就有可能 释放掉线程B加的锁.
解决方案 : 给锁加上 版本号 😦 也是ABA问题版本号的解决方案)(也就是给每个锁都加上一个版本号, 释放锁的时候, 先判断一下是不是同一个锁的版本)
1: 使用 lua 脚本,来设置俩个操作的原子性
2: 使用Redisson 框架,(底层也是Lua .只是给你封装了)
Redis保持数据不丢失的方式
1: 快照方式 - RDB : 将某一个时刻的内存数据, 都写入到硬盘之中 : 缺点 - 效率低
2: 追加方式- AOF : 记录所有的操作命令(除了查询操作) , 然后以文本的方式追加到文件中 : 缺点 - 有时会记录很多更新数据, 是无用数据
3: 混合方式 - 结合了 RDB 和 AOF 的优点,在写入的时候,先把当前的数据以 RDB 的形式写入文件的开头,再将后续的操作命令以 AOF 的格式存入文件,这样既能保证 Redis 重启时的速度,又能减低数据丢失的风险
AOF持久化序列的方式有哪些
1: always : 每天Redis的命令都写入硬盘, 最多丢失一条数据
2: everysec : 每秒钟写入一次硬盘, 最多丢失一秒数据(默认持久化策略)
3:no : 不设置,写入硬盘的规则,有当前的操作系统决定什么时候写入 , Linux默认30s
Redis 的内存淘汰策略有哪些
这里简单介绍集中常用的
1: noeviction : 不淘汰任何数据, 当内存不足的时候, 新增操作会报错(默认策略)
2: allkeys - lru : 淘汰最久未使用的键值
3: volite - lru : 淘汰所有设置了过期时间的, 最久未使用的键值
相关文章:
分布式Redis详解
目录 前言安装redis的俩种方法Redis 与 MySQL的区别Redis可以实现那些功能Redis常用的数据类型有序列表的底层是如何实现的?什么是跳跃表 Redis在Spring中的使用Redis 中为什么单线程比多线程快Redis的分布式锁如何实现Redis 分布式锁可能出现的问题Redis保持数据不丢失的方式…...
揭秘程序员和技师的7大共同点,最后一点绷不住了
大家好,这里是程序员晚枫,周末朋友出去放松回来,给我分析了一下程序员和技师的7个相同点,尤其是最后一点让我彻底绷不住了! 我也分享给大家。 1、都有工号。98号技师,380号技师大家都很熟悉了,…...
SQL | 使用函数处理数据
8-使用函数处理数据 8.1-函数 SQL可以用函数来处理数据。函数一般是在数据上执行的,为数据的转换和处理提供了方便。 8.1.1 函数带来的问题 每种DBMS都有特定的函数,只有很少一部分函数,是被所有主要的DBMS等同的支持。 虽然所有的类型的…...
基于Dlib库+SVM+Tensorflow+PyQT5智能面相分析-机器学习算法应用(含全部工程源码)+训练及测试数据集
目录 前言总体设计系统整体结构图系统流程图模型流程 运行环境Python 环境TensorFlow环境界面编程环境 模块实现1. 数据预处理2. 模型构建1)定义模型结构2)交叉验证模型优化 3. 模型训练及保存4. 模型测试1)摄像头调用2)模型导入及…...
【Flutter】【packages】simple_animations 简单的实现动画
package:simple_animations 导入包到项目中去 可以实现简单的动画, 快速实现,不需要自己过多的设置 有多种样式可以实现[ ] 功能: 简单的用例:具体需要详细可以去 pub 链接地址 1. PlayAnimationBuilder PlayAnima…...
python之matplotlib入门初体验:使用Matplotlib进行简单的图形绘制
目录 绘制简单的折线图1.1 修改标签文字和线条粗细1.2 校正图形1.3 使用内置样式1.4 使用scatter()绘制散点图并设置样式1.5 使用scatter()绘制一系列点1.6 python循环自动计算数据1.7 自定义颜色1.8 使用颜色映射1.9 自动保存图表练习题 绘制简单的折线图 绘制一个简单折线图…...
[Linux kernel] [ARM64] boot 流程梳理
一、启动汇编代码部分 0. 链接文件找代码段入口 – _text arch/arm64/kernel/vmlinux.lds.S ENTRY(_text). KIMAGE_VADDR;.head.text : {_text .;HEAD_TEXT}.text : ALIGN(SEGMENT_ALIGN) { /* Real text segment */_stext .; /* Text and read-only data */IRQENTRY_TE…...
重建二叉树
输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。 注意: 二叉树中每个节点的值都互不相同;输入的前序遍历和中序遍历一定合法; 数据范围 树中节点数量范围 [0,100] 。 样例 给定: 前序遍历是:[3, 9, 2…...
支付整体架构
5.4 支付的技术架构 架构即未来,只有建立在技术架构设计良好的体系上,支付机构才能有美好的未来。如果支付的技术体系在架构上存在问题,那么就没有办法实现高可用性、高安全性、高效率和水平可扩展性。 总结多年来在海内外支付机构主持和参与…...
百度智能云:千帆大模型平台接入Llama 2等33个大模型,上线103个Prompt模板
大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…...
烦人的幻灯片——拓扑排序
烦人的幻灯片 烦人的幻灯片问题描述输入输出格式输入格式输出格式 输入输出样例输入样例:输入样例一:输入样例二: 输出样例:输出样例一:输出样例二: 正确做法拓扑排序 代码 烦人的幻灯片 问题描述 李教授…...
无涯教程-Perl - ord函数
描述 此函数返回EXPR指定的字符的ASCII数值,如果省略则返回$_。例如,ord(A)返回值为65。 语法 以下是此函数的简单语法- ord EXPRord返回值 该函数返回整数。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perl -wprint("ord() ", ord(G), "\n"…...
Python爬虫:js逆向调式操作及调式中遇到debugger问题
Python爬虫:js逆向调式操作及调式中遇到debugger问题 1. 前言2. js逆向调式操作2.1 DOM事件断点2.2 XHR/提取断点(用于请求接口参数加密处理)2.3 请求返回的数据是加密的2.4 hook定位参数 3. 调式中遇到debugger问题3.1 解决方式(一律不在此处暂停)3.2 问题:点击一律…...
HTML网页制作技巧:打造出色的用户体验
HTML是构建网页的基础语言,掌握一些关键的技巧可以帮助您创建出色的用户体验。本文将介绍一些HTML网页制作的技巧,从布局和样式到交互和可访问性,为您提供有用的指导。无论您是初学者还是有经验的开发者,这些技巧都将对您的网页设…...
探究使用HTTP代理ip后无法访问网站的原因与解决方案
目录 访问网站的原理是什么 1. DNS解析 2. 建立TCP连接 3. 发送HTTP请求: 4. 服务器响应: 5. 浏览器渲染: 6. 页面展示: 使用代理IP后访问不了网站,有哪些方面的原因 1. 代理IP的可用性: 2. 代理…...
SpringBoot 全局异常处理进阶
待总结 参考文章: SpringBoot 全局异常处理进阶:使用 ControllerAdvice 对不同的 Controller 分别捕获异常并处理 SpringBoot 对 controller 层捕获全局异常并处理的方法(ControllerAdvice 和 ExceptionHandler) 注解RestCont…...
数据结构(一):顺序表详解
在正式介绍顺序表之前,我们有必要先了解一个名词:线性表。 线性表: 线性表是,具有n个相同特性的数据元素的有限序列。常见的线性表:顺序表、链表、栈、队列、数组、字符串... 线性表在逻辑上是线性结构,但…...
【周末闲谈】人工智能热潮下的AIGC到底指的是什么?
生成式人工智能AIGC(Artificial Intelligence Generated Content)是人工智能1.0时代进入2.0时代的重要标志。 个人主页:【😊个人主页】 系列专栏:【❤️周末闲谈】 系列目录 ✨第一周 二进制VS三进制 ✨第二周 文心一…...
sklearn垃圾邮件分类
在Python中,可以使用机器学习算法来进行垃圾邮件分类。下面是一个简单的示例,使用朴素贝叶斯算法进行垃圾邮件分类: import pandas as pd from sklearn.feature_extraction.text import CountVectorizer from sklearn.model_selection impor…...
UI美工设计岗位的工作职责
UI美工设计岗位的工作职责1 职责: 1、负责软件界面的美术设计、创意工作和制作工作; 2、根据各种相关软件的用户群,提出构思新颖、有高度吸引力的创意设计; 3、对页面进行优化,使用户操作更趋于人性化; 4、维护现有的应用产品; 5、收集和…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
从零开始了解数据采集(二十八)——制造业数字孪生
近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
云原生安全实战:API网关Envoy的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口,负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...
高效的后台管理系统——可进行二次开发
随着互联网技术的迅猛发展,企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心,成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统,它不仅支持跨平台应用,还能提供丰富…...
