Redis客戶端使用(Client、Java、SpringBoot)

上篇文章:

Redis數據類型之zsethttps://blog.csdn.net/sniper_fandc/article/details/149139955?fromshare=blogdetail&sharetype=blogdetail&sharerId=149139955&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

目錄

1 Redis客戶端和服務器使用自定義協議

2 Java集成Redis

2.1 端口開放

2.2 依賴引入

2.3 測試連接

2.4 set和get測試

2.5 exists和del測試

2.6 keys測試

2.7 expire和ttl測試

2.8 type測試

3 SpringBoot集成Redis

3.1 配置文件

3.2 使用方法

3.2.1 引入依賴

3.2.2 注入Bean

3.2.3 使用redis


1 Redis客戶端和服務器使用自定義協議

????????Redis客戶端和服務器使用自定義協議(應用層)進行網絡通信,即RESP協議。

????????RESP協議是基于序列化的協議,傳輸的數據以字符串格式組織。優點是:1.簡單好實現。2.快速進行解析。3.肉眼可讀。

????????該協議的傳輸層協議是TCP,但是只使用了TCP協議的連接操作,其他的沒再使用。請求和響應之間采用:一問一答的形式。請求發送客戶端的Redis命令的bulk strings數組,響應返回的類型不同,根據不同Redis命令的實現返回不同類型的響應(OK、整數、數組等等)。

????????對于請求和響應的數據的字符串有5種類型:

????????(1)Simple Strings:以+開頭的字符串,只能傳輸簡單的文本,不能傳輸二進制安全的數據。

????????(2)Errors:以-開頭的字符串。

????????(3)Integers:以:開頭的字符串。

????????(4)Bulk Strings:以$開頭的字符串,能傳輸二進制安全的數據。

????????(5)Arrays:以*開頭的字符串。

2 Java集成Redis

2.1 端口開放

????????使用Java訪問Redis如果采用本地方式訪問,即Java程序和Redis服務器在一臺主機上,通過127.0.0.1:6379即可訪問。但是Java客戶端如果想要跨主機訪問Redis客戶端,就必須通過公網IP來訪問,這就會把Redis的端口6379暴露在公網中,很容易遭受黑客入侵。

????????解決辦法是使用ssh協議,配置ssh端口轉發,把遠程Redis服務器的端口號映射到本地主機。ssh協議通常用于Windows與Linux系統網絡交互,默認端口號22,由于ssh協議是加密的網絡傳輸協議,安全程度很高,因此可以構造ssh請求包,把希望訪問Redis端口號6379構造成ssh請求包的數據,通過22端口傳輸到Linux服務器,再由Linux服務器的ssh協議解析請求。

????????由于可能有多個客戶端想要跨主機訪問Linux服務器的其他服務器的端口號,ssh為了區分這些端口號,就會把Linux的各種服務的端口號映射到本地主機(發出訪問請求的主機)的其他端口號(比如Linux的Redis端口6379映射到本地主機8888端口),從而達到客戶端訪問本地端口即可實現訪問Redis端口,這就是ssh的端口轉發功能。客戶端訪問本地端口,其余的事情都有ssh來完成(數據通過ssh協議的加密通道完成傳輸)。

????????這里使用FinalShell終端連接工具,其他終端連接工具都有類似的界面:

????????選擇新建隧道,配置ip和端口號,這里類型是本地,沒有用到跨主機連接(遠程類型)。目標地址是Redis服務器的地址,即Linux的地址。監聽端口表示Redis端口映射到本地的端口是8888:

????????8888端口出現監聽狀態,說明配置成功。

2.2 依賴引入

????????<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.2</version></dependency>

2.3 測試連接

