什么是redis? 如何在SpringBoot中集成和操作redis?

138705169c911b81ab11e4f09c65a2e6.gif

喜欢就点击上方关注我们吧!

de43a0e529df0171c731b8020b41891b.png

本篇将带你快速了解什么是redis,以及学会如何在SpringBoot工程下集成和操作redis数据库。

be672f1ea0c06ee7e2689001fa617132.jpeg

一、概述

1、定义

Redis是一个基于内存key-value 结构数据库。

1)特点:

1、基于内存存储,读写性能高

2、适合存储热点数据(热点商品、资讯、新闻)企业应用广泛,适用于各种如商品/优惠券的抢购和秒杀场景

注:所谓热点数据,即在某一个特定的时间点,会有大量的用户去访问。如双十一购物秒杀

2)官网: https://redis.io

2、对比

Redis和MySQL都是数据库,用于存储数据。简单说一下二者的不同?

1、存储位置:MySQL存储在磁盘里,Redis存储在内存里。

2、存储结构:Redis是key-value(键值对)结构,而MySQL则是通过二维表的方式存储数据

注:项目中通常是Redis和MySQL结合使用的,绝大部分的业务数据会存储在MySQL数据库中,而一些访问量较大的热点数据会存储在Redis中,以提高读写性能。

3、下载安装

Redis安装包分为 Windows 版和Linux版,下载地址如下

Windows版: https://github.com/microsoftarchive/redis/releases

Linux版: https://download.redis.io/releases/

下载好压缩包后,将其放在一个不含中文和空格的路径下,选择右键解压即可。

注:Redis的Windows版属于绿色软件,直接解压即可使用

解压后目录结构如下:

d3e64eb3d0d05511e3cfea50bbf0c34a.png

4、启动Redis

1)启动服务

在安装路径的地址栏上输入cmd,回车,进入该路径下的命令提示符。输入 redis-ser + Tab,补全后输入空格,再输入redis.wind + Tab(即配置文件名称),自动补全后按回车,出现如下即启动成功

fdc6aba5e584180c542d732ce2d2dec1.png

注:若想要停止服务,直接按 ctrl+c即可

2)通过客户端连接Redis服务

不要叉掉或停止刚刚启动的服务,同样在安装路径的地址栏上输入cmd,回车,输入 redis-cli + Tab,补全后回车,即连接到了我们的Redis服务,如下,可以输入几个命令演示一下效果。

e67ab39cd0d03f9f7cb1474ef87e784c.png

注:输入 exit退出客户端

3)修改配置文件

由于Redis配置文件中默认是没有配置密码的,即客户端可以不用输入密码就能连接上,但是这种设定是不安全的,为此可以自己手动去配置密码。

exit退出客户端,再按 ctrl+c停止redis服务,然后去修改配置文件。

使用 VSCode打开 redis.windows.conf配置文件,ctrl+F查找,输入pass+空格,定位到443行,去掉注释并设置自己的密码(如我的是123456)。配置完成后 ctrl+s保存退出即可。

5c75ca44e57d5fa41d74ec4274828b37.png

再次启动redis服务和连接客户端验证,如下,在设置了密码后需要追加密码才能正常访问。

d5b8c0e005fd3a406cc6158572382a89.png

5、使用Redis图形化界面连接

如Redis 可视化管理工具:Another Redis Desktop Manager

官方对它的描述:更快、更好、更稳定的Redis桌面(GUI)管理客户端,兼容Windows、Mac、Linux,性能出众,支持哨兵, 集群, ssh通道, ssl认证, stream, 树状视图, 命令行, 以及暗黑模式; 多种格式化方式, 甚至能够自定义格式化脚本, 满足你的一切需求。

官网:https://goanother.com/cn/

傻瓜式下载后直接使用即可。新建一个连接,如下

94689cf99725004546f59795f53806de.png

连接成功如下图

de532e4391cfc785e1264a528a64fb77.jpeg

