springBoot集成redis

菜鸟阿都 等级 1081 0 0
 Redis作为一个Java后端面试中的一个常问考点,并且在项目中越来越常用,所以自己动手搭建了一个基于springboot集成redis做为数据缓存的demo(springboot集成mybatis、redis,并具有增删改查询接口)。关注微信公众号【菜鸟阿都】并回复:redis,可获得源码。后面也会继续深入研究redis相关知识,期待与大家一起学习交流。

redis简介 基于键值对的开源内存数据库,支持5种数据类型:string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)。spring对redis的支持是通过spring Data Redis来实现的,Spring Data Redis 提供了RedisTemplate和StringRedisTemplate两个模板来进行数据操作,StringRedisTemplate只针对键值都是字符型的数据进行操作,StringRedisTemplate继承于RedisTemplate,并采用StringRedisSerializer对键值序列化。

StringRedisTemplate 实现源码

public class StringRedisTemplate extends RedisTemplate<String, String>{
    public StringRedisTemplate() {
    this.setKeySerializer(RedisSerializer.string());
    this.setValueSerializer(RedisSerializer.string());
    this.setHashKeySerializer(RedisSerializer.string());
    this.setHashValueSerializer(RedisSerializer.string());
    }
}
public interface RedisSerializer<T> {
    static RedisSerializer<String> string() {
    return StringRedisSerializer.UTF_8;
    }
}

RedisTemplate提供的数据访问方法 |方法|说明| |-|-|-| |opsForValue()|简单操作只有属性的数据| |opsForList()|操作含有list的数据| |opsForSet()|操作含有set的数据| |opsForZSet()|操作含有ZSet(有序的set)的数据| |opsForHash()|简操作含有hash的数据|

  1. 添加reids依赖
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
   <version>2.4.1</version>
</dependency>
  1. 封装redis工具类

将redis的操作方法封装为工具类,方便使用

 /**
 * Redis操作工具类
 */
@Component
public class RedisUtil {

    @Autowired
    private RedisTemplate<Object, Object> redisTemplate;

    // 存入数据到缓存
    public void setValue(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    // 通过key获得数据
    public Object getValue(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    // 存入数据到缓存并设置过期时间(单位为秒)
    public void setValueAndExpire(String key, Object value, long time){
        redisTemplate.opsForValue().set(key, value,time,TimeUnit.SECONDS);
    }

    // 删除缓存
    public void delete(String key){
        redisTemplate.delete(key);
    }
}
  1. redis使用

    查询数据时先查询缓存中是否存在,存在时,返回内存中的数据,缓存中不存在时,再查询数据库并存入缓存,然后返回查询出的数据
// 根据id查询记录
@Override
public User find(int id) {
    //根据key查询缓存
    User user=(User) redisUtil.getValue("userKey"+id);
    //判断是否为空
    if(user==null){
        // 缓存为空,查询数据库
        user=userMapper.find(id);
        System.out.println("缓存为空,查询数据库");
        // 插入缓存,并设置过期时间(单位为秒)
        redisUtil.setValueAndExpire("userKey"+id,user,30);
        System.out.println("插入缓存");
    }else{
        System.out.println("缓存不为空");
    }
    return user;
}
  1. 自定义缓存序列化方式

    RedisTemplate默认采用JdkSerializaationRedisSerializer方式序列化,以二进制数据存放,使用redis客户端工具查看数据时不直观,并且需要对实体类进行序列化(实现Serializable接口)。所以编写redis的配置类修改RedisTemplate的序列化方式,将JdkSerializaationRedisSerializer序列化方式修改为Jackson2JsonRedisSerialize,以json格式对数据进行保存。StringRedisTemplate默认使用的是StringRedisSerializer。

    @Configuration
    public class RedisConfig   {
     // 使用Jackson2JsonRedisSerialize替换默认JDK序列化
     @Bean
     public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
         RedisTemplate<Object,Object> redisTemplate = new RedisTemplate<>();
         redisTemplate.setConnectionFactory(redisConnectionFactory);
         // key采用String的序列化方式
         redisTemplate.setKeySerializer(new StringRedisSerializer());
         // hash的key也采用String的序列化方式
         redisTemplate.setHashKeySerializer(new StringRedisSerializer());
         // value序列化方式采用jackson
         redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
         // hash的hash的value序列化方式采用jackson
         redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
         return redisTemplate;
     }    
    }

    默认序列化(通过redisClient客户端查看)

springBoot集成redis

使用自定义序列化后,存入缓存中的数据(通过redisClient客户端查看) springBoot集成redis

5.结果分析

