一、Redis是什么?

1 redis的由来:

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

2 简单介绍:

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

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

3 redis解决的问题:

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工程项目。这里以简单的用户数据为例;

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

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
<!--        lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--       mybatis和mysql驱动--><!--        mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.springboot.version}</version></dependency><!--        mysqsl--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!--        分页--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.3</version></dependency><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.3.1</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency><dependency><groupId>net.minidev</groupId><artifactId>json-smart</artifactId></dependency>
<!--        redis--><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);
}

数据库内容

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 {@Beanpublic 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 {@ResourceUserMapper userMapper;@ResourceResult result;@ResourceRedisTemplate redisTemplate;//logger用于输出记录private static org.slf4j.Logger logger = (Logger) LoggerFactory.getLogger(UserServiceImpl.class.getName());@Overridepublic 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){//有则redisuserList = tmpUserList;count= tmpCount;logger.info("当前使用redis:获取User信息");}else {//否则数据库//获取userList= userMapper.find(user);count=userMapper.getCount(user);//存入redisvalueOperations.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缓存,去数据库取数据

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

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

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

这样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 数据类型 | 菜鸟教程

Redis五种基本数据类型_NeverOW的博客-CSDN博客_redis的五种数据类型

Redis在SpringBoot中的简单应用相关推荐

  1. 如何在springboot中实现简单的草稿箱

    如何在springboot中实现简单的草稿箱 建表 sql语句 相关代码 建表 我们只需要给表加一个状态的字段来进行判断他是不是草稿即可 例如 CREATE TABLE `recipe` (`id` ...

  2. 三、Redis在SpringBoot中使用案例

    文章目录 前言 项目结构以及相关配置 创建Dao层 创建Service层 Controller层 测试 Session共享 增加依赖 增加SpringSession 类 测试场景1 番外 前言 最初的 ...

  3. SpringBoot中实现简单策略模式

    策略模式(Strategy Pattern):一个类的行为或其算法可以在运行时更改,策略模式属于行为型模式. 策略模式简单Java实现: https://www.runoob.com/design-p ...

  4. redis基本操作和在springboot中的使用

    本文介绍redis的使用 redis启动步骤 说明 redis自增自减相关操作 redis string set操作 get操作 其他操作 redis hash set操作 get操作 其他操作 re ...

  5. java分布式会话redis_详解springboot中redis的使用和分布式session共享问题

    对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载均衡算法,由于Nginx对不同的请求分发到某一个Tomcat,Tomca ...

  6. SpringBoot中使用redis事务

    本文基于SpringBoot 2.X 事务在关系型数据库的开发中经常用到,其实非关系型数据库,比如redis也有对事务的支持,本文主要探讨在SpringBoot中如何使用redis事务. 事务的相关介 ...

  7. redis:01入门指南以及在springboot中使用redis

    https://redis.io/download step1:参考官网的安装很简单 wget http://download.redis.io/releases/redis-5.0.6.tar.gz ...

  8. 你知道如何在springboot中使用redis吗

    特别说明:本文针对的是新版 spring boot 2.1.3,其 spring data 依赖为 spring-boot-starter-data-redis,且其默认连接池为 lettuce ​  ...

  9. Redis在SSM项目中的简单使用

    Redis在SSM项目中的简单使用 一.基于SSM的Redis环境配置 前提是你的开发电脑安装和配置好了redis,如果没安装请看Window配置Redis环境和简单使用 1.1.pom文件中引入re ...

最新文章

  1. Python正则表达式,简单20个用例学习
  2. java 连接kafka超时_java – Kafka KStreams – 处理超时
  3. 物联网中的无线通信模块到底是什么
  4. springboot创建子模块时遇到子模块覆盖父模块问题解决
  5. python微信推送消息_Python编程之微信推送模板消息功能示例
  6. C#仿QQ皮肤系列之-引言
  7. go json部分解析_Go语言爱好者周刊:第 60 期 — 今天这题你做对了吗?
  8. 【Kafka】Confluent Schema Registry
  9. [Ext JS 4] 实战之Grid, Tree Gird 添加按钮列
  10. sql full left right inner cross 基础
  11. Android内核开发:系统分区与镜像文件的烧写
  12. linq判断集合中相同元素个数_使用Linq获取集合的最后N个元素?
  13. HTML+JS调用摄像头拍照并上传图片
  14. 如何在Excel表数据中快速创建新增脚本语句(核心:字符串拼接)
  15. python移动文件到新的文件夹并重命名
  16. 工作中使用到的单词(软件开发)_2022-06-01备份
  17. 视频教程-微信公众号编辑器开发-微信公众号开发11-微信开发php-微信开发
  18. 《CSAPP》(第3版)答案(第四章)
  19. image失败 安装scikit_安装SciKitImage错误127
  20. CITA环境搭建与运行

热门文章

  1. 12 | 存储优化(上):常见的数据存储方法有哪些?
  2. c 语言%6d和%-6d,佳能6D2与6D详细对比:并没有什么不同?
  3. Python-实现简单的Excel统计函数
  4. matlab技巧操作之颜色阈值
  5. 厉害了,现在用模拟器在电脑上玩刺激战场国际服可以匹配手机了?
  6. 又一家国产芯片企业将量产5G芯片,5G手机可望王者归来
  7. 最容易受到攻击者攻击的6个IT资产
  8. 【错误】 y1重定义,以前的定义是“函数”
  9. 重要公告|社区批准第一批最新生态系统Grants
  10. VC++获取Windows操作系统的语言版本(附源码)