文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot整合Redis案例分析

2023-06-19 11:30

关注

这篇文章主要介绍了SpringBoot整合Redis案例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot整合Redis案例分析文章都会有所收获,下面我们一起来看看吧。

Springboot整合Redis

如果没有Redis,就先去下载
如果redis不熟悉去看

undefined

SpringData也是和SpringBoot齐名的项目!

说明:在SpringBoot2.x之后,原来使用的jedis被替换为了lettuce

jedis:采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用jedis pool连接池!【类似于BIO:同步阻塞IO】

lettuce:采用netty【异步请求,性能更高点】,实例可以再多个线程中进行共享,不存在线程不安全的情况!可以减少线程数量了【类似于NIO:同步非阻塞IO】

源码分析:

@Bean//当这个Bean不存在的时候,这个类就生效//这就说明,我们可以自己定义一个redisTemplate来替换这个默认的!@ConditionalOnMissingBean(name = "redisTemplate")@ConditionalOnSingleCandidate(RedisConnectionFactory.class)public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {        //默认的RedisTemplate没有过多的设置,redis,对象都是需要序列化的!        //两个泛型都是Object类型,我们后面使用需要强制转换:我们需要的类型<String, Object>RedisTemplate<Object, Object> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);return template;}@Bean@ConditionalOnMissingBean//由于String是Redis最常用的类型,所以说单独提出来了一个Bean@ConditionalOnSingleCandidate(RedisConnectionFactory.class)public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {StringRedisTemplate template = new StringRedisTemplate();template.setConnectionFactory(redisConnectionFactory);return template;}

上手测试【默认的RedisTemplate了解】