设置暗黑模式及选择语言(根据个人需求)

6c221a29140985a04d53d18696631744.png

注:无论使用哪种连接方式,连接前都要先启动 Redis服务

二、数据类型

1、5种常用数据类型

Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型

34207a037448d7b48c844c81fd57cb6b.png

1)字符串(string)

普通字符串,Redis中最简单的数据类型

2)哈希(hash)

也叫散列,类似于Java中的HashMap结构

3)列表(list)

按照插入顺序排序,可以有重复元素,类似于Java的LinkedList

4)集合(set)

无序集合,没有重复元素,类似于Java中的HashSet

5)有序集合(sorted set / zset)

集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素

三、常用命令

按照类型,可分为以下5种操作命令

1、字符串操作命令

命令说明
SET key value设置指定key的值
GET key获取指定key的值
SETEX key seconds value设置指定key的值,并将key 的过期时间设为seconds秒
SETNX key value只有在key不存在时设置key 的值

78db52000a44327281160c6f6b2b86d8.jpeg

2、哈希操作命令

Redis hash是一个string类型的field和value 的映射表,hash特别适合用于存储对象

3895cb7a1672fc72a21a97977d1f390d.jpeg

常用命令:

命令说明
HSET key field value将哈希表key 中的字段field的值设为value
HGET key field获取存储在哈希表中指定字段的值
HDEL key field删除存储在哈希表中的指定字段
HKEYS key获取哈希表中所有字段
HVALS key获取哈希表中所有值

3、列表操作命令

Redis列表是简单的字符串列表,按照插入顺序排序

b6ea07ec27b6c2e78e0bb51549325c5a.jpeg

常用命令:

命令说明
LPUSH key value1 [value2]将一个或多个值插入到列表头部
LRANGE key start stop获取列表指定范围内的元素
RPOP key移除并获取列表最后一个元素
LLEN key获取列表长度

45622ae49cbf216c4511f99d941d9b6d.png

4e24dc54260d9d967cbc1c8af556e06e.jpeg

4、集合操作命令

Redis set 是string类型的无序集合。集合成员是唯一的,集合中没有重复的数据。

ed30031ee0924e1fef1a92802576f234.jpeg

常用命令:

命令说明
SADD key member1 [member2]向集合添加一个或多个成员
SMEMBERS key返回集合中的所有成员
SCARD key获取集合的成员数
SINTER key1 [key2]返回给定所有集合的交集
SUNION key1 [key2]返回所有给定集合的并集
SREM key member1 [member2]删除集合中一个或多个成员

具体操作示例如下

783d74fd26dc57ddc9a561ef47bf7cdc.png

5、有序集合操作命令

Redis有序集合是string类型元素的集合,且不允许有重复成员每个元素都会关联一个double类型的分数

a19fcab5a5c8dcfed3a568b932c27870.jpeg

常用命令:

命令说明
ZADD key score1 member1 [score2 member2]向有序集合添加一个或多个成员
ZRANGE key start stop [WITHSCORES]通过索引区间返回有序集合中指定区间内的成员
ZINCRBY key increment member有序集合中对指定成员的分数加上增量increment
ZREM key member [member ...]移除有序集合中的一个或多个成员

具体操作示例如下

8f2fe534801bdadebd308ec71dd2188f.png

6、通用命令

所谓通用命令,是指不分数据类型都能使用的命令

命令说明
KEYS pattern查找所有符合给定模式( pattern)的 key
EXISTS key检查给定key是否存在
TYPE key返回key 所储存的值的类型
DEL key用于在key存在时删除key

具体操作示例如下

53af81db150accb4775cec615ef2eef9.png

四、Java中操作Redis

1、Redis的Java客户端

1)常用的Java客户端如下

1、Jedis

2、Lettuce

3、Spring Data Redis

这里重点来说一下Spring Data Redis,Spring Data Redis是spring的一部分,对 Redis底层开发包进行了高度封装。

