Java-Redis

文章目录

    • 基础
      • 基础内容
      • 使用场景/功能
      • 常见数据类型
      • 下载与安装
      • 可视化(多个)
      • 发布订阅功能
      • 事务
      • 两种持久化
      • 主从模式
      • 哨兵模式
      • 集群模式Cluster
      • 缓存淘汰
      • 过期删除
      • 缓存一致 Cache Aside
      • 缓存击穿
      • 缓存穿透
      • 缓存雪崩
      • 分布式锁
    • 实战内容
      • 配置文件
      • 配置Redis的Bean
      • Redis为什么这么快?
      • Hash冲突怎么办?
      • 项目与redis服务配置方式不同?

基础

基础内容

概念:Redis,全称为Remote Dictionary Server(远程数据服务),是开源的、基于内存的、键值对存储系统,是非关系型、日志型数据库;
特点:性能高;数据类型丰富,单键值对最大支持512M大小的数据;简单易用,支持所有主流编程语言;支持数据持久化、主从复制、哨兵模式等;

使用场景/功能

高性能缓存服务器:用于减轻数据库服务器的压力,项目运行将所必须内容加载到Redis中,提高项目对数据的获取速度;
数据共享:Redis是分布式的独立服务,可以多个项目使用相同的Redis;
分布式锁:实现对某操作的原子性执行,推荐使用redisson第三方库实现;
全局id:incrby 利用原子性,incrby userid 1000 分库分表的场景,一次性拿一段;
计数器:incr方法实现,目前涉及到的内容集中在计费操作,通过incr记次数实现;
限流:incr 本质还是统计次数,然后利用最大值限制;
位统计:用于大数据量的统计,通过二进制表示数据;
还有很多,不做详细介绍了 用到哪种学习哪种?
参考博客:https://blog.csdn.net/agonie201218/article/details/123640871	

常见数据类型

字符串String

key是区分大小写的;
默认使用String类型存储键值对;
get获取的key对应的value是不存在,那么会输出nil;
不支持中文存储value,只是通过二进制形式存储,若想正常实现存储内容,需要在登录的时候采用redis-cli --raw登录;
TTL 查询key对应的过期时间,值为-1,则表示该键没有过期时间;值为-2,表示该key已经过期了;

列表List

存储和操作一组有顺序的数据;
输入输出可以类比栈,单向输入输出;lPush在左侧输入输出,RPush在右侧输入输出;输入元素是abc 那么输出是cba;lPop 和 RPop也是类似的操作;Llen 获取 长度;
可以重复的;
相关命令以l开头;

集合Set

不可以重复;
smembers course ,假设该set集合没有元素,则返回empty list or set
相关命令以S开头;

有序集合 SortedSet

每一个key都会关联一个浮点类型的分数,会按照这个分数排序,从小到大来排序;
有序集合的元素是唯一的,但是分数是可以重复的;
相关命令都是z开头;

哈希hash

键值对的集合,适合存储对象;
相关命令都以h开头;

消息队列 Stream

可以解决发布订阅功能的缺点;
相关命令都以x开头;
涉及到消费者组、以及消息的多次读取;

地理空间 Geospatial

存储地理位置信息的数据结构,同时对地理位置进行计算操作;
相关命令都以Geo开头;
如果key-value存储地点-经纬度,那么通过查询key得到的是一个数组;
如果计算两个value之间的距离,返回结果默认是米;
查询某个key在指定半径内的其他key;命令:
GEOSEARCH City FROMMEMBER shanghai BYRADIUS 1000 KM 查询key=上海 1000千米范围内的key城市

HyperLogLog

是一种用来做基数统计的算法;基于随机算法,牺牲一些精确度的角度,来减轻内存消耗;
基数 = 如果集合中的元素都不重复,那么基数=集合中元素的个数;
例如:集合12345,它的基数是5,集合1122334455,它的基数仍旧是5;
优点:占用内存小;缺点:精度不高;
适用场景:数据量大,且不需要精确度的情况;
相关命令都以pf开头;

