分布式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.rhkb.cn/news/86900.html

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

相关文章

【LeetCode-简单】剑指 Offer 29. 顺时针打印矩阵(详解)

题目 输入一个矩阵&#xff0c;按照从外向里以顺时针的顺序依次打印出每一个数字。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#xff1a;matrix [[1,2,3,4],[5,6,7,8],[9,10,1…

CentOS虚拟机 NAT模式连网

1、查看本地VMnet8的网络信息 cmd ipconfig2、编辑VMware虚拟网络编辑器 &#xff08;1&#xff09;打开网络编辑器 &#xff08;2&#xff09;打开NET设置 &#xff08;3&#xff09;修改网络配置 修改子网ip和windows查到的ip的最后一位不一样就行和子网掩码照抄 3、在VMw…

SQL | 计算字段

7-创建计算字段 7.1-计算字段 存储在数据库中的数据一般不是我们所需要的字段格式&#xff0c; 需要公司名称&#xff0c;同时也需要公司地址&#xff0c;但是这两个数据存储在不同的列中。 省&#xff0c;市&#xff0c;县和邮政编码存储在不同的列中&#xff0c;但是当我们…

keil下载程序具体过程:概述

一、前言 keil下载程序具体过程将由一系列的博客组成&#xff0c;将深入探讨keil这种IDE下载镜像文件时具体做了哪些事情。我们平常下载镜像的时候&#xff0c;只是点击了一下Download按钮&#xff0c;剩下的都由keil替代我们完成了。本系列博客将揭示这一过程&#xff0c;keil…

事件循环原理

事件循环 浏览器的进程模型 何为进程&#xff1f; 程序运行需要有它自己专属的内存空间&#xff0c;可以把这块内存空间简单的理解为进程 每个应用至少有一个进程&#xff0c;进程之间相互独立&#xff0c;即使要通信&#xff0c;也需要双方同意。 何为线程&#xff1f; 有…

【Kafka】1.Kafka简介及安装

目 录 1. Kafka的简介1.1 使用场景1.2 基本概念 2. Kafka的安装2.1 下载Kafka的压缩包2.2 解压Kafka的压缩包2.3 启动Kafka服务 1. Kafka的简介 Kafka 是一个分布式、支持分区&#xff08;partition&#xff09;、多副本&#xff08;replica&#xff09;、基于 zookeeper 协调…

【图像恢复】基于交替乘子方法(ADMM)图像恢复算法研究[固定点收敛和应用](Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

HarmonyOS/OpenHarmony应用开发-ArkTS语言渲染控制概述

ArkUI通过自定义组件的build()函数和builder装饰器中的声明式UI描述语句构建相应的UI。 在声明式描述语句中开发者除了使用系统组件外&#xff0c;还可以使用渲染控制语句来辅助UI的构建&#xff0c;这些渲染控制语句包括控制组件是否显示的条件渲染语句&#xff0c;基于数组数…

Xcode 基座打包

Xcode基座打包-APP更新版本内容无效 问题&#xff1a;解决&#xff1a; 问题&#xff1a; 使用xcode基座打包之后&#xff0c;上传到appstore进行提审发布。 用户在appstore商城进行更新下载&#xff0c;打开更新后的APP发现版本号是最新的&#xff0c;APP里面的其他内容还是上…

linux环形缓冲区kfifo实践2:配合等待队列使用

基础 struct __wait_queue_head {spinlock_t lock;struct list_head task_list; }; typedef struct __wait_queue_head wait_queue_head_t; 初始化等待队列&#xff1a;init_waitqueue_head 深挖init_waitqueue_head宏的定义可知&#xff0c;传递给它的参数q是一个wait_queu…

docker删除容器时报错:Error response from daemon: reference does not exist

前言 之前使用的docker版本太低了&#xff0c;升级高版本docker之后的错误。 低版本docker&#xff08;1.30.1&#xff09;中的镜像有&#xff1a;golang、mysql&#xff0c;将docker升级为24.0.5并新拉取mysql最新版本之后&#xff0c;执行docker images命令&#xff0c;发现…

【面试专题】Java核心基础篇①

&#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;Java面试专题 目录 1.面向对象的三大特性&#xff1f;分别解释下&#xff1f; 2.介绍一下Java的数据类型 3.说一说重写与重载的区别 4.说一说你对static关键字的理解 5.static修饰的类能不能…

neo4j查询语言Cypher详解(二)--Pattern和类型

Patterns 图形模式匹配是Cypher的核心。它是一种用于通过应用声明性模式从图中导航、描述和提取数据的机制。在MATCH子句中&#xff0c;可以使用图模式定义要搜索的数据和要返回的数据。图模式匹配也可以在不使用MATCH子句的情况下在EXISTS、COUNT和COLLECT子查询中使用。 图…

百川智能发布首个530亿参数闭源大模型,今年追上GPT-3.5

4月官宣创业&#xff0c;6月15日发布第一款7B开源模型&#xff0c;7月11日发布第二款13B、130亿参数开源模型。 平均保持2个月一个版本发布速度&#xff0c;8月8日&#xff0c;百川智能发布了创业以来的首个530亿参数闭源大模型——Baichuan-53B&#xff08;以下简称“53B”&a…

(十五)大数据实战——hive的安装部署

前言 Hive是由Facebook开源&#xff0c;基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供类SQL查询功能。本节内容我们主要介绍一下hive的安装与部署的相关内容。 正文 上传hive安装包到hadoop101服务器/opt/software目录 解…

承接各种设计

小弟985研究生毕业&#xff0c;目前攻读读博士&#xff0c;可做各种设计&#xff0c;包括但不限于Matlab 电力电子/电气工程&#xff0c;matlab/simulink 电气专业仿真MATLAB 电气工程专业&#xff0c;matlab建模 电力电子&#xff0c;电气工程&#xff0c;电力系统&#xff0c…

一文读懂什么是Byzer

目录 一、什么是Byzer? 二、Byzer特性 2.1 语法特性 2.2 数据的管理特性 2.3 支持自定义函数拓展Byzer语法 三、Byzer有哪些功能&#xff1f; 3.1 Byzer-Lang语言特性 3.1.1强大的数据处理能力 3.1.2内置机器学习算法 3.2 Byzer-Lang支持权限控制 3.3 Byzer-LLM拓展…

Stable Diffusion AI绘图教学

课程介绍下载 这门课程将教授学生使用Stable Diffusion AI绘图工具进行数据可视化和图形设计。学生将学习基本的绘图原理、数据分析技巧&#xff0c;以及如何使用Stable Diffusion AI创建高质量的图表和可视化作品。通过实践项目和案例研究&#xff0c;学生将提升绘图技能&…

通过easyui实现动态控制表格字段显示、导出表格数据

前言 学过layui前端框架的都知道&#xff0c;layui默认帮我们实现了控制表格字段显示以及数据的导出功能。 1、控制表格字段显示 2、数据导出 3、导出为pdf&#xff1a;导出按钮的右边那个按钮就是打印pdf的 那么&#xff0c;easyui要怎么实现这些功能呢&#xff1f;这篇文章就…

上市公司绿色发展专题:重污染行业企业名单与绿色创新数据

数据简介&#xff1a;上市公司&#xff0c;尤其是重污染行业上市公司实现绿色发展&#xff0c;广泛开展绿色创新&#xff0c;是我国高质量发展的必然要求&#xff0c;受到了来自学界与各级ZF的诸多关注。现有研究中对上市公司绿色发展问题的研究发现&#xff0c;重污染行业上市…