引出
1.之前的Redis相关博客的汇总;
2.redis里面存java对象的解决方案;
3.在实际使用中遇到的问题及处理;
如何在redis里面存java对象
1.本文的项目依赖
使用的是最基础的springboot的redis依赖
由于代码中用了布隆过滤器,因此这里引用了hutool工具包
<!-- redis的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- hutool工具包-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.11</version>
</dependency>
2.核心配置类
核心是存对象的Redistemplate配置,
还包括了Redisson的配置,lua脚本的配置。
package com.tianju.fresh.config;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.springframework.context.annotation.Bean;
import org.redisson.config.Config;
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.core.script.RedisScript;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/\*\*
\* Redisson的配置,lua脚本的配置,redis序列化存对象的配置
\*/
@Configuration
public class RedisConfig {
/\*\*
\* Redisson的配置,
\* Redisson框架,分布式环境下redis数据一致性
\* @return
\*/
@Bean
public RedissonClient redissonClient(){
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379")
.setPassword("5672");
return Redisson.create(config);
}
/\*\*
\* lua脚本的配置类,让减库存-1操作原子化
\* @return
\*/
@Bean
public RedisScript<Long> redisScript(){
DefaultRedisScript redisScript = new DefaultRedisScript<>();
redisScript.setResultType(Long.class);
// lua脚本的位置
redisScript.setLocation(
new ClassPathResource("/lua/goods-unstock.lua") // 关联lua脚本
);
return redisScript;
}
/\*\*
\* redis序列化的相关配置,可以存对象
\* @return
\*/
@Bean
public RedisTemplate redisTemplateInit(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置序列化Key的实例化对象
redisTemplate.setKeySerializer(new StringRedisSerializer());
//设置序列化Value的实例化对象
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
/\*\*
\*
\* 设置Hash类型存储时,对象序列化报错解决
\*/
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
}
3.封装RedisUtil工具类
在实际应用redis中形成的自定义的Redis工具类,主要把Redistemplate 和 StringRedistemplate 依赖注入,然后调用这两个的方法;
其中Redistemplate 用来存java对象,而StringRedistemplate 用于普通的操作;
package com.tianju.fresh.util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@Component
public class RedisUtil {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
public void saveObjectToRedis(String key,Object json){
redisTemplate.opsForValue().set(key,json);
}
/\*\*
\* 从redis里面获取json对象,如果没有,返回null
\* @param key
\* @return
\*/
public Object getJsonFromRedis(String key){
return redisTemplate.opsForValue().get(key);
}
/\*\*
\* 删除redis里面的值,键
\* @param key 删除的键
\* @return
\*/
public Boolean deleteKey(String key){
return redisTemplate.delete(key);
}
/\*\*
\* 存到Redis里面的 set 中
\* @param key 存的键
\* @param value 存到set的值
\*/
public void saveSetToRedis(String key,String... value){
for (String s:value){
if (s!=null && !s.equals("")){
stringRedisTemplate.opsForSet().add(key, s);
}
}
}
/\*\*
\* 判断是否在redis的set中
\* @param key
\* @param val
\* @return
\*/
public Boolean isInSet(String key,String val){
return stringRedisTemplate.opsForSet().isMember(key, val);
}
/\*\*
\* 获得set中的值
\* @param key 键
\* @return
\*/
public Set<String> getSet(String key){
return stringRedisTemplate.opsForSet().members(key);
}
/\*\*
\* 从redis里面的set删除数据
\* @param key
\* @param val
\*/
public void removeFromSet(String key,String val){
stringRedisTemplate.opsForSet().remove(key, val);
}
/\*\*
\* 获得存到redis里面的键对应的string类型的值
\* @param key 键
\* @return
\*/
public String getStringValue(String key){
return stringRedisTemplate.opsForValue().get(key);
}