Redis在SpringBoot中的简单应用

这篇具有很好参考价值的文章主要介绍了Redis在SpringBoot中的简单应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Redis是什么?

1 redis的由来:

Redis在SpringBoot中的简单应用

        Salvatore • Sam Philippe对于公司的系统的性能不满意,亲手撸了一个缓存数据库,旨在提高其性能,就是现在的redis。
2 简单介绍:

redis是一个间于后端和数据库之间的一层缓存,作为基于内存的数据库使用。

具有灵活和多实现方式的特点

Redis在SpringBoot中的简单应用

3 redis解决的问题:

Redis在SpringBoot中的简单应用

Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。  

redis最为突出的特点:读写速度快。

 参考:

认知系列-What is Redis_哔哩哔哩_bilibili

11 what is redis?

What's Redis?_墨香當归的博客-CSDN博客_what is redis

二、 怎么在SpringBoot项目中应用Redis

搭建一个能够运行成功的SSM工程项目。这里以简单的用户数据为例;

(实际开发往往使用现有的静态工具类RedisUtil封装redis的常用功能,可以在网上轻松搜索到)

1 、引入依赖(Redis,MySQL等)

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

2 创建entity实体类Usermapper接口、Service实现类

User和Result类(Swagger)

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;
import org.springframework.stereotype.Component;

@Data
@ToString
@Component
@ApiModel(value = "用户",description = "用于描述用户对象")
public class User extends Base implement Serializable{

    @ApiModelProperty(value = "用户ID",example = "123")
    private long id=0;
    @ApiModelProperty(value = "用户密码",example = "abc")
    private String password="";
    @ApiModelProperty(value = "用户姓名",example = "jing")
    private String name="";
    @ApiModelProperty(value = "用户电话",example = "180****8963")
    private String tel="";
    @ApiModelProperty(value = "生产日期",example = "2000-08-13")
    private String birthday="";
    @ApiModelProperty(value = "性别",example = "男")
    private String sex="";
}
import lombok.*;
import org.springframework.stereotype.Component;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

@Data
@ToString
@Component
public class Result implements Serializable {
    private Integer code=0;
    private String msg="";
    private List data=new ArrayList();
    private Integer count=0;
}

Usermapper(使用Mybatis+动态Sql语句,推荐使用xml配置文件方式)

import com.wanxi.springboot1018.entity.User;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;

import java.util.List;

public interface UserMapper {

    @Insert("insert into user (password,name,tel,birthday,sex) values (#{password},#{name},#{tel},#{birthday},#{sex})")
    int add(User user);

    @Delete("delete from user where id = #{index};")
    int delete(User user);

    @Update("update user set name = #{name},tel = #{tel},birthday = #{birthday},sex = #{sex} where id = #{id}")
    int alter(User user);

    @Update("update user set password = #{password} where id = #{id}")
    int alterPD(User user);

    @Select("select * from user where id = #{id}")
    List<User> singleFind(User user);

    @Select("<script>" +
            "    SELECT * FROM user\n" +
            "    <where>\n" +
            "        <if test=\"start!=''\">\n" +
            "            <if test=\"end!=''\">\n" +
            "                and birthday between #{start} and #{end}\n" +
            "            </if>\n" +
            "        </if>\n" +
            "        <if test=\"username!=null and username!='' \">\n" +
            "            and name like concat('%',#{username},'%')\n" +
            "        </if>\n" +
            "\n" +
            "        <if test=\"tel!= ''\">\n" +
            "            and tel like concat('%',#{tel},'%')\n" +
            "        </if>\n" +
            "        <if test=\"sex!= ''\">\n" +
            "            and sex =#{sex}\n" +
            "        </if>\n" +
            "    </where>" +
            "       order by id desc" +
            "</script>")
    List<User> find(User user);

    @Select("select count(id) from user")
    int getCount(User user);

    @Select("select * from user where name = #{username} and password = #{password}")
    User login(User user);
}

