📢📢📢📣📣📣
哈喽!大家好,我是【一心同学】,一位上进心十足的【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
//删除当前选择数据库中的所有key
System.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());
//重命名key
System.out.println("重命名key:"+jedis.rename("name","username"));
System.out.println("取出改后的name:"+jedis.get("username"));
//删除键username
System.out.println("删除键username:"+jedis.del("username"));
//删除当前选择数据库中的所有key
System.out.println("删除当前选择数据库中的所有key:"+jedis.flushDB());
//查看当前数据库中key的数目
System.out.println("返回当前数据库中key的数目:"+jedis.dbSize());
//删除数据库中的所有key
System.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); // PONG
System.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 {
@Autowired
private RedisTemplate<String,String> redisTemplate;
@Test
void 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;
}
@Override
public 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序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.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 {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
@Test
void contextLoads() {
User user=new User("yixin",18);
redisTemplate.opsForValue().set("user",user);
System.out.println(redisTemplate.opsForValue().get("user"));
}
}
输出结果:
小结
以上就是【一心同学】讲解的使用【Java】对【Redis】操作的两种方式,如果担心【线程安全】的话,可以使用【lettuce】进行连接。
如果这篇【文章】有帮助到你,希望可以给【一心同学】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【后端技术】感兴趣的小可爱,也欢迎关注❤️❤️❤️ 【一心同学】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!