分布式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,一经查实,立即删除!

相关文章

企升编辑器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…

【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. 创建角色并将…

设置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?二、什么…

模拟实现消息队列

目录 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 客户端额外…

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…

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

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

String 类的运用

目录 1.字符串构造 2.String对象的比较 2.1比较是否引用同一个对象 2. 2boolean equals(Object anObject) 2.3int compareTo(String s) 方法: 按照字典序进行比较 2.4int compareToIgnoreCase(String str) 3.字符串查找 4.2大小写转换 4.3字符串转数组 4.4 格式化 5.字…

web-初始前端

不区分大小写&#xff0c;单双引号&#xff0c; <html><head><title>初识HTML</title></head><body><h1>Hello world!</h1><img src OIF-C.jfif/></body> </html> <!-- 文件格式 --> <!DOCTYPE h…

42. 疯狂爬取王者荣耀所有皮肤高清海报(文末源码)

目录 前言 目的 思路 代码实现 1. 导包&#xff0c;部署好环境 2. 伪装请求头 3. 访问英雄列表&#xff0c;获取英雄ID 4. 分别访问各英雄主页&#xff0c;查看图片详情 5. 写入本地文件夹&#xff08;文件夹自动命名&#xff09; 完整源码 运行效果 总结 前言 阔…

SQL Server数据库 -- 索引与视图

文章目录 一、索引 聚集索引非聚集索引二、视图三、自定义函数 标量函数表值函数四、游标五、总结 前言 在学习完创建库表、查询等知识点后&#xff0c;为了更加方便优化数据库的存储和内容&#xff0c;我们需要学习一系列的方法例如索引与视图等等&#xff0c;从而使我们更加…

用 docker 创建 jmeter 容器,能做性能测试?

我们都知道&#xff0c;jmeter 可以做接口测试&#xff0c;也可以用于性能测试&#xff0c;现在企业中性能测试也大多使用 jmeter。docker 是最近这些年流行起来的容器部署工具&#xff0c;可以创建一个容器&#xff0c;然后把项目放到容器中&#xff0c;就可以构建出一个独立的…

如何使Python Docker镜像安全、快速、小巧

一、说明 在微服务领域&#xff0c;拥有安全、高效和紧凑的 Docker 映像对于成功部署至关重要。本博客将探讨有助于构建此类映像的关键因素&#xff0c;包括不以 root 用户身份运行映像的重要性、在构建映像时更新和升级包、在编写 Dockerfile 指令时考虑 Docker 的层架构&…