本文主要介绍SpringBoot集成Redis的使用,用于我们实际场景的中的各种开发
Jedis
Jedis,是Redis官方推荐的Java连接开发工具,使用Java操作Redis的中间件。所以我们需要对Jedis十分熟悉才能很好的用Java操作Redis
1、导入相关依赖
<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>
2、连接数据库,并且ping尝试
public static void main(String[] args) {
//1、 new Jedis 对象
Jedis jedis = new Jedis("8.142.14.138",6379);
//输入连接密码
jedis.auth("123456");
// jedis所有的命令就是API中的命令
System.out.println(jedis.ping());
}
3、常用的API调试
public static void main(String[] args) {
//1、 new Jedis 对象
Jedis jedis = new Jedis("8.142.14.138",6379);
//输入连接密码
jedis.auth("123456");
// jedis所有的命令就是API中的命令
System.out.println("清空数据:"+jedis.flushDB());
System.out.println("判断某个键是否存在:"+jedis.exists("username"));
System.out.println("新增'<'username','bobo'>的键值对:"+jedis.set("username","bobo"));
System.out.println("新增'<'password','password'>的键值对:"+jedis.set("password","password"));
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("重命名key:"+jedis.rename("username","name"));
System.out.println("去除改后的name:"+jedis.get("name"));
System.out.println("按索引查询:"+jedis.select(0));
System.out.println("返回当前数据库中key的数目:"+jedis.dbSize());
System.out.println("删除当前选择数据库中的所有:"+jedis.flushDB());
System.out.println("返回当前数据库中key的数目:"+jedis.dbSize());
System.out.println("删除所有数据库中的所有key:"+jedis.flushAll());
}
4、调试事务
public static void main(String[] args) {
Jedis jedis = new Jedis("8.142.14.138",6379);
jedis.auth("123456");
jedis.flushDB();
JSONObject jsonObject = new JSONObject();
jsonObject.put("hello","world");
jsonObject.put("name","bobo");
Transaction multi = jedis.multi();
String res = jsonObject.toJSONString();
//开启事务
try{
multi.set("user1",res);
multi.set("user2",res);
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整合Redis
1、导入依赖,在SpringBoot2.x之后,原来使用的jedis被替换为了lettuce
jedis:采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,只能用jedis pool连接池。 BIO
lettuce:采用netty,实例可以在多个线程中进行共享,不存在线程不安全的情况。可以减少线程数量。NIO
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.4.3</version>
</dependency>
源码分析:
@Bean
@ConditionalOnMissingBean(
name = {"redisTemplate"}
)
@ConditionalOnSingleCandidate(RedisConnectionFactory.class) //可以自定义redisTemplate
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
//默认的RedisTemplate 没有过多的设置,redis 对象都是需要序列化的
//两个泛型都是Obeject类型,所以后面需要强转 <String,Object>
RedisTemplate<Object, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean //由于String类型是redis中最常用的类型,所以单独提出来了一个bean
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
2、配置连接
#redis配置
spring:
redis:
host: 8.142.14.138
port: 6379
password: 123456 //一般连接远程服务器需要密码,如果是本地一般不用密码
3、测试连接
@Test
void contextLoads() {
//redisTemplate 操作不同的数据类型用opsForxxx,api和直接linux操作一样
//opsForValue 操作字符串 类似String
//opsForList 操作list 类似list
//... 五大数据类型
//除了基本的操作,常用的方法可以直接通过redisTemplate操作,比如事务、CRUD
/* RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
System.out.println(connection.ping());
connection.flushDb();
connection.flushAll();*/
redisTemplate.opsForValue().set("mykey","bobo");
System.out.println(redisTemplate.opsForValue().get("mykey"));
}
注意:
@Test
public void test() throws JsonProcessingException {
//真是的开发一般都使用json来传递对象
User user = new User("龚剑波", 3);
//用于将user对象序列化,如果对象未被序列化,则会直接报错
//所以在企业中,所有的pojo,都需要进行序列化操作
String jsonUser = new ObjectMapper().writeValueAsString(user);
redisTemplate.opsForValue().set("user",user);
System.out.println(redisTemplate.opsForValue().get("user"));
}
redis的对象都需要进行序列化操作,如果直接进行set操作,会报未被序列化的错误。
所以在企业中,所有的pojo,都需要进行序列化操作
由于默认的是JDK序列化方式,传入到redis中并不是我们实际的String,还有一些其他的特殊请求等等问题是,这里就可以自定义配置redisTemplate
@Configuration
public class RedisConfig {
//由于我们的redis对象都需要序列化操作,这里我们自定义编写RedisTemplate
//默认使用的JDK的序列化方式,我们也可以自定义序列化的方式
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
//为了开发方便,一般使用<String,Object>
RedisTemplate<String, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
//序列化配置
Jackson2JsonRedisSerializer objectJackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//用ObjectMapper来进行转义
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectJackson2JsonRedisSerializer.setObjectMapper(om);
//String 的序列化
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
//key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
//value采用jackson的序列化方式
template.setValueSerializer(objectJackson2JsonRedisSerializer);
//hash的key采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
//hash的value采用jackson的序列化方式
template.setHashValueSerializer(objectJackson2JsonRedisSerializer);
//将所有的properties进行set
template.afterPropertiesSet();
return template;
}
}
所有的redis操作,其实对于Java开发人员来说,十分的简单,更重要的是去理解redis的思想和每一种数据结构的用处和应用场景
如果你觉得这篇文章对您有帮助的话,麻烦帮我点个点个赞关注一下吧,创作不易,有你的支持才是我前进的动力~