使用Java操作Redis
📢📢📢📣📣📣
哈嘍!大家好,我是【一心同學】,一位上進心十足的【Java領域博主】!😜😜😜
?【一心同學】的寫作風格:喜歡用【通俗易懂】的文筆去講解每一個知識點,而不喜歡用【高大上】的官方陳述。
?【一心同學】博客的領域是【面向后端技術】的學習,未來會持續更新更多的【后端技術】以及【學習心得】。
?如果有對【后端技術】感興趣的【小可愛】,歡迎關注【一心同學】💞💞💞
??????感謝各位大可愛小可愛!???????
目錄
前言
一、準備步驟
二、Jedis連接Redis
三、基本操作
3.1 操作String數據類型
3.2 操作List數據類型
3.3 事務操作
四、SpringBoot集成Redis
4.1 介紹
4.2 集成Redis
4.3? 保存對象
小結
前言
我們之前對Redis的學習都是在命令行窗口,那么如何使用Java來對Redis進行操作呢?官方對于Java連接Redis的開發工具推薦了Jedis,通過Jedis同樣可以實現對Redis的各種操作。本篇文章會介紹基于Linux上的Redis的Java連接操作。
一、準備步驟
修改配置文件redis.conf:
(1)注釋以下屬性,因為我們是需要進行遠程連接的:
#bind:127.0.0.1(2)將protected-mode 設置為no
protected-mode no(3)設置為允許后臺連接
daemonize yes注意:
在遠程服務器進行連接需要確保將以下三個步驟都完成:
(1)設置服務器的安全組開放6379端口
(2)防火墻開放端口:
firewall-cmd --zone=public --add-port=6379/tcp --permanet(3)重啟防火墻:
systemctl restart firewalld.service二、Jedis連接Redis
(1)創建一個Maven項目,并導入以下依賴:
<dependencies><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.2.0</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version></dependency></dependencies>(2)測試連接:
package com.yixin;import redis.clients.jedis.Jedis;public class RedisTest {public static void main(String[] args) {//連接本地的 Redis 服務Jedis jedis = new Jedis("服務器地址", 6379);String response = jedis.ping();System.out.println(response); // PONG }}輸出結果:
看到PONG說明我們成功連接上了我們服務器上的Redis了!
三、基本操作
3.1 操作String數據類型
package com.yixin;import redis.clients.jedis.Jedis;import java.util.Set;public class Redis_String {public static void main(String[] args) {//連接本地的 Redis 服務Jedis jedis = new Jedis("服務器地址", 6379);String response = jedis.ping();System.out.println(response); // PONG//刪除當前選擇數據庫中的所有keySystem.out.println("刪除當前選擇數據庫中的所有key:"+jedis.flushDB());//Spring實例//設置 redis 字符串數據//新增<'name','yixin'>的鍵值對jedis.set("name", "yixin");// 獲取存儲的數據并輸出System.out.println("redis 存儲的字符串為: "+ jedis.get("name"));//判斷某個鍵是否存在System.out.println("判斷某個鍵是否存在:"+jedis.exists("name"));//系統中所有的鍵Set<String> keys = jedis.keys("*");System.out.println(keys);//按索引查詢System.out.println("按索引查詢:"+jedis.select(0));//查看鍵name所存儲的值的類型System.out.println("查看鍵name所存儲的值的類型:"+jedis.type("name"));// 隨機返回key空間的一個System.out.println("隨機返回key空間的一個:"+jedis.randomKey());//重命名keySystem.out.println("重命名key:"+jedis.rename("name","username"));System.out.println("取出改后的name:"+jedis.get("username"));//刪除鍵usernameSystem.out.println("刪除鍵username:"+jedis.del("username"));//刪除當前選擇數據庫中的所有keySystem.out.println("刪除當前選擇數據庫中的所有key:"+jedis.flushDB());//查看當前數據庫中key的數目System.out.println("返回當前數據庫中key的數目:"+jedis.dbSize());//刪除數據庫中的所有keySystem.out.println("刪除所有數據庫中的所有key:"+jedis.flushAll());} }輸出:
3.2 操作List數據類型
package com.yixin;import redis.clients.jedis.Jedis;import java.util.List;public class Redis_List {public static void main(String[] args) {//連接本地的 Redis 服務Jedis jedis = new Jedis("服務器地址", 6379);String response = jedis.ping();System.out.println(response); // PONGSystem.out.println("刪除當前選擇數據庫中的所有key:"+jedis.flushDB());//List實例//存儲數據到列表中jedis.lpush("list", "num1");jedis.lpush("list", "num2");jedis.lpush("list", "num3");// 獲取存儲的數據并輸出List<String> list = jedis.lrange("list", 0 ,-1);for(int i=0; i<list.size(); i++) {System.out.println("列表項為: "+list.get(i));}} }輸出結果:
3.3 事務操作
package com.yixin;import com.alibaba.fastjson.JSONObject; import redis.clients.jedis.Jedis; import redis.clients.jedis.Transaction;public class Redis_Transaction {public static void main(String[] args) {//連接本地的 Redis 服務Jedis jedis = new Jedis("服務器地址", 6379);String response = jedis.ping();System.out.println(response); // PONG//事務測試jedis.flushDB();JSONObject jsonObject = new JSONObject();jsonObject.put("hello","world");jsonObject.put("name","yixin");//開啟事務Transaction multi = jedis.multi();String result = jsonObject.toJSONString();// jedis.watch(result)try {multi.set("user1", result);multi.set("user2", result);int i = 1 / 0; // 代碼拋出異常事務,執行失敗!multi.exec(); // 執行事務!}catch (Exception e){multi.discard();// 放棄事務e.printStackTrace();}finally {System.out.println(jedis.get("user1"));System.out.println(jedis.get("user2"));jedis.close();}} }輸出結果:
對于其他命令也基本類似,就不一一演示出來了,之前學過的Redis命令,在Java中同樣可以進行使用。?
四、SpringBoot集成Redis
4.1 介紹
這次我們并不使用jedis來進行連接,而是使用lettuce來進行連接,jedis和lettuce的對比如下:
jedis:采用的直連,多個線程操作的話,是不安全的;想要避免不安全,使用jedis pool連接池。更像BIO模式
lettuce:采用netty,實例可以在多個線程中共享,不存在線程不安全的情況;可以減少線程數量。更像NIO模式
4.2 集成Redis
(1)創建Spring Boot項目
(2)導入依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>(3)編寫配置文件
application.properties:
#配置redis # Redis服務器地址 spring.redis.host=服務器地址 # Redis服務器連接端口 spring.redis.port=6379 # Redis數據庫索引(默認為0) spring.redis.database=0 # Redis服務器連接密碼(默認為空) spring.redis.password= # 連接池最大連接數(使用負值表示沒有限制) 默認 8 spring.redis.lettuce.pool.max-active=8 # 連接池最大阻塞等待時間(使用負值表示沒有限制) 默認 -1 spring.redis.lettuce.pool.max-wait=-1 # 連接池中的最大空閑連接 默認 8 spring.redis.lettuce.pool.max-idle=8 # 連接池中的最小空閑連接 默認 0 spring.redis.lettuce.pool.min-idle=0(4)編寫測試類
package com.yixin;import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.RedisTemplate;@SpringBootTest class SpringbootRedisApplicationTests {@Autowiredprivate RedisTemplate<String,String> redisTemplate;@Testvoid contextLoads() {redisTemplate.opsForValue().set("name","yixin");System.out.println(redisTemplate.opsForValue().get("name"));}}輸出:
這樣就已經成功連接了!
在這種連接方式中,redisTemplate操作著不同的數據類型,api和我們的指令是一樣的。
opsForValue:操作字符串 類似String
opsForList:操作List 類似List
opsForSet:操作Set,類似Set
opsForHash:操作Hash
opsForZSet:操作ZSet
opsForGeo:操作Geospatial
opsForHyperLogLog:操作HyperLogLog
除了基本的操作,我們常用的方法都可以直接通過redisTemplate操作,比如事務,和基本的CRUD。
4.3? 保存對象
(1)編寫實體類
注意:要實現序列號Serializable。
package com.yixin.pojo;import java.io.Serializable;public class User implements Serializable {private String name;private int age;public User(){}public User(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';} }(2)編寫RedsTemplate配置
Tip:在開發當中,我們可以直接把這個模板拿去使用。
package com.yixin.config;import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; 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.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration public class RedisConfig {@Bean@SuppressWarnings("all")public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {//為了自己開發方便,一般直接使用 <String, Object>RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();template.setConnectionFactory(factory);// Json序列化配置Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);// String 的序列化StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();// key采用String的序列化方式template.setKeySerializer(stringRedisSerializer);// hash的key也采用String的序列化方式template.setHashKeySerializer(stringRedisSerializer);// value序列化方式采用jacksontemplate.setValueSerializer(jackson2JsonRedisSerializer);// hash的value序列化方式采用jacksontemplate.setHashValueSerializer(jackson2JsonRedisSerializer);template.afterPropertiesSet();return template;}}(3)存儲對象
package com.yixin;import com.yixin.pojo.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.RedisTemplate;@SpringBootTest class SpringbootRedisApplicationTests {@Autowiredprivate RedisTemplate<String,Object> redisTemplate;@Testvoid contextLoads() {User user=new User("yixin",18);redisTemplate.opsForValue().set("user",user);System.out.println(redisTemplate.opsForValue().get("user"));}}輸出結果:?
小結
以上就是【一心同學】講解的使用【Java】對【Redis】操作的兩種方式,如果擔心【線程安全】的話,可以使用【lettuce】進行連接。
如果這篇【文章】有幫助到你,希望可以給【一心同學】點個贊👍,創作不易,相比官方的陳述,我更喜歡用【通俗易懂】的文筆去講解每一個知識點,如果有對【后端技術】感興趣的小可愛,也歡迎關注???????【一心同學】??????,我將會給你帶來巨大的【收獲與驚喜】💕💕!
總結
以上是生活随笔為你收集整理的使用Java操作Redis的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是区块链预言机(BlockChain
- 下一篇: Java行为参数化(一)