位图Bitmap

字符串类型的扩展,可以使用字符串模拟一个数组;
数组的下标就是偏移量,值只有01;也支持位运算,与 或 非 异或等;
相关命令有bit开头或bit结尾;

位域Bitfield

将小的整数,存储到一个较大的位图中,可以高校的使用内存;

下载与安装

三种方式实现:

linux系统;
windows系统的压缩包安装;
windows系统的docker desktop 镜像安装;

停止终端的方式:

按下ctrl+c 或者 关闭终端页面;

可视化(多个)

参考链接:https://blog.csdn.net/WeiHao0240/article/details/123423230
参考博客:https://blog.csdn.net/boboJon/article/details/135073969

发布订阅功能

订阅频道subscribe xxx
发布消息到频道publish xxx 消息内容
订阅频道的终端可以有多个;缺点:
消息无法持久化;
无法记录历史消息;

事务

概念:在一次请求中,执行多条命令;
通过MULTI开启事务,将后续所有命令放入队列中,通过EXEC执行队列中命令;
并不能保证事务中的所有命令都执行成功;
可以保证的内容:执行EXEC命令之前,会将所有命令都缓存起来,不立即执行;执行EXEC命令,事务中的某个命令执行失败,其余命令不会受到影响;执行EXEC命令过程中,其他用户提交的命令,不会插入得到命令的执行序列中;通过MULTI启动事务,指令会多TX标识符;
再次输入命令,会返回QUEUED,表示已经放入命令执行队列;

两种持久化

是一个重要的功能,Redis是基于内存的,如果断点,则会导致数据丢失;所以必须有持久化操作;
两种方式:RDBAOF 方式;
RDBRedis Database在指定时间间隔内,将内存中的数据快照写入磁盘中;某个时间点上完整副本;通过save参数配置;save 参数1 参数2  --》参数1=时间间隔 参数2=修改次数更适合用来做备份,因为如果服务宕机,那么快照最后一次后的所有修改就会丢失;思考1:由于正式环境中 redis都会给分配较大的内存空间,通过RDB进行备份的时候,redis是不能进行处理的,会影响业务;通过提供bgsave命令处理,会创建一个子进程专门处理备份,主进程处理业务,但是在创建子进程的过程中仍旧不能处理业务;
AOF:执行追加文件,在执行写命令的过程中,不仅会将结果写入数据库中,而且会将写命令写入追加文件中(AOF文件);redis执行写操作时,会重新执行AOF文件,重新构建数据库;开启AOF方式:配置文件中,将appendonly参数值改成yes;

主从模式

将主节点数据复制到从节,主节点-master,从节点slave;
从节点可以有很多,每个从节点只能有一个主节点;
数据的复制是单向的,只能从主节点到从节点;
主节点负责写操作,从节点负责读操作;
主节点通过异步的方式向从节点发送数据,从节点收到后更新自己的数据;
一台主机上可以配置多个redis 通过不同的端口号进行区分;

配置:

主节点 不需要配置,因为默认就是主节点;
设置从节点的方式两种:命令 以及 配置文件修改
命令:role --》 查看当前节点角色replicaf host port --》配置所属主节点
配置文件:是redis.conf文件修改端口号:port pidfile 都要修改端口号dbfilename 配置也要加上端口号rplicaof host port 配置主节点Redis默认是以守护进程的方式运行,系统默认会将pid写入文件中;redis-cli登录:info replication 查看配置信息;

哨兵模式

主从模式存在问题:
当主节点宕机之后,需要人工干预将从节点提升为主节点;

哨兵模式:

