java连接redis

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

相关推荐
SnrtIevg1 天前
Vavr 用户指南
java·后端
怦怦蓝1 天前
IDEA 开发邮件发送功能:全流程报错解决方案汇总
java·ide·intellij-idea·发邮件
艾莉丝努力练剑1 天前
【优选算法必刷100题:专题五】(位运算算法)第033~38题:判断字符是否唯一、丢失的数字、两整数之和、只出现一次的数字 II、消失的两个数字
java·大数据·运维·c++·人工智能·算法·位运算
大猫和小黄1 天前
Java开发过程中的各种ID生成策略
java·开发语言·id
小罗和阿泽1 天前
java [多线程基础 二】
java·开发语言·jvm
小罗和阿泽1 天前
java 【多线程基础 一】线程概念
java·开发语言·jvm
悟空码字1 天前
SpringBoot整合Zookeeper,实现分布式集群部署
java·zookeeper·springboot·编程技术·后端开发
橘颂TA1 天前
线程池与线程安全:后端开发的 “性能 + 安全” 双维实践
java·开发语言·安全
色空大师1 天前
服务打包包名设置
java·elasticsearch·maven·打包
xiaoyustudiowww1 天前
fetch异步简单版本(Tomcat 9)
java·前端·tomcat