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

相关推荐
s_fox_4 分钟前
Nginx Embedded Variables 嵌入式变量解析(4)
java·网络·nginx
Jelena1577958579210 分钟前
使用Java爬虫获取1688 item_get_company 接口的公司档案信息
java·开发语言·爬虫
数据小小爬虫13 分钟前
Jsoup解析商品详情时,如何确保数据准确性?
java·爬虫
V+zmm1013423 分钟前
自驾游拼团小程序的设计与实现(ssm论文源码调试讲解)
java·数据库·微信小程序·小程序·毕业设计
坚定信念,勇往无前35 分钟前
springboot单机支持1w并发,需要做哪些优化
java·spring boot·后端
丁总学Java1 小时前
`AdminAdminDTO` 和 `userSession` 对象中的字段对应起来的表格
java
HUNAG-DA-PAO2 小时前
Redis存在线程安全吗?为什么?
redis·安全·php
m0_748240252 小时前
SpringMVC详解
java
剑走偏锋o.O2 小时前
Java四大框架深度剖析:MyBatis、Spring、SpringMVC与SpringBoot
java·spring boot·spring·mybatis
早起的年轻人2 小时前
Java List 自定义对象排序 Java 8 及以上版本使用 Stream API
java·windows·list