哨兵以一个独立的进程运行在一个Redis集群中,用来监控Redis集群中的节点是否运行正常;
作用:监控:会不断向各个节点发送指令,检查各个节点的是否正常运行;通知:发现某个节点不能正常工作,会通过发布订阅模式,通知其他节点;自动故障转移:会将从节点变成新的主节点,再将其他从节点指向该主节点;哨兵模式配置:配置文件sentinel.conf内容:sentinel monitor master ip port 1ip 和 port都是主节点的1 = 使用一个哨兵来实现故障转移正式环境中一般都采用3个哨兵,防止哨兵节点宕机;
启动哨兵模式:redis-sentinel sentinel.conf

集群模式Cluster

解决问题:采用主从复制、哨兵机制,每台机子上完整存储所有数据,当数据量特别大的时候,这种情况是无效的;
定义:cluster是redis提供的分布式数据库解决方案,将所有数据分片,节点进行领取,即使某些节点宕机,也还可以执行操作;
数据分片:将key通过CRC16校验函数计算,再对16384取模运算,再决定数据分配到哪个槽位(也即是片、slot)	;每个redis的cluster节点负责一部分槽数据的存储;(槽数据 = 存储在特定槽上的所有键值对)这些节点再结合主从复制模式,对数据进行备份;
查询策略:每个节点都会存储整个集群节点信息,这些叫元信息;元信息:各节点存储的槽数据、master和slave状态、节点存活状态;两次查询实现数据查询;
元信息传递:gossip协议,每个节点把自己的数据信息通过协议传递出去;具体过程:周期性执行;所有被感染的节点选择k个相邻的节点散播消息;
扩容缩容:当数据量大时,增加节点;数据量少,减少节点;	

缓存淘汰

淘汰策略:常用的三个;默认是LRU先进先出FIFO:类似一个队列,淘汰最早载入缓存的数据;最近最早使用LRU:老数据,按照最近被访问的时间排序,末端节点删除;实现思路-双向链表+哈希表;双向链表存储键值对;哈希表存储key和双向链表的node节点的指针引用;具体执行: 当某个key被访问到,会将其对应的node节点放到双向链表的头部;最不经常使用LFU:多一个 被访问次数 这个属性;key+value 结合被访问次数,组成新的数据结构;将该数据结构放入双向链表中,按照次数从大到小的排序方式,先替换排在最后的元素;

过期删除

默认采用定期删除;
目前有三种策略:主动删除、惰性删除、定期删除;主动删除:设置错误间隔时间,在指定时间后进行主动删除;缺点:当redis比较忙,删除时间刚好到了,则会增加服务器的负担;惰性删除:程序访问某个数据,先判断是否已经过期,没过期则返回,反之,则删除;缺点:只有当被访问到的时候,才进行删除,会导致内存中存在大量无效数据,造成资源的浪费;定期删除:主动删除+惰性删除;每个一段时间,执行主动删除;其余时间,采用惰性删除;

缓存一致 Cache Aside

定义:后端缓存数据 = 数据库数据,并不是时时刻刻保持一致,允许在一定小范围内,出现不一致的情况;
采用策略:Cache Aside策略:模式1 = 删除缓存、更新数据库模式2 = 更新数据库、更新缓存Read/Write Through将缓存作为主要的数据读取方式,如果缓存中没有数据,则更新缓存,再从缓存中取数;Write Behind更新数据库与更新缓存都采用异步的形式;结合mysql的主从复制模式,将mysql作为主服务,redis作为从服务;

模式1:
在这里插入图片描述
模式2:
在这里插入图片描述
Read/Write Through
在这里插入图片描述
Write Behind
在这里插入图片描述

缓存击穿

定义:查询某个数据的值,缓存中没有,而数据库中有
危害:如果访问该key的量特别大,且缓存中没有,则请求全部会访问数据库;redis的性能是mysql数据库的10-100倍,当访问量redis可以承受时,转到mysql上,可能就会导致mysql宕机;
解决:mysql角度,加锁,控制redis击穿之后数据库的并发访问量;redis角度,热点数据永不过期;异步线程,将重要数据、已经过期的 进行过期时间重置;