数据库内容

Redis在SpringBoot中的简单应用

 3、创建Redis 配置类,配置redis的处理策略

开启redis,注册redistemplate,用于ValueOperations调用,实现数据缓存。

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.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        // 设置常规key value 的序列化策略
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // 这里使用一般的json处理,就不容易存在兼容性问题。否则可能需要对应的json才能解析序列化的数据
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        // 设置hash类型的序列化策略
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new GenericJackson2JsonRedisSerializer());
        // 注入连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        return redisTemplate;
    }
}

4、在服务逻辑层实现redis逻辑

实现查询逻辑,增加redis逻辑(如果redis服务有数据,就不需要访问数据库)

package com.wanxi.springboot1018.service.impl;
import com.github.pagehelper.PageHelper;
import com.wanxi.springboot1018.entity.Result;
import com.wanxi.springboot1018.mapper.UserMapper;
import com.wanxi.springboot1018.service.UserService;
import com.wanxi.springboot1018.entity.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
    @Resource
    UserMapper userMapper;
    @Resource
    Result result;
    @Resource
    RedisTemplate redisTemplate;
    //logger用于输出记录
    private static org.slf4j.Logger logger = (Logger) LoggerFactory.getLogger(UserServiceImpl.class.getName());
    @Override
    public Result find(User user) {
        PageHelper.startPage(user.getPage(),10);
        ValueOperations valueOperations = redisTemplate.opsForValue();
        List<User> userList=null;
        int tmpCount=0;
        //设置键:数据实体类型 + 页数
        String key1= "UserInfo"+user.getPage();
        String key2= "UserCount";
        //判断有没有redis用户数据
        List tmpUserList = (List<User>) valueOperations.get(key1);
        int tmpCount= (int) valueOperations.get(key2);
        if(tmpUserList!=null && tmpCount>=0){//有则redis
            userList = tmpUserList;
            count= tmpCount;
            logger.info("当前使用redis:获取User信息");
        }else {//否则数据库
            //获取
            userList= userMapper.find(user);
            count=userMapper.getCount(user);
            //存入redis
            valueOperations.set(key1,userList);
            valueOperations.set(key2,count);
            logger.info("当前使用mysql:获取User信息");
        }
        result.setCount(count);
        result.setMsg("success");
        result.setCode(0);
        result.setData(userList);
        return result;
    }
}

5、测试

带上了redis的service层的表现如何?

首先我们把之前的redis缓存删除掉。

Redis在SpringBoot中的简单应用

 没有redis缓存,去数据库取数据

我们像之前的一样,只传入page=1的参数

Redis在SpringBoot中的简单应用

第二次取数据,从redis缓存中获取时

Redis在SpringBoot中的简单应用

能够看到,读取速度差了一个数量级。

这样redis的基本功能算是实现了

三、Redis在这个项目中起到的作用?

优势:

  1. redis 是将所有数据存放在内存中,因此能够提升系统的响应能力,能够提升用户的体验。
  2. 服务端使用缓存能够减轻数据库服务器的压力。
  3. 提升系统性能:缩短响应时间;减少网络传输时间和应用延迟时间;增加用户并发;提高数据库资源的利用率;

细说redis的优点

1)支持数据持久化

虽然Redis是缓存数据库,但是Redis支持数据的持久化,内存中的数据还是会被保存在磁盘中,重启的时候再次加载进行使用。 
2)支持多种数据类型

Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构;

3)响应快速

由于数据加载到了内存,Redis 响应非常快,每秒可以执行大约 110 000 个写入操作,或者 81 000 个读操作,其速度远超数据库。

4)原子操作的特性

所有 Redis 的操作都是原子的,从而确保当两个客户同时访问 Redis 服务器时,得到的是更新后的值(最新值)。在需要高并发、需要锁的场合可以考虑使用 Redis 的事务

5)MultiUtility 工具

