Java與SpringBoot對(duì)redis的使用方式
1.Java連接redis
redis支持哪些語(yǔ)言可以操作 (去redis官網(wǎng)查詢)


1.1 使用Jedis
(1)添加jedis依賴
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!--只能在測(cè)試類中使用-->
<scope>test</scope>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.6.0</version>
</dependency>(2)代碼測(cè)試
public class TestJedis {
@Test
public void test01(){
//連接redis--必須保證你的redis服務(wù)運(yùn)行遠(yuǎn)程連接
//該對(duì)象把每個(gè)redis命令封裝成對(duì)應(yīng)的方法
//注意端口號(hào)
//xshell中的redis要運(yùn)行起來(lái),注意防火墻釋放端口號(hào),注意配置文件的修改
Jedis jedis=new Jedis("192.168.1.16",6379);
//對(duì)于字符串操作的命令
String set = jedis.set("k1", "v1");
System.out.println(set);
String set1 = jedis.set("k2", "v2");
System.out.println(set1);
String set2 = jedis.set("k3", "v3");
System.out.println(set2);
//對(duì)于hash的操作
jedis.hset("k4","name","小花");
Long hset = jedis.hset("k4", "age", "18");
System.out.println(hset);
Map<String ,String> map=new HashMap<>();
map.put("name","小明");
map.put("age","20");
Long k = jedis.hset("k5", map);
System.out.println(k);
jedis.close();
}
}1.2 使用連接池連接redis
@Test
public void test02(){
//創(chuàng)建連接池的配置類
JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(20);
jedisPoolConfig.setMinIdle(5);
jedisPoolConfig.setMaxWait(Duration.ofMillis(3000));
JedisPool jedisPool=new JedisPool(jedisPoolConfig,"192.168.1.16",6379);
long start = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
//從jedis連接池獲取資源
Jedis jedis=jedisPool.getResource();
String ping = jedis.ping();
jedis.close();//是否關(guān)閉池子
}
long end=System.currentTimeMillis();
//是為了比較使用池子還是不使用快,結(jié)論是使用池子快
System.out.println("總耗時(shí):"+(end-start));
}1.3 java連接redis集群模式
連接集群時(shí)要保證集群里面沒(méi)有存值, 要是存值需要?jiǎng)h除之前生成的文件(注意刪除干凈)

還有就是放行對(duì)應(yīng)的端口:6001、6002、6003、6004、6005、6006,因?yàn)橹胺判械膶?shí)在10000端口,注意以上兩點(diǎn),才可以使用idea創(chuàng)建成功。
@Test
public void test03(){
Set<HostAndPort> nodes=new HashSet<>();
nodes.add(new HostAndPort("192.168.227.175",6001));
nodes.add(new HostAndPort("192.168.227.175",6002));
nodes.add(new HostAndPort("192.168.227.175",6003));
nodes.add(new HostAndPort("192.168.227.175",6004));
nodes.add(new HostAndPort("192.168.227.175",6005));
nodes.add(new HostAndPort("192.168.227.175",6006));
JedisCluster jedisCluster=new JedisCluster(nodes);
jedisCluster.set("k6", "小老虎和小兔子");
jedisCluster.close();
}
2.SpringBoot整合redis
springboot對(duì)redis的操作封裝了兩個(gè)StringRedisTemplate和RedisTemplate類,StringRedisTemplate是RedisTemplate的子類,StringRedisTemplate它只能存儲(chǔ)字符串類型,無(wú)法存儲(chǔ)對(duì)象類型。要想用StringRedisTemplate存儲(chǔ)對(duì)象必須把對(duì)象轉(zhuǎn)為json字符串。

springboot整合redis時(shí)提供了兩個(gè)模板工具類,StringRedisTemplate和RedisTemplate。
2.1 StringRedisTemplate
(1) 引入相關(guān)的依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>(2)注入StringRedisTemplate該類對(duì)象
@Autowired private StringRedisTemplate redisTemplate;
(3)使用StringRedisTemplate
該類把對(duì)每種數(shù)據(jù)類型的操作,單獨(dú)封了相應(yīng)的內(nèi)部類。