缓存穿透

定义:一条查询数据,缓存中没有,数据库中也没有;
解决方法:拦截非法请求;缓存空对象;布隆过滤器;

布隆过滤器:
在这里插入图片描述

缓存雪崩

定义:一大批缓存数据都失效,故此这批请求都会被打到数据库上,导致数据库宕机;
与缓存击穿的区别:缓存击穿是单点;缓存雪崩是多点;
解决方式:mysql角度,加锁,减少数据库并发量;redis角度,	热点数据永不过期;让失效时间分散点;缓存预热,即在上线前,根据当天的情况,将数据直接加载到缓存系统;

分布式锁

实战内容

配置文件

单机模式:

spring:redis:enable: true
// 意图是控制是否启用Redis功能host: localhostport: 6379database: 0// redis数据库的索引,表示第一个数据库timeout: 10000ms// Redis服务器的超时时间,单位ms,也就是10秒lettuce:// spring data redis默认使用的客户端;pool:// 配置lettuce的连接池配置max-active: 8// 最大活动连接数max-idle: 8// 最大空闲连接数min-idle: 0// 最小空闲连接数max-wait: -1ms// 获取连接的最大等待时间

主从模式:

// 通过spring.redis.sentinel来配置;spring:redis:sentinel:// 配置使用主从复制模式master: mymaster// 指定主服务器组nodes:- "sentinel1:26379"- "sentinel2:26379"- "sentinel3:26379"// seninel实例的主机名或ip 以及端口号database: 0timeout: 10000mspassword: yourpasswordSentinel配置文件:(哨兵模式)
# Sentinel配置文件位置 /etc/redis/sentinel.conf 
具体内容:sentinel monitor mymaster 192.168.1.100 6379 2
# 监控名为mymaster
# 监控主机的ip和port 192.168.1.100 6379
# 至少有2个sentinel确认服务器宕机后才进行故障转移
sentinel down-after-milliseconds mymaster 30000
# 如果sentinel在3,0000毫秒内没有收到主服务器的有效回复,则认为主服务器宕机;
sentinel failover-timeout mymaster 180000
# 故障转移,等待新主机启动的超时时间为18,0000毫秒
sentinel parallel-syncs mymaster 1
# 故障转移过程中,同时复制给从服务器的数量限制为1

集群模式:

spring:redis:cluster:// 指定redis采用集群模式nodes:// 集群中的节点列表,每个节点都是集群中的一个成员;- "node1:7000"- "node2:7000"- "node3:7000"- "node4:7000"- "node5:7000"- "node6:7000"password: yourpasswordtimeout: 10000ms

配置Redis的Bean

public class RedisConfig {@Autowiredprivate StringRedisTemplate commonStringRedisTemplate;// 自动注入StringRedisTemplate实例;// 是 Spring Data Redis 提供的一个模板类,专门用于处理字符串类型的键值对;@Bean// 将返回一个可以被 Spring 管理的 Bean。public RedisOperations commonRedisOperations(){RedisOperations redisOperations = new DefaultRedisOperations(commonStringRedisTemplate);// 创建了一个 DefaultRedisOperations 实例,这是一个自定义的类(假设它是存在的),它接受 StringRedisTemplate 作为构造函数的参数。// 用于封装 Redis 操作,并初始化分布式锁机制。DistributedLock.init(redisOperations);// 初始化一个分布式锁机制,接受一个 RedisOperations 参数用于设置内部的 Redis 操作实例。同时,在应用程序启动时,分布式锁就会准备好使用。log.info("{}","Redis分布式锁初始化完成");return redisOperations;}
}

Redis为什么这么快?

Hash冲突怎么办?

项目与redis服务配置方式不同?