????public void testRedis(){JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");try(Jedis jedis = jedisPool.getResource()){String pong = jedis.ping();System.out.println("收到來自Redis服務器的響應:" + pong);}}

????????由于配置了ssh端口轉發,因此這里訪問本機的8888端口即可訪問Redis的服務器。

2.4 set和get測試

????public void testSetAndGet(){try(Jedis jedis = jedisPool.getResource()){SetParams setParams = new SetParams();setParams.px(10);jedis.set("javatest","1");String result = jedis.get("javatest");System.out.println("javatest:" + result);}}

2.5 exists和del測試

????public void existanddel(){try(Jedis jedis = jedisPool.getResource()){jedis.set("javatest","1");Boolean result = jedis.exists("javatest");System.out.println("javatest是否存在?" + result);Long delResult = jedis.del("javatest","javatest2");System.out.println("刪除元素個數:" + delResult);result = jedis.exists("javatest");System.out.println("javatest是否存在?" + result);}}

2.6 keys測試

????public void keys(){try(Jedis jedis = jedisPool.getResource()){jedis.flushAll();jedis.set("javatest","1");jedis.set("javatest2","2");Set<String> result = jedis.keys("*");System.out.println(result.toString());}}

2.7 expire和ttl測試

????public void expireAndTtl(){try(Jedis jedis = jedisPool.getResource()){jedis.flushAll();jedis.set("javatest","1");jedis.expire("javatest",10);System.out.println("等待3s后");Thread.sleep(3000);Long time = jedis.ttl("javatest");System.out.println("剩余的時間:" + time + "s");} catch (InterruptedException e) {throw new RuntimeException(e);}}

2.8 type測試

????public void type(){try(Jedis jedis = jedisPool.getResource()){jedis.flushAll();jedis.set("key1","1");String result1 = jedis.type("key1");System.out.println("key1類型為:" + result1);jedis.lpush("key2","1","2");String result2 = jedis.type("key2");System.out.println("key2類型為:" + result2);jedis.hset("key3","field1","1");String result3 = jedis.type("key3");System.out.println("key3類型為:" + result3);jedis.sadd("key4","1","2");String result4 = jedis.type("key4");System.out.println("key4類型為:" + result4);jedis.zadd("key5",10,"user1");String result5 = jedis.type("key5");System.out.println("key5類型為:" + result5);}}

????????其余的命令不再演示,Jedis提供的Java客戶端訪問Redis的命令基本和Redis客戶端的命令一致,使用很簡單,只是需要注意返回值和變長參數(或者是Map來組織變長參數)。

3 SpringBoot集成Redis

3.1 配置文件

# Redis配置spring:redis:host: 127.0.0.1port: 8888

3.2 使用方法

3.2.1 引入依賴

????????<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

????????該依賴是SpringBoot集成的Redis依賴Spring Data Redis,SpringBoot 2內置的Redis是Lettuce實現,而不是Jedis實現,因此使用上有點區別。

3.2.2 注入Bean

????@Autowiredprivate StringRedisTemplate redisTemplate;

????????這里StringRedisTemplate是已經交付給Spring管理的Bean,它是RedisTemplate的子類。RedisTemplate通過泛型控制是處理文本類型的數據還是處理字節類型的數據。

3.2.3 使用redis

@RequestMapping("/springbootRedis")@RestControllerpublic class RedisController {@Autowiredprivate StringRedisTemplate redisTemplate;@RequestMapping("/test")public void useRedis(){// 使用opsForXXX()方法得到對應類型的操作對象// string類型的操作redisTemplate.opsForValue().set("key","1");String result = redisTemplate.opsForValue().get("key");System.out.println("key:" + result);redisTemplate.delete("key");// list類型的操作redisTemplate.opsForList().leftPush("key", "a");redisTemplate.opsForList().leftPushAll("key", "b", "c", "d");List<String> values = redisTemplate.opsForList().range("key", 1, 2);System.out.println(values);redisTemplate.delete("key");// hash類型的操作redisTemplate.opsForHash().put("key", "name", "zhangsan");String value = (String) redisTemplate.opsForHash().get("key", "name");System.out.println(value);redisTemplate.opsForHash().delete("key", "name");boolean ok = redisTemplate.opsForHash().hasKey("key", "name");System.out.println(ok);redisTemplate.delete("key");// set類型的操作redisTemplate.opsForSet().add("key", "aaa", "bbb", "ccc");boolean ok1 = redisTemplate.opsForSet().isMember("key", "aaa");System.out.println(ok1);redisTemplate.opsForSet().remove("key", "aaa");long n = redisTemplate.opsForSet().size("key");System.out.println(n);redisTemplate.delete("key");// zset類型的操作redisTemplate.opsForZSet().add("key", "user1", 100);redisTemplate.opsForZSet().add("key", "user2", 98);redisTemplate.opsForZSet().add("key", "user3", 95);Set<String> values2 = redisTemplate.opsForZSet().range("key", 0, 2);System.out.println(values2);long n2 = redisTemplate.opsForZSet().count("key", 95, 100);System.out.println(n);redisTemplate.delete("key");}}

????????這里的使用方法是先要用opsForXXX()方法獲取不同類型的操作對象,再通過該操作對象來進行操作。具體的api可能和命令不一樣,但是通過方法的名字也可以知道該方法對應的命令。

下篇文章:

Redis原理之持久化https://blog.csdn.net/sniper_fandc/article/details/149140995?fromshare=blogdetail&sharetype=blogdetail&sharerId=149140995&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914515.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914515.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914515.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Modbus 開發工具實戰:ModScan32 與 Wireshark 抓包分析(一

引言 ** 在工業自動化領域&#xff0c;Modbus 協議猶如一座橋梁&#xff0c;連接著各種電子設備&#xff0c;實現它們之間高效的數據交互。從可編程邏輯控制器&#xff08;PLC&#xff09;到人機界面&#xff08;HMI&#xff09;&#xff0c;再到各類智能傳感器&#xff0c;M…

Oracle SQL - 使用行轉列PIVOT減少表重復掃描(實例)

[13/JUL/2025, Yusuf Leo, Oracle SQL Performance Tuning Series]我們經常會遇到從同一表中按不同維度取出不同區間的數據&#xff0c;再以相同的屬性將這些數據分別匯總到一起的需求。這類需求往往迫使我們對同一個表反復去掃描&#xff0c;當原始數據量太大的時候&#xff0…

HTTP 請求方法詳解:GET、POST、PUT、DELETE 等

在 HTTP 協議中&#xff0c;請求方法&#xff08;也稱為 HTTP 動詞&#xff09;定義了客戶端希望對指定資源執行的操作類型。這些方法是 HTTP 報文的核心組成部分&#xff0c;決定了請求的目的和行為。 主要 HTTP 請求方法 1. GET 用途&#xff1a;獲取資源 特點&#xff1a…

Android 代碼熱度統計(概述)

1. 前言 代碼熱度統計&#xff0c;在測試中一般也叫做代碼覆蓋率。一般得到代碼覆蓋率后就能了解整體樣本在線上的代碼使用情況&#xff0c;為無用代碼下線提供依據。 做了一下調研&#xff0c;在Android中一般比較常用的是&#xff1a;JaCoCO覆蓋率統計工具&#xff0c;它采…

RAG優化

RAG搭建本地AI知識庫&#xff0c;在使用過程中遇到的三大痛點&#xff0c;以及相應的進階方案。1. RAG知識庫的三大痛點-- 內容理解不足&#xff1a;AI難以全面理解導入資料的內容&#xff0c;比如在向量編碼時候&#xff0c;生硬的截斷等導致分析結果不理想。eg: 知識庫分割器…

Ubuntu 24.04 啟用 root 圖形登錄

關鍵詞&#xff1a;Ubuntu 24.04、root 登錄、GDM、SSH、nano、配置文件一、前言 Ubuntu 默認禁用 root 賬戶 的圖形與 SSH 登錄&#xff0c;這是為了安全。但在某些場景&#xff08;如測試、救援、自動化腳本&#xff09;你可能需要 直接用 root 登錄 GNOME 桌面。本文以 Ubun…

Jekyll + Chirpy + GitHub Pages 搭建博客

Chirpy 是適用于技術寫作的簡約、響應迅速且功能豐富的 Jekyll 主題&#xff0c;文檔地址&#xff1a;https://chirpy.cotes.page/ &#xff0c;Github 地址&#xff1a;jekyll-theme-chirpy 。 1.開始 打開 chirpy-starter 倉庫&#xff0c;點擊按鈕 Use this template -->…

學習 Flutter (一)

學習 Flutter (一) 1. 引言 什么是 Flutter&#xff1f; Flutter 是 Google 開發的一套開源 UI 框架&#xff0c;主要用于構建高性能、高保真、跨平臺的應用程序。使用一套 Dart 編寫的代碼&#xff0c;開發者可以同時構建適用于&#xff1a; Android iOS Web Windows、mac…

Spring Boot 實現圖片防盜鏈:Referer 校驗與 Token 簽名校驗完整指南

Spring Boot 實現圖片防盜鏈教程&#xff08;Referer 校驗 Token 簽名校驗&#xff09;本文將詳細講解兩種防盜鏈實現方案&#xff0c;并提供完整代碼示例。方案一&#xff1a;Referer 校驗通過檢查 HTTP 請求頭中的 Referer 字段判斷來源是否合法。實現步驟創建 Referer 攔截…

從 JSON 到 Python 對象:一次通透的序列化與反序列化之旅

目錄 一、為什么要談 JSON 二、最快速上手&#xff1a;兩把鑰匙 dumps 與 loads 三、深入 dumps&#xff1a;參數是魔法棒 四、深入 loads&#xff1a;把風險擋在門外 五、文件級序列化&#xff1a;dump 與 load 六、處理中文與編碼陷阱 七、異常場景與調試技巧 八、實…

Leetcode 3315. 構造最小位運算數組 II

1.題目基本信息 1.1.題目描述 給你一個長度為 n 的質數數組 nums 。你的任務是返回一個長度為 n 的數組 ans &#xff0c;對于每個下標 i &#xff0c;以下 條件 均成立&#xff1a; ans[i] OR (ans[i] 1) nums[i] 除此以外&#xff0c;你需要 最小化 結果數組里每一個 a…

黑搜小知識 | DNS域名解析過程是什么樣的?

什么是DNS&#xff1f;DNS( Domain Name System)是“域名系統”的英文縮寫&#xff0c;是一種組織成域層次結構的計算機和網絡服務命名系統&#xff0c;它用于TCP/IP網絡&#xff0c;它所提供的服務是用來將主機名和域名轉換為IP地址的工作。舉例來說&#xff0c;如果你要訪問域…

MyBatis 使用教程及插件開發

作者&#xff1a;小凱 沉淀、分享、成長&#xff0c;讓自己和他人都能有所收獲&#xff01; 本文的宗旨在于通過簡單干凈實踐的方式教會讀者&#xff0c;使用 SpringBoot 配置 MyBatis 并完成對插入、批量插入、修改、查詢以及注解事務和編程事務的使用&#xff0c;通過擴展插件…

Maui勸退:用windows直接真機調試iOS,無須和Mac配對

初級代碼游戲的專欄介紹與文章目錄-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代碼都將會位于ctfc庫中。已經放入庫中我會指出在庫中的位置。 這些代碼大部分以Linux為目標但部分代碼是純C的&#xff0c;可以在任何平臺上使用。 源碼指引&#xff1a;github源…

【極客日常】后端任務動態注入執行策略的一種技術實現

近期做項目時遇到一個場景&#xff0c;是需要在后端任務執行時動態注入策略。具體而言&#xff0c;筆者負責的后端服務&#xff0c;可以理解是會在線上服務發布時&#xff0c;對服務風險做實時掃描&#xff0c;那么這個掃描就需要根據當前線上服務發布上下文&#xff0c;匹配對…

8. JVM類裝載的執行過程

1. JVM介紹和運行流程-CSDN博客 2. 什么是程序計數器-CSDN博客 3. java 堆和 JVM 內存結構-CSDN博客 4. 虛擬機棧-CSDN博客 5. JVM 的方法區-CSDN博客 6. JVM直接內存-CSDN博客 7. JVM類加載器與雙親委派模型-CSDN博客 8. JVM類裝載的執行過程-CSDN博客 9. JVM垃圾回收…

Linux操作系統之信號:信號的產生

前言&#xff1a;上篇文章我們大致講解了信號的有關概念&#xff0c;為大家引入了信號的知識點。但光知道那些是遠遠不夠的。本篇文章&#xff0c;我將會為大家自己的講解一下信號的產生的五種方式&#xff0c;希望對大家有所幫助。一、鍵盤&#xff08;硬件&#xff09;產生信…

pdf拆分

文章目錄 背景目標實現下載 背景 好不容易下載的1000頁行業報告&#xff0c;領導非要按章節拆分成20份&#xff01;學術論文合集需要按作者拆分投稿&#xff0c;手動分頁到懷疑人生…客戶發來加密合同&#xff0c;要求每5頁生成獨立文檔&#xff0c;格式還不能亂&#xff01; …

vue3使用mermaid生成圖表,并可編輯

效果圖實際代碼<template><div class"mermaid-container" style"z-index: 99999" ref"wrapperRef"><!-- 控制欄 --><div class"control-bar"><div class"control-bar-flex control-bar-tab-wrap"…

tcp/quic 的滑動窗口

一、滑動窗口 rwnd&#xff1a; 接收端窗口&#xff0c;接收方在每次發送ACK確認報文時&#xff0c;會包含一個 rwnd (Receive Window Size) 字段&#xff0c;指明自己當前剩余的接收緩沖區大小&#xff08;即可用窗口&#xff09;&#xff0c;這里是否是socket的接收緩沖區&am…