什么是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

  • 42
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农后端

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值