问题描述:项目配置redis,采用单机模式配置;redis服务,采用集群方式;导致项目启动异常;
分析:Redis 服务是按照集群(cluster)模式部署的,而应用程序却以单机(standalone)模式尝试连接到该集群中的某一个节点,这通常不会直接导致 Redis 服务本身启动异常。但会遇到连接或者操作失败的问题。

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

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

相关文章

Redis(面试题【速记】)

Redis简介 Redis 是一个开源(BSD 许可)内存数据结构存储用作数据库、缓存、消息代理和流引擎。Redis 提供数据结构,例如 字符串、散列、列表、集合、带范围查询的排序集合、位图、超日志、地理空间索引和流。Redis 内置了复制、Lua 脚本、LRU 驱逐、事务和不同级别的…

编程征途:接受挫折、分解问题、寻求帮助、持续反思

在编程学习的征途中,挫折感与难题如影随形,它们不仅是成长的催化剂,也是区分初学者与高手的试金石。作为程序员,面对Bug的迷宫和复杂的算法挑战时,保持冷静、寻找出路,是必备的技能之一。以下是我个人在这一…

免费SSL证书申请流程开启HTTPS,以及3个月到期解决方法

阿里云免费SSL证书申请流程2024年最新申请教程,阿里云免费SSL证书品牌是Digicert,免费单域名证书,一个阿里云账号可以免费申请20张SSL免费证书,免费时长为3个月(之前是一年免费时长),免费SSL证书…

企业监控大盘Grafana

企业监控大盘Grafana Grafana简述 Grafana 是一个开源的度量分析与可视化工具。提供查询、可视化、报警和指标展示等功能,能灵活创建图表、仪表盘等可视化界面 主要功能: 可视化: 提供多种可选择的不同类型的图形,能够灵活绘制不同样式&…

Centos系统二进制安装mysql5.7.44、添加环境变量、复制启动脚本、初始化数据库、设置用户密码

MySQL :: Download MySQL Community Server (Archived Versions) https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz 删除默认存在的mariadb-libs rpm -e mariadb-libs --nodeps 安装mysql cd /usr/local/src/ && …

vue part4

收集表单数据 v-model label直接包住input不用关联也可以获取焦点 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>收集表单数据</title><script type"text/javascript" src&quo…

Java数据结构篇

Map体系 1.HashMap 哈希冲突&#xff1a;开放定址法、再哈希法、链地址法插入元素先检查是否到达阈值&#xff0c;是则先数组扩容&#xff0c;然后再插入链表&#xff0c;链表长度超过8则转红黑树1.7之前由于扩容导致的头插法尾插法混合导致指针错误&#xff0c;出现死循环问…

编程示例:汉字生成盲文的翻译器

1 翻译器的意义 我国有视障人士2000多万人&#xff0c;需要把大量的文章与书籍转换成盲文书。 2 翻译器的开发原理 根据汉语与盲文符号的对照表&#xff0c;以此为基础&#xff0c;进行汉字与盲文之间的转换。 如下的两个图片是汉语与盲文符号的对照表。 3 翻译器的开发示例…

BMP位图原理深度解析及编程实现RGB565图片格式转换

1、前言 在Windows的画图软件中可以看到&#xff0c;常见的BMP有如下图所示的几种&#xff1a;单色位图、16色位图、256色位图和24位位图&#xff0c;其颜色深度分别为1、4、8、24。 在一些单片机设备中的LCD显示屏幕中&#xff0c;仅仅支持RGB565这一类的16位颜色深度图像&…

[windows][软件]Windows平台MongoDB的安装

1.下载软件 上mongoDB官网&#xff0c;网址&#xff1a;Download MongoDB Community Server | MongoDB&#xff0c; 下载对应的版本软件 2.安装 下载安装包如图&#xff1a; 双击安装&#xff1a; 默认&#xff0c;点击next 默认,点击next 默认点Complete&#xff0c;完整安…

混杂设备驱动、Linux内核中的中断、火焰传感器驱动、呼吸传感器驱动、等待队列