Redis 可以在如缓存、消息传递队列中使用(Redis 支持“发布+订阅”的消息模式),在应用程序如 Web 应用程序会话、网站页面点击数等任何短暂的数据中使用。
6)支持配置集群

Redis支持主从模式,可以配置集群,这样更利于支撑起大型的项目,这也是Redis的一大亮点。

7) Redis设计是单线程且支持高并发,支持多路IO复用

多路IO复用:这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗);

Redis为什么是单线程还支持高并发 - 走看看

四、Redis有哪些缺点,对未来的数据缓存应用有什么期望。

缺点:

1,需要考虑缓存穿透、缓存击穿、缓存雪崩的问题

2,缓存与数据库数据同步,同时存两份相同数据;(维护成本增加)

3.数据库容量受到内存的限制,仅能用于文本、对象等数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。不支持图片、音乐等多媒体资源

4.Redis 不具备自动容错和恢复功能,如果是redis主从模式,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启才能恢复。

5.Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。

期望:

        缓存穿透是可以在代码层面上解决的问题,在没有数据的时候,能够返回假数据(空数据)给用户这样让客户端误以为有数据,缓存击穿、缓存雪崩需可以通过集群来实现数据备份。因此期望以后的类似redis的应用能够将以上问题解决,而不是抛给程序员。 

        维护成本这是缓存数据库必然的代价,既然要速度,那就必须要额外的数据以加载到内存及硬盘。

《Redis面试系列四、Redis不得不说的缺点|CSDN创作打卡》_小雨下雨的雨的博客-CSDN博客_redis缺点

五、其他、拓展

redis可以实现5中基本类型的存储

结构类型 结构存储的值 结构的读写能力
String字符串 可以是字符串、整数或浮点数 对整个字符串或字符串的一部分进行操作;对整数或浮点数进行自增或自减操作;
List列表 一个链表,链表上的每个节点都包含一个字符串 对链表的两端进行push和pop操作,读取单个或多个元素;根据值查找或删除元素;
Set集合 包含字符串的无序集合 字符串的集合,包含基础的方法有看是否存在添加、获取、删除;还包含计算交集、并集、差集等
Hash散列 包含键值对的无序散列表 包含方法有添加、获取、删除单个元素
Zset有序集合 和散列一样,用于存储键值对 字符串成员与浮点数分数之间的有序映射;元素的排列顺序由分数的大小决定;包含方法有添加、获取、删除单个元素以及根据分值范围或成员来获取元素

Redis在SpringBoot中的简单应用

指令操作:

Redis 数据类型 | 菜鸟教程

Redis五种基本数据类型_NeverOW的博客-CSDN博客_redis的五种数据类型文章来源地址https://www.toymoban.com/news/detail-464600.html

