分布式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

出现这个说明链接成功了
在这里插入图片描述

简单的读和取数据
在这里插入图片描述
设置远程链接

  1. 将redis的配置文件下载到本地: 配置文件是Linux底下的 /etc/redis.conf 目录

cd /etc 进入目录

  1. 下载文件

sz redis.conf

  1. 查找文件中的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可以实现那些功能

  1. 会话存储 -也就是上面我们说的存储session
  2. 存储缓存 - 这个也很好理解: 我们的服务器可以不停的买, 然后来突破单台服务器的瓶颈, 但是我们的数据库怎么办呢? 所以在企业中数据库是最容易达到瓶颈的 ,虽然我们可以分库分表, 但是这样的库 和表过多的时候 ,我们查询的效率无疑会大大降低, 这时候 ,就需要将数据库的一部分数据 添加到Redis中的缓存中, 让服务器查询数据的时候先去缓存中查询, 查不到再去数据库中查, 这样就大大提高了数据库查询的效率
  3. 实现分布式锁 - 与存储会话功能一样 ,是换个用途
  4. 简单的消息队列

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中的使用

  1. 添加依赖
	<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId></dependency>
  1. 配置全局文件
# 设置redis的相关信息
# 链接那台redis : 这里拦截的是本地的 - 要开启服务
spring.redis.host = 127.0.0.1  
# redis的端口号 : 默认是6379
spring.redis.port = 6379
# 密码没有就空着, 也可以不写
spring.redis.password=
# 默认是16个库
spring.redis.database = 1
#以上是最关键的配置, 其他可以不设置
  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 : 淘汰所有设置了过期时间的, 最久未使用的键值

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

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

相关文章

掌握C语言输入技巧:getchar()函数消除回车符困扰

在C语言编程的旅程中&#xff0c;你可能会遇到一个令人困惑的情况&#xff1a;使用getchar()函数获取字符时&#xff0c;那讨厌的回车符&#xff08;\n&#xff09;又是如何产生和处理的呢&#xff1f;本文将为你揭示这个问题&#xff0c;并分享几种消除回车符困扰的经验。 一…

企升编辑器word编写插件

面向用户群体招投标人员&#xff0c;用统一的模板来编写标书&#xff0c;并最终合并标书。项目经理&#xff0c;编写项目开发计划书&#xff0c;项目验收文档等。开发人员&#xff0c;编写项目需求规格说明书、设计说明书、技术总结等文档。其他文档编写工作量较多的岗位人员。…

vue 点击顶部tab重新请求列表