混杂设备驱动 混杂设备也叫杂项设备&#xff0c;是对普通的字符设备(struct cdev)的一种封装。misc 设备会自动创建cdev&#xff0c;不需要像我 们以前那样手动创建&#xff0c;因此采用misc 设备驱动可以简化字符设备驱动的编写。具有以下特点&#xff1a; 1) 主设备号为10&…

DVWA靶场通关(CSRF)

CSRF 是跨站请求伪造&#xff0c;是指利用受害者尚未失效的身份认证信息&#xff08;cookie、会话等&#xff09;&#xff0c;诱骗其点击恶意链接或者访问包含攻击代码的页面&#xff0c;在受害人不知情的情况下以受害者的身份向&#xff08;身份认证信息所对应的&#xff09;服…

WRF-LES与PALM微尺度气象大涡模拟

针对微尺度气象的复杂性&#xff0c;大涡模拟&#xff08;LES&#xff09;提供了一种无可比拟的解决方案。微尺度气象学涉及对小范围内的大气过程进行精确模拟&#xff0c;这些过程往往与天气模式、地形影响和人为因素如城市布局紧密相关。在这种规模上&#xff0c;传统的气象模…

生信学院|09月06日《在线产品交流工具》

课程主题&#xff1a;在线产品交流工具 课程时间&#xff1a;2024年09月06日 14:00-14:30 主讲人&#xff1a;曾裕章 生信科技 售后服务工程师 3DEXPERIENCE云平台基于云平台的交流工具XPR功能讲解Q&A 安装腾讯会议客户端或APP报名哦~~~ 或者点击链接报名&#xff1a;…

C语言进阶(一)数据在内存中的存储

整数在内存中的存储 整数的2进制表示方法有三种&#xff0c;即原码、反码和补码 有符号的整数&#xff0c;三种表示方法均有符号位和数值位两部分 符号位用0表示“正”&#xff0c;用1表示“负”&#xff0c;最高位被当做符号位&#xff0c;剩余的都是数值位 正整数的原、反…

构建buildroot根文件系统

目录 1.确定gcc工具版本2.下载Buildroot源码并编译2.1 下载Buildroot源码2.2 配置Buildroot2.2.1 配置 Target options2.2.2 配置交叉编译工具链2.2.3 配置 System configuration2.2.4 配置 Filesystem images2.2.5 禁止编译 Linux 内核和 uboot2.2.6 编译Buildroot源码2.2.7 查…

【多线程】深入剖析线程安全问题

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;多线程 / javaEE初阶 前言 线程安全问题是在多线程学习中一个十分重要的话题。多个线程并发执行就容易产生许多冲突与问题&#xff0c;如何协调好每个线程的执行&#xff0c;让多线程编程“多而不乱…

【Node】【3】回调函数

nodejs 是一个基于事件驱动和非阻塞异步的JavaScript运行时环境。 Node.js 采用单线程模型&#xff0c; 单线程意味着 Node.js 在任何给定时刻只能执行一段代码&#xff0c;但通过异步执行回调函数&#xff0c;可以在等待 I/O 操作完成的同时继续执行其他代码&#xff0c;从而…

每日一练-threejs实现三维动态热力图

前言&#xff1a;学习自用Three.js搞个炫酷热力山丘图&#xff0c;作者讲解的十分详细&#xff0c;在这里不再过多赘述&#xff0c;直接上代码&#xff01; <template><div class"map" ref"map"></div> </template><script set…

XTuner微调个人小助手认知 #书生浦语大模型实战营#

1.任务&#xff1a; 本次的任务是使用 XTuner 微调 InternLM2-Chat-1.8B 实现自己的小助手认知&#xff0c;从而让模型能够个性化的回复&#xff0c;让模型知道他是我们的小助手&#xff0c;在实战营帮我们完成XTuner微调个人小助手认知的任务。并截图打卡。 任务打卡&#x…