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

相关推荐
GUIQU.2 小时前
【QT】嵌入式开发:从零开始,让硬件“活”起来的魔法之旅
java·数据库·c++·qt
callJJ6 小时前
从 0 开始理解 Spring 的核心思想 —— IoC 和 DI(2)
java·开发语言·后端·spring·ioc·di
wangjialelele6 小时前
Linux中的线程
java·linux·jvm·c++
谷咕咕6 小时前
windows下python3,LLaMA-Factory部署以及微调大模型,ollama运行对话,开放api,java,springboot项目调用
java·windows·语言模型·llama
ANYOLY6 小时前
Redis 面试宝典
数据库·redis·面试
没有bug.的程序员6 小时前
MVCC(多版本并发控制):InnoDB 高并发的核心技术
java·大数据·数据库·mysql·mvcc
在下村刘湘7 小时前
maven pom文件中<dependencyManagement><dependencies><dependency> 三者的区别
java·maven
不务专业的程序员--阿飞8 小时前
JVM无法分配内存
java·jvm·spring boot
李昊哲小课8 小时前
Maven 完整教程
java·maven
Lin_Aries_04218 小时前
容器化简单的 Java 应用程序
java·linux·运维·开发语言·docker·容器·rpc