到了这里,关于Redis在SpringBoot中的简单应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是redis中的哈希桶、哈希冲突及解决方法

    Redis中的哈希桶是一种数据结构,用于在Redis的哈希表(如字典结构)中存储键值对。 哈希桶是哈希表数组中的每个元素,可以视为一个容器或槽位,用于存放数据。在Redis中,当插入一个新的键值对时,会根据键的哈希值计算出一个索引,该索引指向特定的哈希桶。 每个哈

    2024年04月08日
    浏览(51)
  • 【面试题27】Redis中的connect和pconnect如何使用,有什么区别

    本文已收录于PHP全栈系列专栏:PHP面试专区。 计划将全覆盖PHP开发领域所有的面试题, 对标资深工程师/架构师序列 ,欢迎大家提前关注锁定。 Redis是一个开源的基于内存的键值存储系统,常用于缓存、消息队列和数据存储。在Redis中, connect 和 pconnect 都是用于与Redis服务器

    2024年02月12日
    浏览(54)
  • @EnableCaching、@Cacheable的介绍,及Redis在SpringBoot中的使用教程

    首先说明这两个注解都是spring提供的,可以结合不同的缓存技术使用。(这里将顺便结合Redis进行讲解) 1.1 @EnableCaching @EnableCaching是开启缓存功能,作用于缓存配置类上或者作用于springboot启动类上。 1.2 @Cacheable @Cacheable 注解在方法上,表示该方法的返回结果是可以缓存的。也

    2024年01月24日
    浏览(49)
  • Python爬虫IP池优化 - Redis在代理池中的应用

    大家好!作为一名专业的爬虫程序员,我今天要和大家分享关于Python爬虫IP池优化方面的知识。我们将重点讨论Redis在代理池中的应用,并提供实际操作价值高、具有解决问题能力强的方法和代码示例。希望通过本文,您可以学到如何利用Redis来构建一个稳定可靠且高效运行的

    2024年02月11日
    浏览(37)
  • 探索Redis特殊数据结构:Bitmaps(位图)在实际中的应用

    Redis官方提供了多种数据类型,除了常见的String、Hash、List、Set、zSet之外,还包括Stream、Geospatial、Bitmaps、Bitfields、Probabilistic(HyperLogLog、Bloom filter、Cuckoo filter、t-digest、Top-K、Count-min sketch、Configuration)和Time series。这些数据类型在Redis的数据结构中发挥着各自独特的作用。

    2024年01月19日
    浏览(44)
  • 分布式天梯图算法在 Redis 图数据库中的应用

    Redis是一个高性能的键值对数据库,支持常用的数据结构和分布式操作,被广泛应用于缓存、消息队列和排行榜等场景。除了基本的数据结构,Redis还支持图数据结构并提供了一些算法支持。 天梯图算法是一种基于贪心的图搜索算法,在寻找最短路径问题中具有很高的效率。

    2024年02月14日
    浏览(35)
  • 探索Redis特殊数据结构:Geospatial(地理位置)在实际中的应用

    Redis官方提供了多种数据类型,除了常见的String、Hash、List、Set、zSet之外,还包括Stream、Geospatial、Bitmaps、Bitfields、Probabilistic(HyperLogLog、Bloom filter、Cuckoo filter、t-digest、Top-K、Count-min sketch、Configuration)和Time series。这些数据类型在Redis的数据结构中发挥着各自独特的作用。

    2024年02月20日
    浏览(45)
  • 探讨Redis缓存问题及解决方案:缓存穿透、缓存击穿、缓存雪崩与缓存预热(如何解决Redis缓存中的常见问题并提高应用性能)

    Redis是一种非常流行的开源缓存系统,用于缓存数据以提高应用程序性能。但是,如果我们不注意一些缓存问题,Redis也可能会导致一些性能问题。在本文中,我们将探讨Redis中的一些常见缓存问题,并提供解决方案。 缓存穿透指的是当一个请求尝试访问一个不存在于缓存中的

    2024年02月03日
    浏览(94)
  • 互联网中的商品超卖问题及其解决方案:Java中Redis结合UUID的应用

    在设计商品下单和库存扣减,你一定遇到过这样的问题,库存扣减为0了,可是消费者还能下单,并将订单信息保存到了数据库里,针对商品超卖问题,作此篇以解决。 随着互联网商业的飞速发展,商品超卖问题逐渐凸显为电商平台面临的一大挑战。尤其是在大型促销活动期

    2024年02月04日
    浏览(40)
  • 【华为云】基于华为云欧拉操作系统(HCE OS)容器化部署传统应用(Redis+Postgresql+Git+SpringBoot+Nginx)

    博文内容为 华为云欧拉操作系统入门级开发者认证(HCCDA – Huawei Cloud EulerOS) 实验笔记整理 认证地址:https://edu.huaweicloud.com/certificationindex/developer/9bf91efb086a448ab4331a2f53a4d3a1 博文内容涉及一个传统 Springboot 应用HCE部署, 以及相关数据库 Redis、Postgresql、Nginx 的容器化部署 理解不

    2024年02月22日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包