在Spring项目中,可以使用Spring Data Redis来简化操作。

2、Java中操作Redis

2.1 Spring Data Redis环境搭建

操作步骤:

1)导入Spring Data Redis的maven坐标

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

2)配置Redis数据源

在application.yml中添加如下代码

ad277d735b01e72d8f4da60d8070ff61.png

再在application-dev.yml添加如下代码(注意要填写自己的),用于application.yml来读取

f69dac25403b51d2df2aefc14c14eeec.png

3)编写配置类,创建RedisTemplate对象

package com.sky.config;

import lombok.extern.slf4j.Slf4j;
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.StringRedisSerializer;

@Configuration
@Slf4j
public class RedisConfigurartion {
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
        RedisTemplate redisTemplate = new RedisTemplate();
        // 设置redis的连接工厂对象
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //设置redis key的序列化器
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}
2.2 通过RedisTemplate对象操作Redis

操作字符串类型、哈希类型、列表类型、集合类型的数据,代码示例如下。因为使用的是单元测试,所以需要测试哪种类型的,只需单独测试对应的方法即可。

package com.sky.test;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.*;

import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@SpringBootTest
public class SpringDataRedisTest {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 操作字符串类型的数据
     */
    @Test
    public void testString(){
        // set get setex setnx
        redisTemplate.opsForValue().set("name","小明");
        String city = (String) redisTemplate.opsForValue().get("name");
        System.out.println(city);
        redisTemplate.opsForValue().set("code","1234",3, TimeUnit.MINUTES);
        redisTemplate.opsForValue().setIfAbsent("lock","1");
        redisTemplate.opsForValue().setIfAbsent("lock","2");
    }
    /**
     * 操作哈希类型的数据
     */
    @Test
    public void testHash(){
        //hset hget hdel hkeys hvals
        HashOperations hashOperations = redisTemplate.opsForHash();

        hashOperations.put("100","name","tom");
        hashOperations.put("100","age","20");

        String name = (String) hashOperations.get("100", "name");
        System.out.println(name);

        Set keys = hashOperations.keys("100");
        System.out.println(keys);

        List values = hashOperations.values("100");
        System.out.println(values);

        hashOperations.delete("100","age");
    }
    /**
     * 操作列表类型的数据
     */
    @Test
    public void testList(){
        //lpush lrange rpop llen
        ListOperations listOperations = redisTemplate.opsForList();

        listOperations.leftPushAll("mylist","a","b","c");
        listOperations.leftPush("mylist","d");

        List mylist = listOperations.range("mylist", 0, -1);
        System.out.println(mylist);

        listOperations.rightPop("mylist");

        Long size = listOperations.size("mylist");
        System.out.println(size);
    }
    /**
     * 操作集合类型的数据
     */
    @Test
    public void testSet(){
        //sadd smembers scard sinter sunion srem
        SetOperations setOperations = redisTemplate.opsForSet();

        setOperations.add("set1","a","b","c","d");
        setOperations.add("set2","a","b","x","y");

        Set members = setOperations.members("set1");
        System.out.println(members);

        Long size = setOperations.size("set1");
        System.out.println(size);

        Set intersect = setOperations.intersect("set1", "set2");
        System.out.println(intersect);

        Set union = setOperations.union("set1", "set2");
        System.out.println(union);

        setOperations.remove("set1","a","b");
    }
    /**
     * 操作有序集合类型的数据
     */
    @Test
    public void testZset(){
        //zadd zrange zincrby zrem
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();

        zSetOperations.add("zset1","a",10);
        zSetOperations.add("zset1","b",12);
        zSetOperations.add("zset1","c",9);

        Set zset1 = zSetOperations.range("zset1", 0, -1);
        System.out.println(zset1);

        zSetOperations.incrementScore("zset1","c",10);

        zSetOperations.remove("zset1","a","b");
    }
    /**
     * 通用命令操作
     */
    @Test
    public void testCommon(){
        //keys exists type del
        Set keys = redisTemplate.keys("*");
        System.out.println(keys);

        Boolean name = redisTemplate.hasKey("name");
        Boolean set1 = redisTemplate.hasKey("set1");

        for (Object key : keys) {
            DataType type = redisTemplate.type(key);
            System.out.println(type.name());
        }
        redisTemplate.delete("mylist");
    }
}

