SpringBoot 整合 Redis
Java操作Redis(单机)
Jedis方式
pom依赖
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency>
jedis使用
import redis.clients.jedis.Jedis; public class JedisApplicationMain { public static void main(String[] args) { Jedis jedis = new Jedis("127.0.0.1", 6379); // jedis.auth("root"); // 默认用户没有密码 jedis.set("Java", "1"); String s = jedis.get("Java"); System.out.println(s); } }
Lettuce方式
pom依赖
<dependency> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> </dependency>
lettuce使用
public class LettuceMain { public static void main(String[] args) { RedisURI uri = RedisURI.builder() .withHost("hadoop001") .withPort(6379) .build(); RedisClient redisClient = RedisClient.create(uri); StatefulRedisConnection<String, String> connect = redisClient.connect(); RedisCommands<String, String> commands = connect.sync(); // 操作逻辑 commands.set("root", "18"); String s = commands.get("root"); System.out.println(s); // 释放资源 connect.close(); redisClient.shutdown(); } }
###RedisTemplate方式(单机模式)
序列化问题
通过程序期望添加的key和Redis数据库实际保存的key不一致
@SpringBootTest
class RedisApplicationTests {
public static final String ORDER_KEY = "ord:";
public static final String JD_ORDER = "京东订单";
public static final int KEY_ID = 1;
@Autowired
private RedisTemplate redisTemplate;
@Test
public void addOrder() {
String serialNo = UUID.randomUUID().toString();
String key = ORDER_KEY + KEY_ID;
String value = JD_ORDER + serialNo;
// 期望保存的key是"ord:1"
redisTemplate.opsForValue().set(key, value);
}
@Test
public void getOrderById() {
// 在程序中通过"ord:1"也可以将结果查找出来
String s = (String) redisTemplate.opsForValue().get(ORDER_KEY + KEY_ID);
System.out.println(s);
}
}
Redis中实际保存的key
解决方案
方式一:使用StrngRedisTemplate来替换RedisTemplate
方式二:自定义RedisTemplate对象的创建过程
@Configuration
public class RedisTemplateConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
// 原来的RedisTemplate对象的创建过程:空参构造器 -> 属性赋值(无) -> 初始化
// 现在手动实现一个RedisTemplate对象的创建过程,用来替换原来的过程
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(lettuceConnectionFactory);
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
// 在完成自定义属性配置之后, 需要调用原来的初始化方法
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
Java操作Redis(集群)
JedisCluster方式
public class RedisClusterMain {
public static void main(String[] args) {
//host选择集群中的任意一台redis服务器的ip地址即可, 因为任意一台服务器都可以作为集群的入口
String host = "hadoop001";
int port = 6379;
HostAndPort hostAndPort = new HostAndPort(host, port);
JedisCluster jedisCluster = new JedisCluster(hostAndPort);
//设置值
jedisCluster.set("name", "root");
//获取值
System.out.println(jedisCluster.get("name"));
}
}
RedisTemplate方式
Spring客户端没有动态感知到Redis集群的最新集群信息