[Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: [Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis
  1. 渐进式遍历
    1.1 概述
    我们在之前学习过一个指令,叫做keys *,这个指令就是把Redis中所有的key采用遍历的方式全部都获取到.但是这个操作比较危险,可能在Redis中存储的key比较多,可能会阻塞Redis,影响其他指令的执行.
    这时候我们就需要使用Redis中的渐进式遍历指令,scan指令.通过渐进式遍历,既可以获取到所有的key,同时又不会卡死服务器.这个命令,不是把所有的key一次性都拿到,而是每次执行命令,只获取其中的一小部分,如果key比较多的话,就需要多次执行scan命令,进行多次渐进式遍历.

1.2 常见指令
scan
scan cursor [MATCH pattern] [COUNT count] [TYPE type]
以渐进式遍历的方式对Redis中所有的键进行遍历.

cusor: 表示的是当前从哪个光标开始遍历.其中光标为0的时候,表示的是从头开始遍历所有的key.但是,光标的概念不可以理解为下标,它不是一个连续递增的整数,他只是一个普通的字符串,在每次遍历之后的返回结果中,都会返回下次遍历开始的光标,这个字符串看上去虽然是整数,但是他是一个字符串且和下标不对应,(如果返回的字符串是0,说明遍历已经完成)可能程序员不理解,但是Redis服务器是可以知道这个光标对应的元素的位置的.
pattern: 和前面介绍的keys命令是一样的.
count: 限制每次返回的元素个数,默认是10,但是需要注意的是,这里的count和MySQL中的limit不一样.count只是客户端给Redis服务器的一个建议,具体返回多少个,需要看具体的情况,比如只有9个key,但是count写的是10.这时候只返回9个key.但是limit是精确的,指定返回多少个就是返回多少个.
type: 指定key对应value的类型,其中包含5个通用类型,5个特殊场景使用的类型.

在遍历的过程中,不会在服务器中保存任何的状态信息.比如保存每次遍历之后的光标位置.此处的遍历是可以随时终止的,不会对服务器产生任何的副作用.

就像我们去吃烧烤,如果有一部分烧烤还没有上来,我们就需要退款,这时候老板就到后厨看了一眼,说已经烤上了,退不了了,再比如我们在遍历Redis服务器中的key的时候,遍历了一半,不想遍历了,但是这时候又取消不了,如果强行退出,这时候服务器就会保存状态,这时候就会对服务造成一定的影响,这时候就相当于服务器保存了客户端的状态.再比如我们去超市买东西,如果我们在结账的时候,发现钱没有带够,后面的东西不想要了,这时候可以不扫后面的商品.这时就像Redis中的渐进式遍历,没有保存之前遍历的状态,可以随时停止.

127.0.0.1:6379> mset k1 val1 k2 val2 k3 val3 k4 val4 k5 val5
OK
127.0.0.1:6379> scan 0 count 3
1) "1"//返回下次开始遍历的光标.
2) 1) "k3"
2) "k4"
3) "k5"
127.0.0.1:6379> scan 1 count 3
1) "0"
2) 1) "k1"
2) "k2"//虽然输入的count是3,但是只遍历了2个.
1
2
3
4
5
6
7
8
9
10
11
但是scan也存在一定的缺点.渐进式遍历虽然解决了阻塞的问题,但是如果在遍历的期间键有所变化(增加修改删除),可能会导致重复遍历或者是遗漏.

  1. 数据库管理
    在我们之前学习MySQL中,有一个非常重要的概念,叫做database.其中一个MySQL服务器中可以有很多个database,一个database中也可以有很多张表.
    其实在Redis中,也是有database这样的概念的,只不过不像MySQL那样随意,想创建多少个database就创建多少个.Redis中的database是现成的,用户不可以创建数据库,也不可以删除数据库.

默认Redis为我们提供了16个数据库.编号为0~15,这16个数据库之间是相互隔离的.默认的情况下使用的是0号数据库.

我们可以通过 select dbIndex(select+数据库编号)的指令来选择数据库.但是在实际使用中我们很少会关注数据库,一般我们使用0号数据库即可.
我们可以使用flushdb清除当前数据库中的所有数据.使用flushall清除Redis服务器中的所有数据.
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> SELECT 0
OK
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> keys *
(empty array)
1
2
3
4
5
6
7
8

  1. 在Java程序中控制Redis
    3.1 为什么可以使用Java支持Redis
    这个问题,就相当于问,我们为什么可以编写出一个自定义的Redis客户端.首先我们需要知道,在网络通行中,我们会使用到很多的"协议",其中这些协议都是固定好的,是在系统内核中或者驱动程序中实现的,程序员只可以选择,不可以修改.其中传输层协议常见的包含两种,一种是TCP协议,一种是UDP协议,其中Redis在传输层TCP协议的基础上,自定义了应用层协议,这个协议就是RESP协议.作为第三方的Java,想要开发一个Redis的客户端,也就需要知道Redis的应用层协议,Redis的RESP协议是在官网上开源出来的.