此處不會(huì)有亂碼,因?yàn)橐呀?jīng)給它序列化方式和反序列化方式換成為String型。
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
public void test01(){
//對(duì)hash類型的操作
HashOperations<String, Object, Object> forHash = stringRedisTemplate.opsForHash();
forHash.put("k1","name","張三");
forHash.put("k1","age","15");
Map<String,String> map=new HashMap<>();
map.put("name","李四");
map.put("age","25");
forHash.putAll("k36",map);
Object o = forHash.get("k1", "name");
System.out.println(o);
Set<Object> k1 = forHash.keys("k1");
System.out.println(k1);
List<Object> k11 = forHash.values("k1");
System.out.println(k11);
//獲取k1對(duì)于的所有的field和value
Map<Object, Object> k12 = forHash.entries("k1");
System.out.println(k12);
}
@Test
void contextLoads() {
//刪除指定的key
// stringRedisTemplate.delete("k");
//查看所有的key
//stringRedisTemplate.keys("k");
//是否存在指定的key
//stringRedisTemplate.hasKey("k");
//對(duì)字符串?dāng)?shù)據(jù)類型的操作ValueOperations
ValueOperations<String, String> forValue = stringRedisTemplate.opsForValue();
//存儲(chǔ)字符串類型--key value long uint setex()
forValue.set("k1","張三",30, TimeUnit.SECONDS);
//等價(jià)于setnx 存入成功返回true ,失敗返回false
Boolean absent = forValue.setIfAbsent("k11", "李四", 30, TimeUnit.SECONDS);
System.out.println(absent);
//append拼接
Integer append = forValue.append("k11", "真好看");
String k11 = forValue.get("k11");
System.out.println(k11);
}2.2 RedisTemplate
此處會(huì)有亂碼,因?yàn)樗蛄谢绞胶头葱蛄谢绞侥J(rèn)為JDK。
@SpringBootTest
class SbredisApplicationTests02 {
//當(dāng)你存儲(chǔ)的value類型為對(duì)象類型使用redisTemplate
//存儲(chǔ)的value類型為字符串。StringRedisTemplate 驗(yàn)證碼
@Autowired
private RedisTemplate redisTemplate;
@Test
public void test01(){
//必須認(rèn)為指定序列化方式
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
//對(duì)String類型操作類
ValueOperations forValue = redisTemplate.opsForValue();
//redis中key和value都變成了亂碼
//key和value都沒(méi)有指定序列化方式,默認(rèn)采用jdk的序列化方式
forValue.set("k1","張三");
//value默認(rèn)采用jdk,類必須實(shí)現(xiàn)序列化接口
forValue.set("k44",new User(1,"haha",12));
}
}上面的RedisTemplate需要每次都指定key value以及field的序列化方式,能不能搞一個(gè)配置類,已經(jīng)為RedisTemplate指定好序列化。以后再用就無(wú)需指定。
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
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);
template.setConnectionFactory(factory);
//key序列化方式
template.setKeySerializer(redisSerializer);
//value序列化
template.setValueSerializer(jackson2JsonRedisSerializer);
//value hashmap序列化 filed value
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.setHashKeySerializer(redisSerializer);
return template;
}
}到此這篇關(guān)于Java與SpringBoot對(duì)redis的使用方式的文章就介紹到這了,更多相關(guān)Java redis 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot修改內(nèi)置tomcat版本的操作步驟
生產(chǎn)環(huán)境使用的外部部署Tomcat還是內(nèi)置Tomcat由于版本安全漏洞,往往需要升級(jí)到指定的安全版本,本文演示一下SpringBoot升級(jí)內(nèi)置的Tomcat版本,感興趣的小伙伴跟著小編一起來(lái)看看吧2024-07-07
Spring的BeanUtils.copyProperties屬性復(fù)制避坑指南
這篇文章主要介紹了Spring的BeanUtils.copyProperties屬性復(fù)制避坑指南,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
Java動(dòng)態(tài)規(guī)劃篇之線性DP的示例詳解
這篇文章主要通過(guò)幾個(gè)例題為大家詳細(xì)介紹一些Java動(dòng)態(tài)規(guī)劃中的線性DP,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定的幫助,需要的可以參考一下2022-11-11
Java網(wǎng)絡(luò)編程之基于TCP協(xié)議
本文主要將Java基于TCP的網(wǎng)絡(luò)編程主要分解成5個(gè)功能:功能分解1:單向通信功能分解,2:雙向通信功能分解,3:對(duì)象流傳送功能分解,4:加入完整的處理異常方式功能分解,5:多線程接收用戶請(qǐng)求,需要的朋友可以參考下2021-05-05
Java中BigDecimal,DateFormatter?和迭代器的"陷阱"
這篇文章主要介紹了Java中BigDecimal,DateFormatter?和迭代器的"陷阱",文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,感興趣的小伙伴可以參考一下2022-06-06
一文詳解Java中的動(dòng)態(tài)填充Html模版并轉(zhuǎn)PDF
在后端技術(shù)中,模板引擎和PDF生成工具是兩個(gè)非常重要的領(lǐng)域,Thymeleaf和wkhtmltopdf是這兩個(gè)領(lǐng)域的杰出代表,下面就來(lái)詳細(xì)介紹一下Thymeleaf和wkhtmltopdf的技術(shù)特點(diǎn)吧2023-12-12
關(guān)于springboot2整合lettuce啟動(dòng)卡住問(wèn)題的解決方法
Lettuce和Jedis的都是連接Redis Server的客戶端程序,下面這篇文章主要給大家介紹了關(guān)于springboot2整合lettuce啟動(dòng)卡住問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12

