一 SpringBoot整合
SpringBoot官方有对Redis的支持。在1.x的时候,SpringBoot底层使用Jedis连接Redis,在2.x之后,改为Lettuce,因为Jedis采用的是直连的方式,有多个线程操作的话,会有线程不安全问题,想要避免,需要使用jedis pool。Lettuce采用netty,实例可以在多个线程中进行共享,不存在线程安全问题,可以减少线程数据,更像NIO的方式
- maven依赖
```xml
org.springframework.boot spring-boot-starter-data-redis
<a name="ZamBK"></a>
## 1.1 初始配置
- properties配置
```markdown
# host
spring.redis.host=127.0.0.1
# 端口
spring.redis.port=6379
# 数据库,默认为0
spring.redis.database=0
# 设置连接超时
spring.redis.timeout=18000000
# 连接池的最大连接数,负数表示没有限制
spring.redis.lettuce.pool.max-active=8
# 最大阻塞等待时间,负数表示没有限制
spring.redis.lettuce.pool.max-wait=-1
# 连接池中最大的空闲连接数
spring.redis.lettuce.pool.max-idle=5
# 连接池中最小的空闲连接处
spring.redis.lettuce.pool.min-idle=0
- 配置类
在Reidis配置类中,设置存储对象时,进行序列化的配置。使用Jackson工具类进行序列化配置
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
// 序列化方式
StringRedisSerializer redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setKeySerializer(redisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
return redisTemplate;
}
}
1.1 官方RedisTemplate
SpringBoot早已帮我们注册了Redis的操作对象:RestTemplate,直接从IOC取出使用即可
@Service
public class TestService {
@Autowired
private RedisTemplate<String, String> redisTemplate;
public void test1() {
ValueOperations<String, String> ops = redisTemplate.opsForValue();
ops.set("name", "lz");
}
public void test2() {
System.out.println(redisTemplate.opsForValue().get("name"));
}
}
可以通过 RestTemplate获取操作不同数据类型的对象,其方法大概和Redis命令差不多
- opsForValue():操作String
- opsForHash():操作Hash
- opsForList():操作List
- opsForSet():操作Set
- opsForZSet() :操作Zset
- opsForGeo():操作Geo
- opsForHyperLogLog():操作HyperLogLog
- opsForStream():操作Stream
1.2 保存一个对象
二 Jedis
Jedis是java中常见的操作客户端,支持redis的各种命令操作
2.1 Jedis常见操作
1)创建对象
public Jedis newJedis() {
String host = "127.0.0.1";
int port = 6379;
// 创建对象
return new Jedis(host, port);
}
2)获取当前库所有的key
@Test
public void test1() {
Jedis jedis = newJedis();
Set<String> keys = jedis.keys("*");
System.out.println(keys);
}
3)常见操作
和命令行一样,方法名也是:set(),get() 等
@Test
public void test2() {
Jedis jedis = newJedis();
// set,get
jedis.set("name", "lz");
jedis.set("age", "19");
System.out.println(jedis.get("name"));
System.out.println(jedis.get("age"));
// hset, hget
jedis.hset("person", "name", "lz");
jedis.hset("person", "age", "19");
System.out.println(jedis.hget("person", "name"));
// list操作
jedis.lpush("list_key_1", "lucy", "tom", "jack");
List<String> list_key_1 = jedis.lrange("list_key_1", 0, -1);
System.out.println(list_key_1);
jedis.del("list_key_1");
// set操作
jedis.sadd("set_key_1", "kk", "ll", "kk");
Set<String> set_key_1 = jedis.smembers("set_key_1");
System.out.println(set_key_1);
jedis.del("set_key_1");
// zset操作
jedis.zadd("zset_key_1", 10d, "shanghai");
jedis.zadd("zset_key_1", 20d, "beijing");
jedis.zadd("zset_key_1", 5d, "guangzhou");
Set<String> zset_key_1 = jedis.zrange("zset_key_1", 0, -1);
System.out.println(zset_key_1);
}