前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >什么是redis? 如何在SpringBoot中集成和操作redis?

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

作者头像
reload
发布2024-04-10 10:26:58
2330
发布2024-04-10 10:26:58
举报
文章被收录于专栏:Java后端Java后端
本篇将带你快速了解什么是redis,以及学会如何在SpringBoot工程下集成和操作redis数据库。

一、概述

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版属于绿色软件,直接解压即可使用

解压后目录结构如下:

4、启动Redis

1)启动服务

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

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

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

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

注:输入 exit退出客户端

3)修改配置文件

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

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

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

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

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

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

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

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

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

连接成功如下图

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

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

二、数据类型

1、5种常用数据类型

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

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 的值

2、哈希操作命令

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

常用命令:

命令

说明

HSET key field value

将哈希表key 中的字段field的值设为value

HGET key field

获取存储在哈希表中指定字段的值

HDEL key field

删除存储在哈希表中的指定字段

HKEYS key

获取哈希表中所有字段

HVALS key

获取哈希表中所有值

3、列表操作命令

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

常用命令:

命令

说明

LPUSH key value1 [value2]

将一个或多个值插入到列表头部

LRANGE key start stop

获取列表指定范围内的元素

RPOP key

移除并获取列表最后一个元素

LLEN key

获取列表长度

4、集合操作命令

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

常用命令:

命令

说明

SADD key member1 [member2]

向集合添加一个或多个成员

SMEMBERS key

返回集合中的所有成员

SCARD key

获取集合的成员数

SINTER key1 [key2]

返回给定所有集合的交集

SUNION key1 [key2]

返回所有给定集合的并集

SREM key member1 [member2]

删除集合中一个或多个成员

具体操作示例如下

5、有序集合操作命令

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

常用命令:

命令

说明

ZADD key score1 member1 [score2 member2]

向有序集合添加一个或多个成员

ZRANGE key start stop [WITHSCORES]

通过索引区间返回有序集合中指定区间内的成员

ZINCRBY key increment member

有序集合中对指定成员的分数加上增量increment

ZREM key member [member ...]

移除有序集合中的一个或多个成员

具体操作示例如下

6、通用命令

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

命令

说明

KEYS pattern

查找所有符合给定模式( pattern)的 key

EXISTS key

检查给定key是否存在

TYPE key

返回key 所储存的值的类型

DEL key

用于在key存在时删除key

具体操作示例如下

四、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坐标

代码语言:javascript
复制
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

2)配置Redis数据源

在application.yml中添加如下代码

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

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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");
    }
}
本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-04-04,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 码农后端 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、概述
    • 1、定义
      • 2、对比
        • 3、下载安装
          • 4、启动Redis
            • 5、使用Redis图形化界面连接
            • 二、数据类型
              • 1、5种常用数据类型
              • 三、常用命令
                • 1、字符串操作命令
                  • 2、哈希操作命令
                    • 3、列表操作命令
                      • 4、集合操作命令
                        • 5、有序集合操作命令
                          • 6、通用命令
                          • 四、Java中操作Redis
                            • 1、Redis的Java客户端
                              • 2、Java中操作Redis
                                • 2.1 Spring Data Redis环境搭建
                                • 2.2 通过RedisTemplate对象操作Redis
                            相关产品与服务
                            对象存储
                            对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
                            http://www.vxiaotou.com