Jedis
什么是Jedis 是 Redis 官方推荐的 java连接开发工具! 使用Java 操作Redis 中间件!如果你要使用
java操作redis,那么一定要对Jedis 十分的熟悉!
我们要使用 Java 来操作 Redis,知其然并知其所以然,授人以渔! 学习不能急躁,慢慢来会很快!
加油!!^_^
测试
1,导入依赖
<!--导入jedis的包-->
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
</dependencies>
2,编码测试
- 连接数据库
- 操作命令
- 断开连接!
import redis.clients.jedis.Jedis;
/**
* @author Z
* @DATE 2020/12/13 - 11:56
*/
public class TestPing {
public static void main(String[] args) {
//1,new Jedis对象即可
Jedis jedis = new Jedis("47.115.2.xxx",6379);
//jedis 所有的命令就是我们之前学习的所有指令!所以之前的指令学习很重要!
System.out.println(jedis.ping());
}
}
常用的API
- String
- List
- Set
- Hash
- Zset
所有的api命令,就是我们对应的上面学习的指令,一个都没有变化!
import redis.clients.jedis.Jedis;
import java.util.Set;
/**
* @author Z
* @DATE 2020/12/13 - 12:15
*/
public class TestKey {
public static void main(String[] args) {
Jedis jedis = new Jedis("47.115.2.xxx",6379);
System.out.println("清空数据:"+jedis.flushDB());
System.out.println("判断某个键是否存在"+jedis.exists("username"));
System.out.println("新增键值对<username,hello>"+jedis.set("username","hello"));
System.out.println("新增键值对<password,pwd>:"+jedis.set("password","pwd"));
System.out.println("系统中所有的键如下:");
Set<String> keys = jedis.keys("*");
System.out.println(keys);
System.out.println("删除键password"+jedis.del("password"));
System.out.println("判断键password是否存在:"+jedis.exists("password"));
System.out.println("查看键username所存储的值得类型:"+jedis.type("username"));
System.out.println("随机返回key空间中的一个:"+jedis.randomKey());
System.out.println("重命名:"+jedis.rename("username","name"));
System.out.println("取出改后的name:"+jedis.get("name"));
System.out.println("按索引查询:"+jedis.select(0));
System.out.println("删除当前选择数据库中的所有key:"+jedis.flushDB());
System.out.println("返回当前数据库中key的数目:"+jedis.dbSize());
System.out.println("删除所有数据库中的key:"+jedis.flushAll());
}
}
事务
import com.alibaba.fastjson.JSONObject;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
/**
* @author ZhaoZhiyue
* @DATE 2020/12/13 - 12:30
*/
public class TestTX {
public static void main(String[] args) {
Jedis jedis = new Jedis("47.115.2.92",6379);
jedis.flushDB();
JSONObject jsonpObject = new JSONObject();
jsonpObject.put("hello","world");
jsonpObject.put("name","zhangsan");
//开启事务
Transaction multi =jedis.multi();
String result = jsonpObject.toJSONString();
multi.watch("user2");
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();//关闭连接
}
}
}
SpringBoot整合
SpringBoot 操作数据:所有的接口都封装在spring-data中:包括jpa jdbc mongodb redis!
SpringData 也是和 SpringBoot 齐名的项目!
说明: 在 SpringBoot2.x 之后,原来使用的jedis 被替换为了 lettuce
jedis : 采用的直连,多个线程操作的话,是不安全的。如果想要避免不安全的,使用 jedis pool 连接
池! 更像 BIO 模式(阻塞 )。
lettuce : 采用netty,实例可以再多个线程中进行共享,不存在线程不安全的情况!可以减少线程数据
了,更像 NIO 模式
源码分析:
@Bean
@ConditionalOnMissingBean(name = "redisTemplate") // 我们可以自己定义一个redisTemplate来替换这个默认的!
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
// 默认的 RedisTemplate 没有过多的设置,redis 对象都是需要序列化!
// 两个泛型都是 Object, Object 的类型,我们后使用需要强制转换 <String, Object>
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean // String 是redis中最常使用的类型,所以单独提出来了一个bean!
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
整合测试
- 导入依赖
<!-- 操作redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 配置链接
#SpringBoot所有的配置类都有一个自动配置类 RedisAutoConfiguration
#自动配置类都会绑定一个properties配置文件 RedisProperties
#配置Redis
spring.redis.host=47.115.2.92
spring.redis.port=6379
#连接池等配置lettuce才生效
- 测试
package com.zzy;
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.connection.RedisConnection;
import org.springframework.data.redis.core.RedisTemplate;
@SpringBootTest
class Redis02SpringbootApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
void contextLoads() {
//在企业开发中,80%的情况下,都不会使用这种原生的方式去编写代码
//RedisUtils,去百度看!
// redisTemplate 操作不同的数据类型,api和我们的指令是一样的:
// opsForValue 操作字符串 类似String
// opsForList 操作List 类似Lis
// opsForSet
// opsForHash
// opsForZSet
// opsForGeo
// opsForHyperLogLog
// 除了基本的操作,常用的方法都可以直接通过redisTemplate操作,比如事务,和基本的CRUD
// 获取redis的连接对象,很少用
// RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
// connection.flushDb();
// connection.flushAll();
redisTemplate.opsForValue().set("mykey","关注狂神说公众号");//在redis客户端查到的是乱码,后续解决
System.out.println(redisTemplate.opsForValue().get("mykey"));
}
}
所有的对象都需要序列化
序列化后正常运行
在企业中,所有的poojo都会序列化
自己写了一个RedisTemplete
package com.zzy.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 {
//这是kuangshen给大家写好的一个固定模板,大家在企业中,拿去就可以直接使用!
// 自己定义了一个 RedisTemplate
@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;
}
}
选择自己写的redisTemplate
执行测试,不再乱码
所有的redis操作,其实对于java开发人员来说,十分的简单,直接使用RedisUtils调用!
更重要是要去理解redis的思想和每一种数据结构的用处和作用场景!
本博客为该视频的笔记
狂神说Java】Redis最新超详细版教程通俗易懂