连接Redis的两种方式
一、使用Java连接Redis
- 创建一个Maven项目
- 导入连接redis的相关依赖
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
- 测试类
@Test
void test01(){
Jedis jedis = new Jedis("192.168.31.35",6379);//连接redis
jedis.set("a2","2");
jedis.mset("k2","v2","k3","v3");
String k1 = jedis.get("k2");
String k2 = jedis.get("a2");
Set<String> keys = jedis.keys("*");
System.out.println(k1);
System.out.println(k2);
System.out.println(keys);
}
- 使用连接池的方式连接redis
public class TestPoolJedis {
public static void main(String[] args) {
// 连接池配置
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(100);//连接池最大连接数为100
config.setMaxIdle(10);//最大空闲数为10个
config.setTestOnBorrow(true);//在从连接池获取连接对象前测试是否可以使用
// 创建连接池对象
JedisPool jedisPool = new JedisPool(config, "192.168.31.59", 6379);
// 得到连接对象
Jedis jedis = jedisPool.getResource();
String k3 = jedis.get("k3");
jedis.expire("k2",10);
System.out.println(k3);
System.out.println(jedis.ttl("k2"));
jedis.close();
}
}
二、使用springboot连接Redis
创建一个springboot项目。在创建项目我自己添加了相关需要的依赖。
- 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 配置application.properties文件
spring.redis.host=192.168.31.35
spring.redis.port=6379
spring.redis.jedis.pool.max-active=20
spring.redis.jedis.pool.max-idle=8
spring.redis.jedis.pool.min-idle=0
spring.redis.jedis.pool.max-wait=2000
- 连接类说明
(1)、StringRedisTemplate继承自RedisTemplate,底层代码:
public class StringRedisTemplate extends RedisTemplate<String, String> {}
(2)、这两个类都是将数据序列化到redis库
(3)、RedisTemplate可以存储任何数据类型的数据,底层代码:
public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperations<K, V>, BeanClassLoaderAware {
使用这个必须重新进行序列化配置。它默认对key和value使用的序列化是jdk的序列化,这种序列化有弊端,序列化后的数据占据内存太大。
(4)、StringRedisTemplate只能存储string类型的数据,它使用的序列化方式是StringRedisSerizlizer。使用它时不用再配置序列化。
(5)、这两个类对向redis操作的方法进行了封装,不像使用java连接时那么直观
- StringRedisTemplate连接redis示例
@SpringBootTest
class DemoApplicationTests {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
void contextLoads() {
//操作key
Set<String> keys = stringRedisTemplate.keys("*");
System.out.println(keys);
stringRedisTemplate.delete("a1");
System.out.println(stringRedisTemplate.expire("qy129",60, TimeUnit.SECONDS));
}
@Test
void Test01(){
ValueOperations<String, String> forValue = stringRedisTemplate.opsForValue();
forValue.set("a2","2");
System.out.println(forValue.get("a2"));
Map<String,String> map=new HashMap<>();
map.put("a3","3");
map.put("a4","4");
map.put("a5","5");
forValue.multiSet(map);
List<String> strings = forValue.multiGet(map.keySet());
System.out.println(strings);
}
}
- Redis Template连接Redis
创建新的springboot项目,连接redis集群
- 配置序列化RedisConfig 类
@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String, Object> template = new RedisTemplate<>();
StringRedisSerializer serializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(mapper);
template.setConnectionFactory(factory);
//key序列化方式
template.setKeySerializer(serializer);
//value序列化
template.setValueSerializer(jackson2JsonRedisSerializer);
//value hashmap序列化
template.setHashValueSerializer(jackson2JsonRedisSerializer);
return template;
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
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);
// 配置序列化(解决乱码的问题),过期时间600秒
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(600)) //缓存过期10分钟 ---- 业务需求。
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))//设置key的序列化方式
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) //设置value的序列化
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
return cacheManager;
}
}
- 修改application.properties配置文件
哨兵模式连接配置
spring.redis.sentinel.master=mymaster
spring.redis.sentinel.nodes=192.168.31.35:26379
去中心化集群连接配置
#列出所有节点 IP为你虚拟机的IP地址
spring.redis.cluster.nodes=192.168.31.35:8001,192.168.31.35:8002,192.168.31.35:8003,192.168.31.35:8004,192.168.31.35:8005,192.168.31.35:8006
- 我测试的是连接去中心化集群来操作
@SpringBootTest
public class TestCluster {
@Autowired
private RedisTemplate redisTemplate;
//去中心化连接redis
@Test
public void test(){
redisTemplate.opsForValue().set("name","奥特曼");
System.out.println(redisTemplate.opsForValue().get("name"));
}
}
使用图形化工具redisplus查看存储数据
连接成功后的界面
测试结果
连接redis的两种方式就操作结束了