3.2 配置Windows环境与服务器的连接
在Java开发中,我们一般使用idea进行开发,也就是我们不可以在Linux操作系统上直接对Java进行开发,我们是高度依赖Windows环境的.这就需要我们把Windows中的Redis客户端连接到Linux云服务器中的Redis服务器中.这样的操作,就需要通过Linux服务器的外网IP和Redis服务器的端口号来访问到.但是光知道外网IP和端口号还是不行的,因为Redis服务器对应的默认6379端口号是被云服务器的防火墙保护起来的.也就是这个端口不可以在外网中访问到.
但是千万不可以在云服务器中的安全组配置中开放6379端口号,因为Redis的6379端口号安全系数非常低.开放在公网上很容易被黑客入侵.
那怎么办呢,此时就需要我们来配置xshell客户端与Java客户端的ssh端口转发,把云服务器上的Redis端口映射到本地的主机上.

什么是ssh呢?
ssh就是一个应用层网络协议,ssh默认走的是云服务器的22端口.其中ssh协议最重要的功能就是支持端口转发,相当于通过22端口来传递其他端口的数据.
在Windows主机上访问云服务器的6379端口号的时候,ssh就会构造一个数据报,把要访问Redis的请求放到ssh数据报中(访问6379端口号).

这个数据就会通过22端口发送给服务器,服务器的ssh服务程序,就可以解析出上述数据报,然后把数据报交给6379端口的程序.

比如我们将Windows主机上的8888端口号使用ssh协议映射到服务器上的6379端口号.

关于这个转发,我们需要在xshell中进行配置,后续就可以把云服务器中的端口当做一个本地的端口使用.

在使用的服务器上右击,选择属性,选择隧道.

选择添加,设置侦听端口为8888,目标端口6379.

确定之后,重新连接云服务器生效

相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
相关文章
|
16天前
|
消息中间件 NoSQL Java
Spring Boot整合Redis
通过Spring Boot整合Redis,可以显著提升应用的性能和响应速度。在本文中,我们详细介绍了如何配置和使用Redis,包括基本的CRUD操作和具有过期时间的值设置方法。希望本文能帮助你在实际项目中高效地整合和使用Redis。
35 1
|
1月前
|
NoSQL Java Redis
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
这篇文章介绍了Redis的基本命令,并展示了如何使用Netty框架直接与Redis服务器进行通信,包括设置Netty客户端、编写处理程序以及初始化Channel的完整示例代码。
49 1
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
|
1月前
|
缓存 NoSQL Java
Spring Boot与Redis:整合与实战
【10月更文挑战第15天】本文介绍了如何在Spring Boot项目中整合Redis,通过一个电商商品推荐系统的案例,详细展示了从添加依赖、配置连接信息到创建配置类的具体步骤。实战部分演示了如何利用Redis缓存提高系统响应速度,减少数据库访问压力,从而提升用户体验。
83 2
|
21天前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
34 0
|
1月前
|
NoSQL Java Redis
在 Spring 中操作 Redis
本文详细介绍了在Spring框架中如何通过引入依赖、配置文件、使用StringRedisTemplate类以及执行原生命令等方式来操作Redis数据库,并提供了对String、List、Set、Hash和ZSet数据类型的操作示例。
84 0
在 Spring 中操作 Redis
|
2月前
|
NoSQL 网络协议 Java
[Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis
[Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis
45 7
|
2月前
|
JSON NoSQL Java
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
这篇文章介绍了在Java中使用Redis客户端的几种方法,包括Jedis、SpringDataRedis和SpringBoot整合Redis的操作。文章详细解释了Jedis的基本使用步骤,Jedis连接池的创建和使用,以及在SpringBoot项目中如何配置和使用RedisTemplate和StringRedisTemplate。此外,还探讨了RedisTemplate序列化的两种实践方案,包括默认的JDK序列化和自定义的JSON序列化,以及StringRedisTemplate的使用,它要求键和值都必须是String类型。
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
|
1月前
|
存储 NoSQL Java
Spring Boot项目中使用Redis实现接口幂等性的方案
通过上述方法,可以有效地在Spring Boot项目中利用Redis实现接口幂等性,既保证了接口操作的安全性,又提高了系统的可靠性。
40 0
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
1月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
175 2
下一篇
无影云桌面