在Java中操作Redis(詳細-->從環境配置到代碼實現)

在Java中操作Redis

文章目錄

  • 在Java中操作Redis
    • 1、介紹
    • 2、Jedis
    • 3、Spring Data Redis
      • 3.1、對String的操作
      • 3.2、對哈希類型數據的操作
      • 3.3、對list的操作
      • 3.4、對set類型的操作
      • 3.5、對 ZSet類型的數據(有序集合)
      • 3.6、通用類型的操作

1、介紹

Redis 的Java客戶端很多,官方推薦的有三種:

  • Jedis

  • Lettuce

  • Redisson

Spring對Redis客戶端進行了整合,提供了Spring Data Redis,在Spring Boot項目中還提供了對應的Starter,即spring-boot-starter-data-redis

2、Jedis

Jedis的maven坐標:

     <!--redis--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.8.0</version></dependency>

使用Jedis操作Redis的步驟:

  1. 獲取連接
  2. 執行操作關閉連接
  3. 關閉連接

編寫一個測試類測試redis:

package com.mannor.jedisdemo;import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import redis.clients.jedis.Jedis;@SpringBootTest
class JedisDemoApplicationTests {@Testvoid contextLoads() {//1. 獲取連接Jedis jedis = new Jedis("localhost", 6379);//2. 執行操作關閉連接jedis.set("name", "mannor");//3. 關閉連接jedis.close();}
}

在此之前,需要將Redis服務啟動起來redis-server.exe

程序運行前:

image-20230812220121965

測試項目運行后:

image-20230812220213860

測試其他:

package com.mannor.jedisdemo;import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import redis.clients.jedis.Jedis;import java.util.Set;@SpringBootTest
class JedisDemoApplicationTests {/*** 使用jedis操作Redis*/@Testvoid contextLoads() {//1. 獲取連接Jedis jedis = new Jedis("localhost", 6379);//2. 執行操作關閉連接jedis.set("name", "mannor");//設置String name = jedis.get("name");//獲取System.out.println(name);jedis.del("name");//刪除jedis.hset("myhash","addr","beijing");//設置哈希表值String hget = jedis.hget("myhash", "addr");//獲取哈希表System.out.println(hget);Set<String> keys = jedis.keys("*");//獲取所有Redis的數據for(String key:keys){System.out.println(key);}//3. 關閉連接jedis.close();}}

測試項目源碼:上述測試項目的源碼

3、Spring Data Redis

在Spring Boot項目中,可以使用Spring Data Redis來簡化Redis操作,maven坐標:

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

Spring Data Redis中提供了一個高度封裝的類: RedisTemplate,針對jedis客戶端中大量api進行了歸類封裝,將同一類型操作封裝為operation接口,具體分類如下:

  • ValueOperations:簡單K-V操作
  • SetOperations:set類型數據操作
  • ZSetOperations:zset類型數據操作
  • HashOperations:針對map類型的數據操作
  • ListOperations:針對list類型的數據操作

yml配置文件:

spring:application:name: springdataredis_demo#Redis相關配置redis:host: localhostport: 6379#password: 123456database: 0 #操作的是0號數據庫(redis存在0-15號數據庫(默認),在命令中使用select來切換)jedis:#Redis連接池配置pool:max-active: 8 #最大連接數max-wait: 1ms #連接池最大阻塞等待時間 max-idle: 4 #連接池中的最大空閑連接min-idle: 0 #連接池中的最小空閑連接

在獲取到RedisTemplate對象執行下列語句:

redisTemplate.opsForValue().set("city","beijing");

輸出:image-20230812225658840

原因:RedisTemplate在操作Redis數據庫的時候,將key做了一個序列化,上述結果就是序列化的結果,為了解決這個問題就要配置一個配置類:

package com.itheima.config;import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;/*** Redis配置類*/
@Configuration
public class RedisConfig extends CachingConfigurerSupport {@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();//默認的Key序列化器為:JdkSerializationRedisSerializerredisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setConnectionFactory(connectionFactory);return redisTemplate;}
}

對于接下類的在java中對Redis的操作,我們可以參照Redis中的常用命令

3.1、對String的操作

(ValueOperations接口)示例:

@SpringBootTest
class SpringDataRedisApplicationTests {@Autowiredprivate RedisTemplate redisTemplate;/*** 操作String類型的數據*/@Testvoid contextLoads() {//redisTemplate.opsForValue().set("mannor" ,"rediaz");String mannor = (String) redisTemplate.opsForValue().get("mannor");System.out.println(mannor);redisTemplate.opsForValue().set("k1", "v1", 10L, TimeUnit.SECONDS);Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("mannor1", "mannor");System.out.println(aBoolean);}
}

3.2、對哈希類型數據的操作

@SpringBootTest
class SpringDataRedisApplicationTests {@Autowiredprivate RedisTemplate redisTemplate;/*** 操作hash類型的數據*/@Testpublic void hashTest() {HashOperations hashOperations = redisTemplate.opsForHash();//存hashOperations.put("002", "name", "zhangsan");hashOperations.put("002", "age", "20");hashOperations.put("002", "addr", "beijing");//取Object age = hashOperations.get("002", "age");
//        System.out.println((String) age);//獲取所有字段Set keys = hashOperations.keys("002");for (Object key : keys) {
//            System.out.println(key);}//獲得hash結構中的所有值List values = hashOperations.values("002");for (Object value : values) {System.out.println(value);}}}

3.3、對list的操作