504a5e43c0b055cb8c78f0e99d37088d.png

2d54521ca810d45e98488ef1ce00bdc1.gif

喜欢就点击上方关注我们吧!

7e62ee928c49b85a63b21bacef77041f.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/531658.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker pull镜像的时候指定arm平台

指定arm平台 x86平台下载arm平台的镜像包 以mysql镜像为例 docker pull --platform linux/arm64 mysqldocker images查看镜像信息 要查看Docker镜像的信息&#xff0c;可以使用docker inspect命令。这个命令会返回镜像的详细信息&#xff0c;包括其元数据和配置。 docker i…

Canvas拖动图片效果

效果预览 代码 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>mouse event</title></head><body><div><canvasid"cs"width"800"height"400"style"bord…

doss攻击为什么是无解的?

这个让Google、亚马逊等实力巨头公司也无法避免的攻击。可以这么说&#xff0c;是目前最强大、最难防御的攻击之一&#xff0c;属于世界级难题&#xff0c;并且没有解决办法。 Doss攻击的原理不复杂&#xff0c;就是利用大量肉鸡仿照真实用户行为&#xff0c;使目标服务器资源…

CSS导读 (复合选择器 下)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 2.5 伪类选择器 2.6 链接伪类选择器 2.6.1 链接伪类注意事项 2.6.2 链接伪类选择器实际开发中的写法 2.7 …

每日一题 第八十九期 洛谷 [NOIP2017 提高组] 奶酪

[NOIP2017 提高组] 奶酪 题目背景 NOIP2017 提高组 D2T1 题目描述 现有一块大奶酪&#xff0c;它的高度为 h h h&#xff0c;它的长度和宽度我们可以认为是无限大的&#xff0c;奶酪中间有许多半径相同的球形空洞。我们可以在这块奶酪中建立空间坐标系&#xff0c;在坐标系…

Redis-缓存击穿-逻辑过期

Redis-缓存击穿-逻辑过期实现 缓存击穿&#xff1a;也称热点key问题&#xff0c;大量访问一个key&#xff0c;而这个key恰巧到期了&#xff0c;导致大量的请求访问数据库。增大数据库的负担。为了解决这个问题可以采用互斥锁或逻辑过期的方式解决。本章采用逻辑过期的方式解决…

Golang笔记(下)

Golang学习笔记&#xff08;下&#xff09; 前篇&#xff1a;Golang学习笔记(上) 十四、错误处理 14.1使用error类型 func New(text string) error例子&#xff1a; package mainimport ("errors" // 导入errors包"fmt" )func main() {var number, divi…

【数据结构】树与二叉树遍历算法的应用(求叶子节点个数、求树高、复制二叉树、创建二叉树、二叉树存放表达式、交换二叉树每个结点的左右孩子)

目录 求叶子节点个数、求树高、复制二叉树、创建二叉树、二叉树存放表达式、交换二叉树每个结点的左右孩子应用一&#xff1a;统计二叉树中叶子结点个数的算法写法一&#xff1a;使用静态变量写法二&#xff1a;传入 count 作为参数写法三&#xff1a;不使用额外变量 应用二&am…

【Linux】socket编程2

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 目录 &#x1f449;&#x1f3fb;客户端代码Makefile(生成目标文件)UdpClient.cc(客户端代码)服务端代码部分优化1&#xff08;接受客户端时显示客…

基于51单片机低中高音7键电子琴音乐播放器