   第一次访问时,缓存为空,查询数据库并插入缓存中,总共用时2941毫秒,第二次查询时,直接从缓存中获取,用时仅仅25毫秒。
缓存为空,查询数据库
插入缓存
总用时:2941
缓存不为空
总用时:25
收藏
评论区

相关推荐

我是Redis,MySQL大哥被我害惨了!
本文转自 轩辕之风 ,链接如下 https://mp.weixin.qq.com/s?__bizMzIyNjMxOTY0NA&mid2247486528&idx1&sn3f7b09eb21969fdb16f5b0805ff69fed&scene21wechat_redirect 我是Redis 你好,我是Redis,一个叫Antirez的
.net core 2.0 redis驱动性能比拼
.net core 2.0 redis驱动性能比拼 .net core 2.0 redis驱动性能比拼 今天来了三位主角,他们分别是大名鼎鼎的 StackExchange.Redis,无敌轻巧的
开发机连接Docker中的redis容器小案例
在笔者日常开发中,都是把redis装在windows系统中。虽然可以通过RedisDesktopManager等客户端工具连接操作redis,但是还是
Go-连接Redis-学习go-redis包
Redis介绍 Redis是一个开源的内存数据结构存储,常用作数据库、缓存和消息代理。目前它支持的数据结构有诸如string、hash、list、set、zset、bitmap、hyperloglog、geospatial index和stream。Redis内置了复制、Lua脚本、LRU清除、事务和不同级别的磁盘持久性,并通过Redis Sentinel
Redis实现分布式锁
一、redis分布式锁的简易实现 用redis实现分布式锁是一个老生常谈的问题了。因为redis单条命令执行的原子性和高性能,当多个客户端执行setnx(相同key)时,最多只有一个获得成功。因此在对可用性要求不是特别高的场景下,redis分布式锁方案不失为一个性价比高的实现。 1. 多个客户端执行setnx lock
我的错误总结
使用redis时MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redi
php操作redis哨兵模式,主从切换后自动获取master
本文将介绍如何使用PHP来连接redis哨兵模式。哨兵模式:大概的原理就是监听redis主库心跳包,如果心跳断开,则枚举一个从库推举成为新的主库,防止redis宕机不能使用。为了增强redis的性能,防止其挂掉,引用redis哨兵监控redis集群是个不错的选择。下面三步简单记录php连接redis哨兵。 第一步、获取哨兵模式连接redis句柄对象/
为什么单线程的Redis能支持高并发?
一、Redis为什么是单线程注意:redis 单线程指的是网络请求模块使用了一个线程,即一个线程处理所有网络请求,其他模块仍用了多个线程。因为CPU不是Redis的瓶颈。Redis的瓶颈最有可能是机器内存或者网络带宽,既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。关于redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万
Redis 未授权访问漏洞复现与利用
一、漏洞简介以及危害: 1.什么是redis未授权访问漏洞: Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上
Redis集群详解
Redis集群详解Redis有三种集群模式,分别是: 主从模式 Sentinel模式 Cluster模式 三种集群模式各有特点,关于Redis介绍可以参考这里:Redis官网:https://redis.io/ ,最新版本5.0.4 主从模式 主从模式介绍主从模式是三种模式中最简单的,在主从复制中,数据库分为两类:主数据库(master)和从数据库(sl
springBoot集成redis
Redis作为一个Java后端面试中的一个常问考点,并且在项目中越来越常用,所以自己动手搭建了一个基于springboot集成redis做为数据缓存的demo(springboot集成mybatis、redis,并具有增删改查询接口)。关注微信公众号【菜鸟阿都】并回复:redis,可获得源码。后面也会继续深入研究redis相关知识,期待与大家一起学习交流。r
我终于弄清楚了redis数据结构之string应用场景
英国弗兰明曾说过一句话:“不要等待运气降临,应该去努力掌握知识。” 1 前言大家好,我是阿沐!对于redis大家是最熟悉不过了,作为缓存界的使用率一直遥遥领先。基本上整个互联网无论大小公司使用redis占绝大部分,那么很多人使用它,那就是只是使用它,对于它的使用场景并没有去理会太多(能用就行),这篇文章来讲讲redis的基础数据结构string。Redis有
给dubbo贡献源码,做梦都在修bug
本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star。 一在之前的文章《redis在微服务领域的贡献》中,从一次面试经历中了解了redis可以在微服务中玩的这么溜,同时也从源码角度分析了dubbo的redis注册中心。最后得出了dubbo的redis注册中心不能用于生产的结论,其中原因有如下两点: 使用了ke
最新Java大厂高频面试题,看这一篇就够了!
常见resdis面试真题40道(含解析)1. 什么是 Redis?2. Redis 的数据类型?3. 使用 Redis 有哪些好处?4. Redis 相比 Memcached 有哪些优势?5. Memcache 与 Redis 的区别都有哪些?6. Redis 是单进程单线程的?7. 一个字符串类型的值能存储最大容量是多少?8. Redis
spring-data-redis 动态切换数据源
最近遇到了一个麻烦的需求,我们需要一个微服务应用同时访问两个不同的 Redis 集群。一般我们不会这么使用 Redis,但是这两个 Redis 本来是不同业务集群,现在需要一个微服务同时访问。其实我们在实际业务开发的时候,可能还会遇到类似的场景。例如 Redis 读写分离,这个也是 springdataredis 没有提供的功能,底层连接池例如 Lettuc