SpringBoot整合Redis
创始人
2024-01-21 10:29:30
0

SpringBoot整合Redis

文章目录

    • SpringBoot整合Redis
      • 一 .简介
        • 1. redie是什么?
        • 2. redie的使用场景?
      • 二 . 使用
        • 1. 引入依赖
        • 2. 配置文件
        • 3. 启动redis
        • 4. 创建Redis工具类
        • 5. 创建测试类
        • 6. 查看效果


一 .简介

1. redie是什么?

Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库。它具备如下的特点:

  • redis 是采用C语言编写的,好处就是底层代码执行效率高,依赖性低,没有太多运行时的依赖,而且系统的兼容性好,稳定性高。
  • redis是基于内存的数据里,可避免磁盘IO,因此也被称作缓存工具。
  • redis采用key-value的方式进行存储,也就是使用hash结构进行操作,数据的操作时间复杂度是O(1)
  • redis采用的是单进程单线程的模型,可以避免上下文切换和线程之间引起的资源竞争。而且Redis还采用了IO多路复用技术,这里的多路复用是指多个socket网络连接,复用是指一个线程中处理多个IO请求,这样可以减少网络IO的消耗,大幅度提升效率

2. redie的使用场景?

  1. 缓存:

毫无疑问这是Redis当今最为人熟知的使用场景。再提升服务器性能方面非常有效;
一些频繁被访问的数据,经常被访问的数据如果放在关系型数据库,每次查询的开销都会很大,而放在redis中, 因为redis是放在内存中的可以很高效的访问。

  1. 排行榜:

在使用传统的关系型数据库(mysql oracle 等)来做这个事儿,非常的麻烦,而利用Redis的SortSet(有序集合)数据结构能够简单的搞定;

  1. 计算器/限速器:

Redis中原子性的自增操作,我们可以统计类似用户点赞数、用户访问数等,这类操作如果用MySQL,频繁的读 写会带来相当大的压力;限速器比较典型的使用场景是限制某个用户访问某个API的频率,常用的有抢购时,防 止用户疯狂点击带来不必要的压力;

  1. 好友关系:

利用集合的一些命令,比如求交集、并集、差集等。可以方便搞定一些共同好友、共同爱好之类的功能。

  1. 简单消息队列:

除了Redis自身的发布/订阅模式,我们也可以利用List来实现一个队列机制,比如:到货通知、邮件发送之类的
需求,不需要高可靠,但是会带来非常大的DB压力,完全可以用List来完成异步解耦;

  1. Session共享

以PHP为例,默认Session是保存在服务器的文件中,如果是集群服务,同一个用户过来可能落在不同机器上,这就会导致用户频繁登陆,采用Redis保存Session后,无论用户落在那台机器上都能够获取到对应的Session信息。

  1. 分布式锁:

分布式场景下,无法使用单机环境下的锁来对多个节点上的进程进行同步。可以使用 Redis 自带的 SETNX 命令实现分布式锁,除此之外,还可以使用官方提供的 RedLock 分布式锁实现。

二 . 使用

虽然redis的功能很多,但大多数下情况下我们只使用它来做缓存。

1. 引入依赖

        org.springframework.bootspring-boot-starter-data-redis2.2.1.RELEASE

2. 配置文件

这里只进行了基础配置,更详细的配置请查看其他相关文档

  redis:host: 127.0.0.1port: 6379timeout: 3000database: 1

3. 启动redis

网上下载redis,安装后点击redis-cli.exe进行启动

在这里插入图片描述
在这里插入图片描述
为了方便查看下效果,我们可以本地安装一个redis图形化工具,推荐使用Another Redis Desktop Manager 下载地址:Another Redis Desktop Manager
在这里插入图片描述

4. 创建Redis工具类