基于51单片机电子琴音乐播放器 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;PCB&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.可以使用按键切换音乐播放模式和弹奏模式&#xff1b; 2.LED灯显示在使用哪种模式&#xff1b; 3.音乐…

Redis部署之主从

使用两台云服务器&#xff0c;在 Docker 下部署。 Redis版本为&#xff1a;7.2.4 下载并配置redis 配置文件 下载 wget -c http://download.redis.io/redis-stable/redis.conf配置 master节点配置 bind 0.0.0.0 # 使得Redis服务器可以跨网络访问,生产环境请考虑…

第十四届蓝桥杯C/C++大学B组题解(二)

6、岛屿个数 #include <bits/stdc.h> using namespace std; const int M51; int T,m,n; int vis[M][M],used[M][M]; int dx[]{1,-1,0,0,1,1,-1,-1}; int dy[]{0,0,1,-1,1,-1,1,-1}; string mp[M]; struct node{//记录一点坐标 int x,y; }; void bfs_col(int x,int y){ qu…

C++ | Leetcode C++题解之第14题最长公共前缀

题目&#xff1a; 题解&#xff1a; class Solution { public:string longestCommonPrefix(vector<string>& strs) {if (!strs.size()) {return "";}int minLength min_element(strs.begin(), strs.end(), [](const string& s, const string& t)…

同步压缩理论

参考 在频率方向进行能量重新分配&#xff08;分配到中心&#xff09; 时频重排

实验4 DHCP基础配置

实验4 DHCP基础配置 一、 原理描述二、 实验目的三、 实验内容四、 实验配置五、 实验步骤1.基本配置2.配置DHCPServer功能3.配置DHCP Client 一、 原理描述 动态主机配置协议 DHCP是一个局域网的网络协议&#xff0c;使用UDP协议工作&#xff0c;主要有两个用途&#xff1a;用…

大话设计模式——16.命令模式(Command Pattern)

简介 请求以命令的形式包裹在对象中&#xff0c;并传给调用对象。调用对象寻找可以处理该命令的对象进行执行。命令模式是一种特殊的策略模式&#xff0c;体现多个策略执行的问题&#xff0c;而不是选择的问题 UML图 应用场景 界面选择、键盘、按钮、事件操作都类似命令模式 …

前端工程化理解 (2024 面试题)

最好介绍远古世界最好随性一点&#xff0c;不要太刻板 &#xff0c;不然像背书 什么是前端工程化&#xff1f; - 知乎 前端工程化的历史 互联网初期&#xff0c;09 年以前&#xff0c;页面只需要展示一些列表、表格、文章内容以及简单图片即可&#xff0c;其目的是为了传送信…

身份证正面打印、反面打印与打印在同一页

1 打印身份证正面 将身份证正面朝下放置&#xff0c;按打印机键盘上的数字【3】&#xff0c;再按【Start】键&#xff0c;选择A4大小打印&#xff0c;如图(1)所示&#xff1a; 图(1) A4纸复印 2 打印身份证反面 将身份证反面朝下放置&#xff0c;按打印机键盘上的数字【3】&…

KVM 高级功能部署

目录 一、案例分析 1.1、案例概述 1.2、案例前置知识点 1&#xff09;KVM 虚拟机迁移 2&#xff09;KSM 内核同页合并 1.3、案例环境 1&#xff09;本案例环境 2&#xff09;案例需求 3&#xff09;案例实现思路 二、案例实施 2.1、静态迁移 1&#xff09;在…

springboot+vue药店药品进销存采购管理系统0z10z

本系统采用intellij idea支持eclipse 项目架构&#xff1a;B/S架构web 开发语言&#xff1a;java 前端技术&#xff1a;vue.jsElementUi 后端框架&#xff1a;django、mybatis、Springmvc 运行环境&#xff1a;win10/win11、jdk1.8 可行性论证 社会可行性 开发本系统&#xff…