我们点击 1 2 来回切换时,发现客户经理的列表不会重新请求(菜单中含有客户经理) 这时我们添加以下代码就可以了 watch: {$route(route) {this.getList()}},/** 查询客户经理列表 */getList() {this.loading true;listManager(this.queryParams).then(response > {this.mana…

垃圾搜集器UseParallelGC

查看jdk支持的垃圾收集器有哪些&#xff1f; 当前进程使用的垃圾收集器是什么&#xff1f; 查看默认设置 查看默认设置命令&#xff1a; java -XX:PrintCommandLineFlags -version# -XX:UseParallelGC 查看默认垃圾收集器详细信息命令 通过新生代、老年代名字确定垃圾收集器…

【CSS3】CSS3 动画 ④ ( 使用动画制作地图热点图 )

文章目录 一、需求说明二、动画代码分析1、地图背景设置2、热点动画位置测量3、热点动画布局分析4、动画定义5、小圆点实现6、波纹效果盒子实现7、延迟动画设置 三、代码示例 一、需求说明 实现如下效果 , 在一张地图上 , 以某个位置为中心点 , 向四周发散 ; 核心 是实现 向四周…

git使用(常见用法)

一.下载git git官方下载跳转 安装简单,有手就行 二. git的简单使用 1. 连接远程仓库 #初始化 git init #配置账户 git config --global user.name “输入你的用户名” git config --global user.email “输入你的邮箱” git config --list #--q退出 #配置验证邮箱 ssh-key…

前端懒加载

懒加载的概念 懒加载也叫做延迟加载、按需加载&#xff0c;指的是在长网页中延迟加载图片数据&#xff0c;是一种较好的网页性能优化的方式。在比较长的网页或应用中&#xff0c;如果图片很多&#xff0c;所有的图片都被加载出来&#xff0c;而用户只能看到可视窗口的那一部分…

【网络编程】利用套接字实现一个简单的网络通信(UDP实现聊天室 附上源码)

网络编程套接字 &#x1f41b;预备知识&#x1f98b;理解源IP地址和目的IP地址&#x1f40c;认识端口号&#x1f41e; 理解 "端口号" 和 "进程ID"&#x1f41c;简单认识TCP协议&#x1f99f;简单认识UDP协议&#x1f997; 什么是网络字节序 &#x1f577;相…

使用 Docker 和 Streamlit 构建和部署 LangChain 支持的聊天应用程序

文章目录 前言聊天应用程序组件和技术LangChain Python框架开放人工智能模型前端 Streamlit UI使用 Docker 进行部署Docker 优化以实现轻量级和快速构建Docker-compose.yaml 文件基础设施Streamlit 公共云谷歌应用引擎使用 Google Cloud Run 部署应用1.启动服务2. 创建角色并将…

Debezium系列之:增量快照初始化历史数据实际应用案例

Debezium系列之:增量快照初始化历史数据实际应用案例 一、需求背景二、查看数据库表数据三、使用增量快照采集历史数据四、初始化历史数据一、需求背景 采集数据库数据发送到Kafka Topic,供下游实时开发消费,在采集最新数据的同时,希望把历史数据也发送到Kafka Topic同时采…

设置height:100%无效的原因以及两种解决方法

原因&#xff1a;我们知道在把盒子宽度自适应为浏览器窗口宽度&#xff0c;只需设置width:100%就可轻松解决问题&#xff0c;但是让盒子的高度自适应浏览窗口的高度并非那么容易&#xff0c;这是因为css内部计算的原因 <!-- 高度实际为字体大小 --> <div class"…

Vscode-工具使用

Vscode &#xff0c;这玩意儿是开源的&#xff0c;以前用收费的破解版&#xff0c;过段时间就高版本不匹配&#xff0c;这次搞个不要钱的玩玩&#xff0c;记录使用心得 下载 下载地址&#xff1a;官网 点击下载&#xff0c;但是这里有个问题下载比较慢&#xff0c;解决办法&a…

【Git】保姆级详解:Git配置SSH Key(密钥和公钥)到github

博主简介&#xff1a;22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a;是瑶瑶子啦每日一言&#x1f33c;: “当人们做不到一些事情的时候&#xff0c;他们会对你说你也同样不能。”——《当幸福来敲门》 克里斯加德纳 Git配置SSH Key 一、什么是Git?二、什么…

在CPU上安装部署chatglm-6b实用经验分享

chatglm-6b很强&#xff0c;很多同学都想自己试一试&#xff0c;但不是每个人都有GPU、高端显卡的环境&#xff0c;大多数同学都是一台普通的笔记本。 笔者这里分享一下在自己的8G内存&#xff0c;intel i3笔记本上安装部署chatglm-6b的实际经验。有很多网站都分享了一些经验&…

算法工程师-机器学习面试题总结(3)

FM模型 FM模型与逻辑回归相比有什么优缺点&#xff1f; FM&#xff08;因子分解机&#xff09;模型和逻辑回归是两种常见的预测建模方法&#xff0c;它们在一些方面有不同的优缺点。 FM模型的优点&#xff1a; 1. 能够捕获特征之间的交互作用&#xff1a;FM模型通过对特征向量…

模拟实现消息队列

目录 1. 需求分析1.1 介绍一些核心概念核心概念1核心概念2 1.2 消息队列服务器&#xff08;Broker Server&#xff09;要提供的核心 API1.3 交换机类型1.3.1 类型介绍1.3.2 转发规则&#xff1a; 1.4 持久化1.5 关于网络通信1.5.1 客户端与服务器提供的对应方法1.5.2 客户端额外…

ReadableStream流的js处理

需求 今天接了一个gpt的项目。需要对接接口。后端返回的数据是ReadableStream类型的。记录下如何处理ReadableStream类型的数据 代码 const response ... // response 是服务端返回的数据// 创建了一个数据读取器 const reader response.getReader(); // 创建了一个文本解…

UNIQUE VISION Programming Contest 2023 Summer(AtCoder Beginner Contest 312)D题题解

文章目录 [Count Bracket Sequences](https://atcoder.jp/contests/abc312/tasks/abc312_d)问题建模问题分析1.分析合法括号字符串的特点2.从集合角度分析字符串每个字符的作用代码 Count Bracket Sequences 问题建模 给定一个字符串&#xff0c;字符串内仅有3种字符&#xff…

java基础 面向对象 简答题

​​​​​ 1.面向对象的特征有哪些 封装&#xff1a;是指将数据和他的数据处理过程包装起来&#xff0c;隐藏类的内部细节 继承&#xff1a;新创建的类继承现有类的成员属性和方法&#xff0c;提高代码复用和扩展性 多态&#xff1a;两个特征向上造型和向下转型&#xff0c…

redis原理 8:有备无患 —— 主从同步

很多企业都没有使用到 Redis 的集群&#xff0c;但是至少都做了主从。有了主从&#xff0c;当 master 挂掉的时候&#xff0c;运维让从库过来接管&#xff0c;服务就可以继续&#xff0c;否则 master 需要经过数据恢复和重启的过程&#xff0c;这就可能会拖很长的时间&#xff…