package com.student.studentserver.utils;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;/*** @author gf* @date 2022/11/15*/
@Slf4j
@Component
public class RedisUtil {@Autowiredprivate StringRedisTemplate redisTemplate;private final String DEFAULT_KEY_PREFIX = "";private final int EXPIRE_TIME = 1;private final TimeUnit EXPIRE_TIME_TYPE = TimeUnit.DAYS;/*** 数据缓存至redis** @param key* @param value* @return*/public  void add(K key, V value) {try {if (value != null) {redisTemplate.opsForValue().set(DEFAULT_KEY_PREFIX + key, JSON.toJSONString(value));}} catch (Exception e) {log.error(e.getMessage(), e);throw new RuntimeException("数据缓存至redis失败");}}/*** 数据缓存至redis并设置过期时间** @param key* @param value* @return*/public  void add(K key, V value, long timeout, TimeUnit unit) {try {if (value != null) {redisTemplate.opsForValue().set(DEFAULT_KEY_PREFIX + key, JSON.toJSONString(value), timeout, unit);}} catch (Exception e) {log.error(e.getMessage(), e);throw new RuntimeException("数据缓存至redis失败");}}/*** 写入 hash-set,已经是key-value的键值,不能再写入为hash-set** @param key    must not be {@literal null}.* @param subKey must not be {@literal null}.* @param value  写入的值*/public  void addHashCache(K key, SK subKey, V value) {redisTemplate.opsForHash().put(DEFAULT_KEY_PREFIX + key, subKey, value);}/*** 写入 hash-set,并设置过期时间** @param key    must not be {@literal null}.* @param subKey must not be {@literal null}.* @param value  写入的值*/public  void addHashCache(K key, SK subKey, V value, long timeout, TimeUnit unit) {redisTemplate.opsForHash().put(DEFAULT_KEY_PREFIX + key, subKey, value);redisTemplate.expire(DEFAULT_KEY_PREFIX + key, timeout, unit);}/*** 获取 hash-setvalue** @param key    must not be {@literal null}.* @param subKey must not be {@literal null}.*/public  Object getHashCache(K key, SK subKey) {return  redisTemplate.opsForHash().get(DEFAULT_KEY_PREFIX + key, subKey);}/*** 从redis中获取缓存数据,转成对象** @param key   must not be {@literal null}.* @param clazz 对象类型* @return*/public  V getObject(K key, Class clazz) {String value = this.get(key);V result = null;if (!StringUtils.isEmpty(value)) {result = JSONObject.parseObject(value, clazz);}return result;}/*** 从redis中获取缓存数据,转成list** @param key   must not be {@literal null}.* @param clazz 对象类型* @return*/public  List getList(K key, Class clazz) {String value = this.get(key);List result = Collections.emptyList();if (!StringUtils.isEmpty(value)) {result = JSONArray.parseArray(value, clazz);}return result;}/*** 功能描述:Get the value of {@code key}.** @param key must not be {@literal null}.* @return java.lang.String* @date 2021/9/19**/public  String get(K key) {String value;try {value = redisTemplate.opsForValue().get(DEFAULT_KEY_PREFIX + key);} catch (Exception e) {log.error(e.getMessage(), e);throw new RuntimeException("从redis缓存中获取缓存数据失败");}return value;}/*** 删除key*/public void delete(String key) {redisTemplate.delete(key);}/*** 批量删除key*/public void delete(Collection keys) {redisTemplate.delete(keys);}/*** 序列化key*/public byte[] dump(String key) {return redisTemplate.dump(key);}/*** 是否存在key*/public Boolean hasKey(String key) {return redisTemplate.hasKey(key);}/*** 设置过期时间*/public Boolean expire(String key, long timeout, TimeUnit unit) {return redisTemplate.expire(key, timeout, unit);}/*** 设置过期时间*/public Boolean expireAt(String key, Date date) {return redisTemplate.expireAt(key, date);}/*** 移除 key 的过期时间,key 将持久保持*/public Boolean persist(String key) {return redisTemplate.persist(key);}/*** 返回 key 的剩余的过期时间*/public Long getExpire(String key, TimeUnit unit) {return redisTemplate.getExpire(key, unit);}/*** 返回 key 的剩余的过期时间*/public Long getExpire(String key) {return redisTemplate.getExpire(key);}}

此工具类我们使用的是StringRedisTemplate

5. 创建测试类

创建测试类,我们向redis中添加一个字符串

@RestController
@RequestMapping(path = "/api/v1/student")
public class StudentController {@Autowiredprivate RedisUtil redisUtil;@GetMapping("/redis")public String testRedis() {String notice="疫情又严重了,请大家自觉戴好口罩";redisUtil.add("notice",notice);return notice;}
}

6. 查看效果

在postman或浏览器中请求接口地址,查看redis中的结果
在这里插入图片描述
在这里插入图片描述

从缓存中获取值,redis根据key从缓存中获取值。

    public String testRedis() {String notice1 = redisUtil.get("notice");System.out.println("获取缓存的值:"+notice1);return notice1;}

这样我们就将数据存入到了Redis中,我们还可以设置redis的缓存时间,可以仔细看下RedisUtil中的其他方法,这里不做演示。

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...