1.导入依赖
<!--操作redis-->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-data-redis</artifactId>        </dependency><!--上面redis不兼容时候,可以换成jedis--><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-redis</artifactId>    <exclusions>        <exclusion>            <groupId>io.lettuce</groupId>            <artifactId>lettuce-core</artifactId>        </exclusion>    </exclusions></dependency><dependency>    <groupId>redis.clients</groupId>    <artifactId>jedis</artifactId></dependency>
2.配置连接
# SpringBoot所有的配置类,都有一个自动配置类  RedisAutoConfiguration#  自动配置类都会绑定一个properties配置文件  RedisPropertiesspring:  redis:    host: 127.0.0.1    # Redis服务器连接端口    port: 6379    # Redis数据库索引(默认为0)    database: 0    # Redis服务器连接密码(默认为空)    password:    # 连接池最大连接数(使用负值表示没有限制)    pool:      max-active: 200    # 连接池最大阻塞等待时间(使用负值表示没有限制)      max-wait: -1    # 连接池中的最大空闲连接      max-idle: 10    # 连接池中的最小空闲连接      min-idle: 0    # 连接超时时间(毫秒)    timeout: 1000
3.测试
@SpringBootTestclass Redis03SpringbootApplicationTests {    //注入RedisAutoConfiguration里面配置的类    @Autowired    public RedisTemplate redisTemplate;    @Test    void contextLoads() {        //redisTemplate :操作我们的数据库,api和我们的是一样的        //opsForValue   :操作字符串  类似String        //opsForList    :操作List        //除了基本的操作,我们常用的方法都可以直接通过redisTemplate进行操作        //比如事务和基本的CRUD        //获取redis的连接对象,就可以操作数据库的连接了【一般很少来用】        redisTemplate.opsForValue().set("kami", "g1x");        System.out.println(redisTemplate.opsForValue().get("kami"));    }}
4.结果

SpringBoot整合Redis案例分析

问题:写到中文的时候,springboot是正常的,但是从redis中的redis.cli.exe运行keys *会出来乱码

SpringBoot整合Redis案例分析

SpringBoot整合Redis案例分析

SpringBoot整合Redis案例分析

6.这时候我们就需要自己来写配置类

上手测试【自定义的RedisTemplate——实际一般使用】

1.先创建一个pojo,user
//将它变为组件,方便调用@Component@Data@AllArgsConstructor@NoArgsConstructorpublic class User {    private String name;    private Integer age;}
2.测试类写序列化json对象操作【这里默认的序列化是JDK序列化】
    @Test    public void test() throws JsonProcessingException {        //真实开发中一般都使用json来传递对象,所以要序列化json        User user = new User("葛", 3);        //所以要序列化成json对象【变成了json字符串】        String jsonUser = new ObjectMapper().writeValueAsString(user);        redisTemplate.opsForValue().set("user", jsonUser);        System.out.println(redisTemplate.opsForValue().get("user"));    }
3.刚才测试的是默认的序列化(JDK),这时候我们自己写其他方式的序列化
  1. 创建一个config

  2. SpringBoot整合Redis案例分析

    //这里面到底怎么配置看后面Jackson2JsonRedisSerializer<Object> objectJackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>();//配置具体的序列化template.setKeySerializer(objectJackson2JsonRedisSerializer);
    • 多种序列化方式

    1. 写法例子

  3. 自己写很费劲,用已经写好的例子即可

    连接中有不同地方,复制连接中import com.fasterxml.jackson.annotation.JsonAutoDetect;import com.fasterxml.jackson.annotation.PropertyAccessor;import com.fasterxml.jackson.databind.ObjectMapper;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer; import java.rmi.UnknownHostException; @Configurationpublic class RedisConfig {    @Bean    @SuppressWarnings("all")    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {        // 自定义 String Object        RedisTemplate<String, Object> template = new RedisTemplate();        template.setConnectionFactory(redisConnectionFactory);         // Json 序列化配置        Jackson2JsonRedisSerializer<Object> objectJackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);        // ObjectMapper 转译        ObjectMapper objectMapper = new ObjectMapper();        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);        objectJackson2JsonRedisSerializer.setObjectMapper(objectMapper);         // String 的序列化        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();         // key 采用String的序列化方式        template.setKeySerializer(stringRedisSerializer);        // hash 的key也采用 String 的序列化方式        template.setHashKeySerializer(stringRedisSerializer);        // value 序列化方式采用 jackson        template.setValueSerializer(objectJackson2JsonRedisSerializer);        // hash 的 value 采用 jackson        template.setHashValueSerializer(objectJackson2JsonRedisSerializer);        template.afterPropertiesSet();         return template;    }}
    • 企业中直接拿去使用即可
  4. 编写工具类

    package com.kami.utils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Component;import org.springframework.util.CollectionUtils;import java.util.List;import java.util.Map;import java.util.Set;import java.util.concurrent.TimeUnit;@Componentpublic final class RedisUtil {    @Autowired    private RedisTemplate<String, Object> redisTemplate;        public boolean expire(String key, long time) {        try {            if (time > 0) {                redisTemplate.expire(key, time, TimeUnit.SECONDS);            }            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public long getExpire(String key) {        return redisTemplate.getExpire(key, TimeUnit.SECONDS);    }        public boolean hashKey(String key) {        try {            return redisTemplate.hasKey(key);        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public void del(String... key) {        if (key != null && key.length > 0) {            redisTemplate.delete(key[0]);        } else {            redisTemplate.delete(CollectionUtils.arrayToList(key));        }    }    //==================================String====================================        public Object get(String key) {        return key == null ? null : redisTemplate.opsForValue().get(key);    }        public boolean set(String key, Object value) {        try {            redisTemplate.opsForValue().set(key, value);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public boolean set(String key, Object value, long time) {        try {            if (time > 0) {                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);            } else {                set(key, value);            }            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public long incr(String key, long delta) {        if (delta < 0) {            throw new RuntimeException("递增因子必须大于0");        }        return redisTemplate.opsForValue().increment(key, delta);    }        public long decr(String key, long delta) {        if (delta < 0) {            throw new RuntimeException("递减因子必须大于0");        }        return redisTemplate.opsForValue().decrement(key, delta);    }    // ================================Map=================================        public Object hget(String key, String item) {        return redisTemplate.opsForHash().get(key, item);    }        public Map<Object, Object> hmget(String key) {        return redisTemplate.opsForHash().entries(key);    }        public boolean hmset(String key, Map<String, Object> map) {        try {            redisTemplate.opsForHash().putAll(key, map);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public boolean hmset(String key, Map<String, Object> map, long time) {        try {            redisTemplate.opsForHash().putAll(key, map);            if (time > 0) {                expire(key, time);            }            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public boolean hset(String key, String item, Object value) {        try {            redisTemplate.opsForHash().put(key, item, value);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public boolean hset(String key, String item, Object value, long time) {        try {            redisTemplate.opsForHash().put(key, item, value);            if (time > 0) {                expire(key, time);            }            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public void hdel(String key, Object... item) {        redisTemplate.opsForHash().delete(key, item);    }        public boolean hHasKey(String key, String item) {        return redisTemplate.opsForHash().hasKey(key, item);    }        public double hincr(String key, String item, double by) {        return redisTemplate.opsForHash().increment(key, item, by);    }        public double hdecr(String key, String item, double by) {        return redisTemplate.opsForHash().increment(key, item, -by);    }    // ============================set=============================        public Set<Object> sGet(String key) {        try {            return redisTemplate.opsForSet().members(key);        } catch (Exception e) {            e.printStackTrace();            return null;        }    }        public boolean sHasKey(String key, Object value) {        try {            return redisTemplate.opsForSet().isMember(key, value);        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public long sSet(String key, Object... values) {        try {            return redisTemplate.opsForSet().add(key, values);        } catch (Exception e) {            e.printStackTrace();            return 0;        }    }        public long sSetAndTime(String key, long time, Object... values) {        try {            Long count = redisTemplate.opsForSet().add(key, values);            if (time > 0) {                expire(key, time);            }            return count;        } catch (Exception e) {            e.printStackTrace();            return 0;        }    }        public long sGetSetSize(String key) {        try {            return redisTemplate.opsForSet().size(key);        } catch (Exception e) {            e.printStackTrace();            return 0;        }    }        public long setRemove(String key, Object... values) {        try {            Long count = redisTemplate.opsForSet().remove(key, values);            return count;        } catch (Exception e) {            e.printStackTrace();            return 0;        }    }    // ===============================list=================================        public List<Object> lGet(String key, long start, long end) {        try {            return redisTemplate.opsForList().range(key, start, end);        } catch (Exception e) {            e.printStackTrace();            return null;        }    }        public long lGetListSize(String key) {        try {            return redisTemplate.opsForList().size(key);        } catch (Exception e) {            e.printStackTrace();            return 0;        }    }        public Object lGetIndex(String key, long index) {        try {            return redisTemplate.opsForList().index(key, index);        } catch (Exception e) {            e.printStackTrace();            return null;        }    }        public boolean lSet(String key, Object value) {        try {            redisTemplate.opsForList().rightPush(key, value);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public boolean lSet(String key, Object value, long time) {        try {            redisTemplate.opsForList().rightPush(key, value);            if (time > 0) {                expire(key, time);            }            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public boolean lSet(String key, List<Object> value) {        try {            redisTemplate.opsForList().rightPushAll(key, value);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public boolean lSet(String key, List<Object> value, long time) {        try {            redisTemplate.opsForList().rightPushAll(key, value);            if (time > 0) {                expire(key, time);            }            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public boolean lUpdateIndex(String key, long index, Object value) {        try {            redisTemplate.opsForList().set(key, index, value);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public long lRemove(String key, long count, Object value) {        try {            Long remove = redisTemplate.opsForList().remove(key, count, value);            return remove;        } catch (Exception e) {            e.printStackTrace();            return 0;        }    }    // ===============================HyperLogLog=================================    public long pfadd(String key, String value) {        return redisTemplate.opsForHyperLogLog().add(key, value);    }    public long pfcount(String key) {        return redisTemplate.opsForHyperLogLog().size(key);    }    public void pfremove(String key) {        redisTemplate.opsForHyperLogLog().delete(key);    }    public void pfmerge(String key1, String key2) {        redisTemplate.opsForHyperLogLog().union(key1, key2);    }}
    • 我们真实的分发中,或者在你们的公司,一般都可以看到一个公司自己封装RedisUtil

  5. 转到测试类

    @SpringBootTestclass Redis02SpringbootApplicationTests {     @Autowired    // 指定我们自己定义的redis序列化配置    private RedisTemplate<String, Object> redisTemplate;     @Autowired    private RedisUtil redisUtil;    @Test    void test1() {        // 清空数据库        redisTemplate.getConnectionFactory().getConnection().flushDb();         User user = new User("zhangsha", 23);        redisUtil.set("user", user);        System.out.println(redisUtil.get("user"));    }}
    • 这时候注入的RedisTemplate需要导入的是我们的

  6. 结果就是输出前加了转译【不再是乱码】

    1. redis目录中的redis-cle.exe

    2. 执行结果

    3. SpringBoot整合Redis案例分析

关于“SpringBoot整合Redis案例分析”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“SpringBoot整合Redis案例分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