1.使用
1.创建java工程
2.引入依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>5.2.0</version>
</dependency>
java
//1.获取jedis对象,把所有对redis的操作都封装到该类中
//默认连接本地localhost,端口号6379
Jedis jedis=new Jedis("192.168.64.130",6379);
//key操作
Set<String> keys = jedis.keys("*");
System.out.println(keys);
//判断k1是否存在
boolean k1 = jedis.exists("k1");
System.out.println(k1);
//对string类型的操作
String set = jedis.set("name", "aaa");
String name = jedis.get("name");
System.out.println(name);
long setnx = jedis.setnx("name", "bbb");
System.out.println(setnx);
//对hash类型的操作
Map<String, String> map = new HashMap<>();
map.put("name","张三");
map.put("age","18");
map.put("sex","男");
jedis.hset("people",map);
Map<String, String> people = jedis.hgetAll("people");
System.out.println(people);
jedis.close();
1.2.Jedis连接池
Jedis线程不安全
作用:
提供效率,减少频繁创建和销毁连接对象
java
@Test
public void test02(){
//创建jedis连接池的配置
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//最大值
jedisPoolConfig.setMaxTotal(10);
//最小空闲值
jedisPoolConfig.setMinIdle(5);
//拿到jedis对象时,是否验证该对象可用
jedisPoolConfig.setTestOnBorrow(true);
//等待时间
Duration of = Duration.of(1000, ChronoUnit.MILLIS);
jedisPoolConfig.setMaxWait(of);
//创建jedis连接池
JedisPool jedisPool = new JedisPool(jedisPoolConfig,"192.168.64.130",6379);
//获取jedis对象
Jedis jedis=jedisPool.getResource();
//key操作
Set<String> keys = jedis.keys("*");
System.out.println(keys);
//判断k1是否存在
boolean k1 = jedis.exists("k1");
System.out.println(k1);
//对string类型的操作
String set = jedis.set("name", "aaa");
String name = jedis.get("name");
System.out.println(name);
long setnx = jedis.setnx("name", "bbb");
System.out.println(setnx);
//对hash类型的操作
Map<String, String> map = new HashMap<>();
map.put("name","张三");
map.put("age","18");
map.put("sex","男");
jedis.hset("people",map);
Map<String, String> people = jedis.hgetAll("people");
System.out.println(people);
jedis.close();
}
java
@Test
public void test02_1(){
JedisPool jedisPool=new JedisPool("192.168.64.130",6379);
jedisPool.setMaxTotal(10);
jedisPool.setMaxIdle(5);
jedisPool.setMaxWait(Duration.of(1000, ChronoUnit.MILLIS));
//获取jedis对象
Jedis jedis=jedisPool.getResource();
jedisPool.close();
}
2.java连接redis集群
java
@Test
public void test05(){
Set<HostAndPort> nodes=new HashSet<HostAndPort>();
nodes.add(new HostAndPort("192.168.64.130",7001));
nodes.add(new HostAndPort("192.168.64.130",7002));
nodes.add(new HostAndPort("192.168.64.130",7003));
nodes.add(new HostAndPort("192.168.64.130",7004));
nodes.add(new HostAndPort("192.168.64.130",7005));
nodes.add(new HostAndPort("192.168.64.130",7006));
JedisCluster jedisCluster=new JedisCluster(nodes);
jedisCluster.set("k1","v1");
String k1 = jedisCluster.get("k1");
System.out.println(k1);
jedisCluster.close();
}
3.springboot整合redis
在springboot中提供了俩个封装类RedisTemplate和StringRedisTemplate。StringRedisTemplate是
RedisTemplate的子类,StringRedisTemplate存储的元素值,都是String类型,不能直接存储对象类型。
1.依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.配置文件
#redis相关配置
spring.data.redis.host=192.168.64.130
spring.data.redis.port=6379
#使用哪个数据库
spring.data.redis.database=0
#不建议使用jedis连接池——线程安全问题,简易lettuce
spring.data.redis.lettuce.pool.max-active=10
spring.data.redis.lettuce.pool.max-idle=3
spring.data.redis.lettuce.pool.max-wait=10000
3.测试
3.1StringRedisTemplate
java
@Autowired
private StringRedisTemplate redisTemplate;
@Test
public void test01() throws JsonProcessingException {
//操作redis服务 key操作
Boolean k1 = redisTemplate.delete("k1");
System.out.println(k1);
Boolean k11 = redisTemplate.hasKey("k1");
System.out.println(k11);
//2.string操作,redis对每一种类型的操作都封装了相应的类,由相应类对象操作相应的数据类型
ValueOperations<String, String> forValue = redisTemplate.opsForValue();
forValue.set("k1","v1",30, TimeUnit.SECONDS);
String k12 = forValue.get("k1");
System.out.println(k12);
//可以通过序列化吧对象转换为相应的json字符
ObjectMapper objectMapper=new ObjectMapper();
forValue.set("k3",objectMapper.writeValueAsString(new User("bbb", 18)));
String k3 = forValue.get("k3");
//反序列化
User user = objectMapper.readValue(k3, User.class);
System.out.println(user);
//如果指定的key存在则存储失败,如果不存在则存储成功
Boolean k13 = forValue.setIfAbsent("k2", "333", 30, TimeUnit.SECONDS);
System.out.println(k13);
//3.hash操作
HashOperations<String, Object, Object> forHash = redisTemplate.opsForHash();
forHash.put("people","name","aaa");
forHash.put("people","age","18");
Map<Object, Object> people = forHash.entries("people");
System.out.println(people);
}
上面的StringRedisTemplate的key和value都是string类型
默认不能存储对象类型,要想存储需要把对象序列化,获取时反序列化
3.2RedisTemplate
java
@Data
@AllArgsConstructor
@NoArgsConstructor
//默认采用jdk的序列化方式
public class User implements Serializable {
private String name;
private Integer age;
}
java
@Autowired
private RedisTemplate redisTemplate;
@Test
public void test02(){
//可以操作字符串类型
ValueOperations valueOperations = redisTemplate.opsForValue();
valueOperations.set("k1","v1");
System.out.println(valueOperations.get("k1"));
//User类不能序列化
valueOperations.set("k2",new User("张三",18));
System.out.println(valueOperations.get("k2"));
}

因为RedisTemplate默认序列化方式为jdk序列化方式,可以指定序列化方式
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Object.class));
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));

使用一次需要设置一次
可以使用配置类
java
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String, Object> template= new RedisTemplate<>();
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);
template.setConnectionFactory(factory);
//key序列化方式
template.setKeySerializer(redisSerializer);
//value序列化方式
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashKeySerializer(redisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
return template;
}
}
如果使用对象类型建议使用RedisTemplate,基本数据类型StringRedisTemplate