    @Autowiredprivate RedisTemplate redisTemplate;/*** 操作list類型的數據*/@Testpublic void listTest() {ListOperations listOperations = redisTemplate.opsForList();//存listOperations.leftPush("list", "00");listOperations.leftPushAll("list", "01", "02", "03");//取值List list = listOperations.range("list", 0, -1);for (Object val : list) {System.out.println(val);}System.out.println("------------------------------------------------------------");//獲取長度來遍歷Long size = listOperations.size("list");for (int i = 0; i < size; i++) {//出隊列String element = (String) listOperations.rightPop("list");System.out.println(element);}

3.4、對set類型的操作

    @Autowiredprivate RedisTemplate redisTemplate;/*** 操作Set類型的數據*/@Testpublic void testSet() {SetOperations setOperations = redisTemplate.opsForSet();//存值setOperations.add("myset", "a", "b", "c", "a");//取值Set<String> myset = setOperations.members("myset");for (String o : myset) {System.out.println(o);}//刪除成員setOperations.remove("myset", "a", "b");//取值myset = setOperations.members("myset");for (String o : myset) {System.out.println(o);}}

3.5、對 ZSet類型的數據(有序集合)

    @Autowiredprivate RedisTemplate redisTemplate;/** * 操作ZSet類型的數據*/
@Test
public void testZset() {ZSetOperations zSetOperations = redisTemplate.opsForZSet();//存值zSetOperations.add("myZset", "a", 10.0);zSetOperations.add("myZset", "b", 11.0);zSetOperations.add("myZset", "c", 12.0);zSetOperations.add("myZset", "a", 13.0);//取值Set<String> myZset = zSetOperations.range("myZset", 0, -1);for (String s : myZset) {System.out.println(s);}//修改分數zSetOperations.incrementScore("myZset", "b", 20.0);//取值myZset = zSetOperations.range("myZset", 0, -1);for (String s : myZset) {System.out.println(s);}//刪除成員zSetOperations.remove("myZset", "a", "b");//取值myZset = zSetOperations.range("myZset", 0, -1);for (String s : myZset) {System.out.println(s);}
}

3.6、通用類型的操作

     @Autowiredprivate RedisTemplate redisTemplate;/*** 通用操作,針對不同的數據類型都可以操作*/@Testpublic void testCommon() {//獲取Redis中所有的keySet<String> keys = redisTemplate.keys("*");for (String key : keys) {System.out.println(key);}//判斷某個key是否存在Boolean itcast = redisTemplate.hasKey("itcast");System.out.println(itcast);//刪除指定keyredisTemplate.delete("myZset");//獲取指定key對應的value的數據類型DataType dataType = redisTemplate.type("myset");System.out.println(dataType.name());}

測試項目源代碼:https://gitee.com/rediaz/note-management/tree/master/Regis/SpringDataRedis

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

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

相關文章

基于Echarts的數據可視化大屏

本項目學習于b站up主&#xff08;視頻鏈接&#xff09; up主分享的資料&#xff0c;gitee倉庫&#xff1a; 其中有筆記&#xff0c;筆記鏈接 項目總結 項目主要分為前端頁面的布局和Echarts圖表的嵌入&#xff0c;頁面主要就是css較為繁瑣&#xff0c;圖表畢竟官網有模板&…

Python 2.x 中如何使用pandas模塊進行數據分析

Python 2.x 中如何使用pandas模塊進行數據分析 概述: 在數據分析和數據處理過程中&#xff0c;pandas是一個非常強大且常用的Python庫。它提供了數據結構和數據分析工具&#xff0c;可以實現快速高效的數據處理和分析。本文將介紹如何在Python 2.x中使用pandas進行數據分析&am…

【深度學習_TensorFlow】自定義層實現cifar10

寫在前面 盡管 tf.keras 提供了很多的常用網絡層類&#xff0c;但深度學習可以使用的網絡層遠遠不止這些。科研工作者一般是自行實現了較為新穎的網絡層&#xff0c;經過大量實驗驗證有效后&#xff0c;深度學習框架才會跟進&#xff0c;內置對這些網絡層的支持。因此掌握自定…

學習筆記整理-面向對象-01-認識對象

一、認識對象 1. 對象 對象(object)是鍵值對的集合&#xff0c;表示屬性和值的映射關系。 對象的語法 k和v之間用冒號分割&#xff0c;每組k:v之間用逗號分割&#xff0c;最后一個k:v對后可以不書寫逗號。 屬性是否加引號 如果對象的屬性鍵名不符合命名規范&#xff0c;則這…

數組slice、splice字符串substr、split

一、定義 這篇文章主要對數組操作的兩種方法進行介紹和使用&#xff0c;包括&#xff1a;slice、splice。對字符串操作的兩種方法進行介紹和使用&#xff0c;包括&#xff1a;substr、split (一)、數組 slice:可以操作的數據類型有&#xff1a;數組字符串 splice:數組 操作數組…

一個基礎但全面的Vue的表單范例,很基礎,但是很容易,也很全面。

下面這個案例&#xff0c;路人朋友們可以直接粘貼到html文件類型中運行&#xff0c;注意引入Vuejs的路徑即可&#xff0c;不會改的可以參考我第一篇Vue入門&#xff0c;同時建議同志們手打&#xff0c;真的前端都不能熟能生巧&#xff0c;既不要編程了&#xff0c; 可以詳細看注…

計算機網絡-物理層(一)物理層的概念與傳輸媒體

計算機網絡-物理層&#xff08;一&#xff09;物理層的概念與傳輸媒體 物理層相關概念 物理層的作用用來解決在各種傳輸媒體上傳輸比特0和1的問題&#xff0c;進而為數據鏈路層提供透明(看不見)傳輸比特流的服務物理層為數據鏈路層屏蔽了各種傳輸媒體的差異&#xff0c;使數據…

最新Kali Linux安裝教程:從零開始打造網絡安全之旅

Kali Linux&#xff0c;全稱為Kali Linux Distribution&#xff0c;是一個操作系統(2013-03-13誕生)&#xff0c;是一款基于Debian的Linux發行版&#xff0c;基于包含了約600個安全工具&#xff0c;省去了繁瑣的安裝、編譯、配置、更新步驟&#xff0c;為所有工具運行提供了一個…

[低端局][cx32L003] 移植U8G2

文章目錄 一、簡介&#xff08;1&#xff09;U8g2&#xff08;2&#xff09;U8x8 二、配置要求三、移植步驟&#xff08;1&#xff09;文件準備和添加&#xff08;2&#xff09;實現回調接口(I2C的讀寫函數)①軟件I2C②硬件I2C &#xff08;3&#xff09;功能裁剪① u8g2_d_set…

Gof23設計模式之模板方法模式

1.定義 定義一個操作中的算法骨架&#xff0c;而將算法的一些步驟延遲到子類中&#xff0c;使得子類可以不改變該算法結構的情況下重定義該算法的某些特定步驟。 2.結構 模板方法&#xff08;Template Method&#xff09;模式包含以下主要角色&#xff1a; 抽象類&#xff0…

Kerberos 重新認識 From Oracle安全

參考 https://docs.oracle.com/cd/E24847_01/html/819-7061/seamtm-1.html#scrolltoc Kerberos服務 Kerberos服務是一種網絡身份認證協議&#xff0c;由麻省理工學院&#xff08;MIT&#xff09;開發。它提供了強大的身份驗證功能&#xff0c;用于在計算機網絡中驗證用戶和服務…

買愛心氣球(nim博弈)

鏈接&#xff1a;登錄—專業IT筆試面試備考平臺_牛客網 來源&#xff1a;牛客網 Alice 和 Bob 是一對競技編程選手&#xff0c;他們路過了一家氣球店&#xff0c;發現有 m 個大愛心氣球和 n個小愛心氣球。他們決定玩一個游戲&#xff0c;游戲規則如下&#xff1a; Alice先手拿…

Python Selenium 設置帶賬號密碼的socks5代理,啟動瀏覽器

selenium添加帶有賬密的socks5代理 我們都知道在使用selenium開發爬蟲的時候不可避免的會使用socks5高匿名代理。一般情況下我們使用方法如下(開發語言為python)&#xff1a; from selenium import webdriver chrome_options webdriver.ChromeOptions() chrome_options.add_…

Java并發之ReentrantLock

AQS AQS&#xff08;AbstractQueuedSynchronizer&#xff09;&#xff1a;抽象隊列同步器&#xff0c;是一種用來構建鎖和同步器的框架。在是JUC下一個重要的并發類&#xff0c;例如&#xff1a;ReentrantLock、Semaphore、CountDownLatch、LimitLatch等并發都是由AQS衍生出來…

React Native Expo項目,復制文本到剪切板

裝包&#xff1a; npx expo install expo-clipboard import * as Clipboard from expo-clipboardconst handleCopy async (text) > {await Clipboard.setStringAsync(text)Toast.show(復制成功, {duration: 3000,position: Toast.positions.CENTER,})} 參考鏈接&#xff1a…

3.文件目錄

第四章 文件管理 3.文件目錄 ? ??對于D盤這個根目錄來說它對應的目錄文件就是圖中的樣子&#xff0c;其實就是用一個所謂的目錄表來表示這個目錄下面存放了哪些東西。在D盤中的每一個文件&#xff0c;每一個文件夾都會對應這個目錄表中的一個表項&#xff0c;所以其實這些一…

如何寫簡歷?

寫程序員簡歷時&#xff0c;可以從以下幾個方面入手&#xff1a; 1. 個人信息&#xff1a;在簡歷的開頭&#xff0c;包含個人基本信息如姓名、聯系方式、地址等。 2. 求職目標/職業目標&#xff1a;明確自己希望得到的職位或行業&#xff0c;并簡要描述為什么適合該職位。 3…

Autoware感知02—歐氏聚類(lidar_euclidean_cluster_detect)源碼解析

文章目錄 引言一、點云回調函數&#xff1a;二、預處理&#xff08;1&#xff09;裁剪距離雷達過于近的點云&#xff0c;消除車身的影響&#xff08;2&#xff09;點云降采樣&#xff08;體素濾波&#xff0c;默認也是不需要的&#xff09;&#xff08;3&#xff09;裁剪雷達高…

【概念篇】文件概述

?作者簡介&#xff1a;大家好&#xff0c;我是小楊 &#x1f4c3;個人主頁&#xff1a;「小楊」的csdn博客 &#x1f433;希望大家多多支持&#x1f970;一起進步呀&#xff01; 文件概述 1&#xff0c;文件的概念 狹義上的文件是計算機系統中用于存儲和組織數據的一種數據存…

React源碼解析18(5)------ 實現函數組件【修改beginWork和completeWork】

摘要 經過之前的幾篇文章&#xff0c;我們實現了基本的jsx&#xff0c;在頁面渲染的過程。但是如果是通過函數組件寫出來的組件&#xff0c;還是不能渲染到頁面上的。 所以這一篇&#xff0c;主要是對之前寫得方法進行修改&#xff0c;從而能夠顯示函數組件&#xff0c;所以現…