通过Jedis整合
导入maven依赖
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
使用Jedis
public static void main(String[] args) {
//通过jedis创建连接
Jedis jedis = new Jedis("127.0.0.1", 6379);
//创建json
JSONObject jsonObject = new JSONObject();
jsonObject.put("hello", "world");
jsonObject.put("name", "purpleStars");
String result = jsonObject.toJSONString();
//清空数据库
jedis.flushDB();
//开启事务
Transaction multi = jedis.multi();
//通过watch关键词监控实现乐观锁
multi.watch(result);
try {
multi.set("user", result);
multi.exec(); //执行事务
} catch (Exception e) {
multi.discard(); //放弃事务
e.printStackTrace();
} finally {
System.out.println(jedis.get("user"));
jedis.close(); //关闭连接
}
}
Jedis其实就是封装的一个redis操作类,可以进行redis中的操作。
通过SpringData整合
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
首先我们来了解一下SpringBoot实现redis的模板RedisTemplate,首先进入redis配置类RedisAutoConfiguration。
由上图可知,在SpringData中默认有两种Redis的实现,分别为Lettuce和Jedis。
而Spring2.0以后默认的实现为Lettuce,那么Lettuce和Jedis的区别是什么呢?
- Lettuce
Lettuce的连接是基于Netty的,连接实例(StatefulRedisConnection)可以在多个线程间并发访问,因为StatefulRedisConnection是线程安全的,所以一个连接实例(StatefulRedisConnection)就可以满足多线程环境下的并发访问,当然这个也是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。
lettuce主要利用netty实现与redis的同步和异步通信。- Jedis
Jedis在实现上是直接连接的redis server,如果在多线程环境下是非线程安全的,这个时候只有使用连接池,为每个Jedis实例增加物理连接。
那么除此之外还可以发现SpringData为我们提供了两个默认的redisTemplate
可知默认的RedisTemplate是Object类型的,而且@ConditionalOnMissingBean注解表明如果自定义自己的redisTemplate则默认的会失效。
那么我们则可以自定义RedisTemplate。
@Configuration //表明自己是config配置类
public class RedisConfig {
//自定义自己的RedisTemplate
@Bean //将自己注入SpringIOC容器
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
//自定义RedisTemplate<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采用String序列化方式
template.setHashKeySerializer(stringRedisSerializer);
//value采用jackson序列化方式
template.setValueSerializer(jackson2JsonRedisSerializer);
//hash的value序列化采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
上述RedisTemplate则可以自定义自己的序列化类型。使用@Configuration标注自己是配置类,并使用@Bean将redisTemplate注入到容器SpringIOC容器中其他类则可以从容器中取出自定义redisTemplate进行redis相关操作。
- redisTemplate基本操作
opsForValue 操作字符串 类似String
opsForList 操作List
opsForSet 操作Set
opsForHash 操作Hash
opsForZSet 操作ZSet
opsForGeo 操作Geo(地图)类型
opsForHyperLogLog 操作opsForHyperLogLog类型- 常用的可以直接用redisTemplate来操作
获取redis连接对象
RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
connection.flushDb();
connection.flushAll();
测试自定义序列化的RedisTemplate
@Test
public void test() throws JsonProcessingException {
User user = new User("紫色星辰",3);
// json序列化
// String jsonUser = new ObjectMapper().writeValueAsString(user);
redisTemplate.opsForValue().set("user",user);
Object userData = redisTemplate.opsForValue().get("user");
System.out.println(userData);
}
控制台输出
User(name=紫色星辰, age=3)
查询redis数据库的key的值,已经被序列化为String
因此,同Jedis一样,只需要实例化一个RedisTemplate模板就可以对redis进行操作了。