当前位置: 首页 > news >正文

Redis基本知识及简单操作

一、Redis简介

1、网站链接:

(1)官网下载

官网: Redis - The Real-time Data Platform
中文网: Redis中文网

(2)网盘下载

Redis安装包及可视化工具

通过网盘分享的文件:Redis

链接: https://pan.baidu.com/s/1FoJtg459RFLBjoPOa1BGgg?pwd=xbkc

提取码: xbkc

2redisiMysql本质区别

redis将数据存储在内存中,数据结构为键值对的形式;

Mysql则是以数据文件的形式存储到磁盘中,数据结构则是二维表

3Redis下载与安装

Redis安装包分为Windows版和 Linux版
 Windows版下载地址: Releases · microsoftarchive/redis · GitHub

 Linux版下载地址: Index of /releases/

4、解压成功后,设置密码

打开文件,ctrl+F键,搜索框输入“pass ”,找到“# requirepass foobared”,删除符号“#”,取消注释,前面也不能有空格,不然就是报错

改为“requirepass 123456”,123456即为密码,可以不用设置!修改后要重启redis才生效

5、数据类型

6、redis常用命令

7、redis图形化工具使用

点击设置(图中蓝色按钮),选择简体中文

点击“新建连接”,任意填写连接名,如“localhost”,若redis设置密码,填写密码,其他可以空不用填

打开localhost数据库旁边的控制台按钮(第二个),进入以下界面,下面的输入框可以输入redis命令,但该工具可直接操作无需命令

二、在Java中操作Redis(记得开启redis)

1、Redis的客户端

spring data Redis直接对jedis和lelttuce进行了封装,所以我们建议学习spring data Redis即可

2、spring data Redis使用方式

代码文件:

(1)导入Maven坐标

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

(2)配置Redis数据源

注意层级关系,Redis要写在spring后面,配置爆红冒号后没打空格

spring:  
  redis:
    host: localhost
    port: 6379
    #redis密码,如果没有则不用设置
#    password: 123456

注意:由于项目在开发,生产,测试的情况下使用的Redis环境可能不一样,所以我们尽量不要将配置项的值写在主配置文件中,我们可以将值写在其他的配置文件中,再主配置文件中通过引用的方式来配置环境

以下是对配置环境进行的改造

2-1、主配置文件:application.yml

spring:
  profiles:
    active: dev
  redis:
    host: ${sky.redis.host}
    port: ${sky.redis.port}
#    password: ${sky.redis.password}
#    database: ${sky.redis.database}

  • spring.profiles.active: dev:这行配置指定了当前激活的Spring配置文件是dev,即开发环境。Spring Boot允许根据不同的环境(如开发、测试、生产)加载不同的配置文件。
  • redis.host: ${sky.redis.host} 和 redis.port: ${sky.redis.port}:这部分配置用于指定Redis服务器的地址和端口。具体来说,${sky.redis.host}和${sky.redis.port}是占位符,它们的值将从其他地方(如系统环境变量、外部配置文件等)注入进来。这使得在不同的环境中可以灵活地更改Redis服务器地址和端口而无需修改代码。

2-2、开发配置环境:application-dev.yml

sky:
  redis:
    host: localhost
    port: 6379
#    password: 123456
#    database: 0

3、创建RedisConfiguration配置类

位置:sky-server/src/main/java/com/sky/config/RedisConfiguration.java

完整代码文件:

package com.sky.config;
 
import lombok.extern.slf4j.Slf4j;
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.StringRedisSerializer;
 
@Configuration
@Slf4j
public class RedisConfiguration {
    @Bean//@Bean的作用是将方法的返回值注入到spring容器中,这里创建了一个RedisTemplate对象
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        log.info("初始化创建Redis模板对象...");
        // 创建RedisTemplate对象
        RedisTemplate redisTemplate = new RedisTemplate();
        // 设置连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 设置key和value的序列化方式,否则会Redis数据库中key和value会出现乱码问题
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

示意图:

4、创建SpringDataRedisTest测试类

注意:

text测试类要创建在src包下,

创建方式:在sky-server项目的src包下,右键“New”|“Directory”|选择text\java“”回车即可

在java包下,New一个java类,名字为com/sky/SpringDataRedisTest

位置:sky-server/src/test/java/com/sky/SpringDataRedisTest.java

完整代码:

package com.sky;
 
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.core.RedisTemplate;
 
@SpringBootTest
public class SpringDataRedisTest {
    //@Autowired的作用是将Spring中配置的RedisTemplate注入到SpringDataRedisTest类中
    //如果爆红,可以检查RedisConfiguration配置类的方法是否没有添加@Bean注解
    @Autowired
    private RedisTemplate redisTemplate;
    @Test
    public void testRedis() {
       //如果控制台输出redisTemplate,说明RedisTemp  late已经注入成功
        System.out.println(redisTemplate);
    }
}

示意图:

5、测试类SpringDataRedisTest完整操作代码

位置:sky-server/src/test/java/com/sky/SpringDataRedisTest.java

代码:

package com.sky;
 
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.Set;
import java.util.concurrent.TimeUnit;
 
@SpringBootTest
public class SpringDataRedisTest {
    //@Autowired的作用是将Spring中配置的RedisTemplate注入到SpringDataRedisTest类中
    //如果爆红,可以检查RedisConfiguration配置类的方法是否没有添加@Bean注解
    @Autowired
    private RedisTemplate redisTemplate;
    @Test
    public void testRedis() {
        //1、验证:
        // 如果控制台输出redisTemplate,说明RedisTemplate已经注入成功
        System.out.println(redisTemplate);
 
        //获取RedisTemplate的其他操作对象
        ValueOperations valueOperations = redisTemplate.opsForValue();
        HashOperations hashOperations = redisTemplate.opsForHash();
        ListOperations listOperations = redisTemplate.opsForList();
        SetOperations setOperations = redisTemplate.opsForSet();
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
 
 
/*
 
        //2、使用RedisTemplate操作Redis数据库
 
        //(1)opsForValue:操作字符串类型
        redisTemplate.opsForValue().set("name", "sky");
        String name = (String) redisTemplate.opsForValue().get("name");
        System.out.println(name);
 
        //(2)opsForHash:操作哈希类型
        redisTemplate.opsForHash().put("hash", "key1", "value1");
        redisTemplate.opsForHash().put("hash", "key3", "value3");
        redisTemplate.opsForHash().put("hash", "key4", "value4");
        String value = (String) redisTemplate.opsForHash().get("hash", "key1");
        System.out.println(value);
 
        //(3)opsForSet:操作集合类型
        redisTemplate.opsForSet().add("set", "value1");
        redisTemplate.opsForSet().add("set", "value2");
        redisTemplate.opsForSet().add("set", "value3");
        long size = redisTemplate.opsForSet().size("set");
        System.out.println(size);
 
        //(4)opsForZSet:操作有序集合类型
        redisTemplate.opsForZSet().add("zset", "value1", 1);
        redisTemplate.opsForZSet().add("zset", "value2", 2);
        redisTemplate.opsForZSet().add("zset", "value3", 3);
        long zsetSize = redisTemplate.opsForZSet().size("zset");
        System.out.println(zsetSize);
 
        //(5)opsForList:操作列表类型
        redisTemplate.opsForList().leftPush("list", "value1");
        redisTemplate.opsForList().leftPush("list", "value2");
        redisTemplate.opsForList().leftPush("list", "value3");
        long listSize = redisTemplate.opsForList().size("list");
        System.out.println(listSize);
*/
 
//        //3、清空Redis数据库
//        redisTemplate.execute((RedisCallback<Object>) connection -> {
//            connection.flushDb();
//            return null;
//        });
 
 
    }
 
    /**
     * 测试String(字符型)类型
     */
    @Test
    public void textString() {
        redisTemplate.opsForValue().set("name","张三");
        String name = (String)redisTemplate.opsForValue().get("name");
        System.out.println(name);
        //设置数据过期时间时间
        redisTemplate.opsForValue().set("code","123456",10,TimeUnit.SECONDS);
        String code = (String)redisTemplate.opsForValue().get("code");
        System.out.println(code);
 
        redisTemplate.opsForValue().setIfAbsent("name1","李四");//如果name1不存在,则设置值
        redisTemplate.opsForValue().setIfAbsent("name1","李五");
        String name1 = (String)redisTemplate.opsForValue().get("name1");
        System.out.println(name1);
    }
 
    /**
     * 测试Hash(哈希)类型
     */
    @Test
    public void testHash() {
        redisTemplate.opsForHash().put("hash","key1","value1");
        String value = (String)redisTemplate.opsForHash().get("hash","key1");
        System.out.println(value);
        //设置倒计时
        redisTemplate.opsForHash().put("hash","key2",10000000000L);
        Long time = (Long)redisTemplate.opsForHash().get("hash","key2");
        System.out.println(time);
    }
 
    /**
     * 测试List(列表)类型
     */
    @Test
    public void testList() {
        ListOperations listoperations = redisTemplate.opsForList();
        //向列表中添加元素
        redisTemplate.opsForList().leftPush("list","1");
        redisTemplate.opsForList().leftPush("list","2","3");
 
        //获取列表长度
        long size = redisTemplate.opsForList().size("list");
        System.out.println(size);
 
        //获取列表元素
        String value1 = (String)redisTemplate.opsForList().index("list",0);
        System.out.println(value1);
 
        //获取列表全部元素
        listoperations.range("list",0,-1);
        //获取列表前2个元素
        listoperations.range("list",0,2 );
 
        //删除列表元素
//        第一个参数 "list":表示要操作的 Redis 列表的键名
//        第二个参数 0:表示删除的方向和数量。0 表示删除列表中所有与第三个参数相等的元素
//        第三个参数 1:表示要删除的元素值
//        当值为正数时,表示从列表的头部(左侧) 向尾部(右侧)
//        查找并删除,且只删除前 N 个匹配的元素(这里 N 就是该参数值 2)
        redisTemplate.opsForList().remove("list",2,1);
        redisTemplate.opsForList().remove("list",0,1);
 
    }
 
    /**
     * 测试Set(集合)类型
     */
    @Test
    public void testSet() {
        SetOperations setOperations = redisTemplate.opsForSet();//获取Set操作对象
        //向集合中添加元素
        redisTemplate.opsForSet().add("set","1");
        redisTemplate.opsForSet().add("set","2","3","4");
 
        //按范围查询集合元素
        String set = setOperations.members("set").toString();
        System.out.println("集合元素:" + set);
 
        //获取集合长度
        long size = redisTemplate.opsForSet().size("set");
        System.out.println(size);
 
        //删除集合元素
        redisTemplate.opsForSet().remove("set","1");
        redisTemplate.opsForSet().remove("set","2","4");
        //获取集合元素
        String set1 = setOperations.members("set").toString();
        System.out.println("删除后的集合元素:" + set1);
    }
 
    /**
     * 测试ZSet(有序集合)类型
     */
    @Test
    public void testZSet() {
        redisTemplate.opsForZSet().add("zset","value1",1);
        redisTemplate.opsForZSet().add("zset","value2",2);
        redisTemplate.opsForZSet().add("zset","value3",3);
        long size = redisTemplate.opsForZSet().size("zset");
        System.out.println(size);
    }
 
    /**
     * 测试通用方法
     */
    @Test
    public void testCommon() {
        ListOperations listOperations = redisTemplate.opsForList();
        listOperations.leftPush("list","1");
        listOperations.leftPush("list","2","3");
        listOperations.leftPush("list","4","5");
 
        Set keys = redisTemplate.keys("*");//获取Redis中所有键
        System.out.println("Redis中所有键:" + keys);
        //获取Redis中键的类型
        for (Object key : keys) {
            System.out.println(key);
            DataType type = redisTemplate.type(key);
            System.out.println(key + "的类型:" + type.name());//打印键的类型
        }
 
        Boolean bool = redisTemplate.hasKey("name");//判断Redis中是否存在指定键
        System.out.println("Redis中是否存在name键:" + bool);
 
        Boolean bool2 = redisTemplate.delete("name");//删除Redis中指定键
        System.out.println("删除name键是否成功:" + bool2);
    }
 
    /**
     * 清空Redis数据库
     */
    @Test
    public void testFlushDB() {
        redisTemplate.execute((RedisCallback<Object>) connection -> {
            connection.flushDb();
            System.out.println("Redis数据库已清空");
            return null;
        });
    }
}


文章转载自:

http://ikCfUjZ8.fLwwf.cn
http://vaVurpzI.fLwwf.cn
http://tI40eNrM.fLwwf.cn
http://wrISgs53.fLwwf.cn
http://Mmgx769i.fLwwf.cn
http://4tBgPAgA.fLwwf.cn
http://PFD91mm0.fLwwf.cn
http://YMFgjOlM.fLwwf.cn
http://MfbnefkR.fLwwf.cn
http://03MWmauB.fLwwf.cn
http://khLXxgs2.fLwwf.cn
http://YmG7LnZw.fLwwf.cn
http://MdE46tLU.fLwwf.cn
http://H37ZjBJ6.fLwwf.cn
http://j7M61zDo.fLwwf.cn
http://zmesRz2K.fLwwf.cn
http://EZPDJnpS.fLwwf.cn
http://oNhtkhEt.fLwwf.cn
http://xrwdVrQL.fLwwf.cn
http://DO23QPeh.fLwwf.cn
http://wUAgflL6.fLwwf.cn
http://EjqynnXh.fLwwf.cn
http://8iMhEahc.fLwwf.cn
http://nACbPZqI.fLwwf.cn
http://LuZG4V4o.fLwwf.cn
http://W5NrGswi.fLwwf.cn
http://rJttqvTS.fLwwf.cn
http://YL3hIhrc.fLwwf.cn
http://OEAhtVbl.fLwwf.cn
http://lEO6XciJ.fLwwf.cn
http://www.dtcms.com/a/370255.html

相关文章:

  • 004-Dephi数据类型
  • PostgreSQL三种关闭方式的区别
  • RabbitMq 初步认识
  • 如何用c++调用大模型——关于使用llama.cpp的lib库的简易教程
  • 力扣29. 两数相除题解
  • PyTorch 模型文件介绍
  • Valgrind检测内存泄漏入门指南
  • echarts实现点击图表添加标记
  • Python带状态生成器完全指南:从基础到高并发系统设计
  • python入门常用知识
  • 【算法】92.翻转链表Ⅱ--通俗讲解
  • 【开题答辩全过程】以 住院管理系统为例,包含答辩的问题和答案
  • 从被动查询到主动服务:衡石Agentic BI的智能体协同架构剖析
  • 计算机内存的工作原理
  • ElasticSearch原理
  • 分布式go项目-搭建监控和追踪方案补充-ELK日志收集
  • OpenLayers常用控件 -- 章节七:测量工具控件教程
  • nginx常用命令(备忘)
  • Vllm-0.10.1:通过vllm bench serve测试TTFT、TPOT、ITL、E2EL四个指标
  • 【FastDDS】XML profiles
  • 《sklearn机器学习——绘制分数以评估模型》验证曲线、学习曲线
  • Gitea:轻量级的自托管Git服务
  • 【CF】Day139——杂题 (绝对值变换 | 异或 + 二分 | 随机数据 + 图论)
  • ElementUI之Upload 上传的使用
  • 在线教育系统源码选型指南:功能、性能与扩展性的全面对比
  • Web漏洞挖掘篇(二)—信息收集
  • 从零开始的python学习——文件
  • ThreadLocal 深度解析:原理、应用场景与最佳实践
  • Error metrics for skewed datasets|倾斜数据集的误差指标
  • 前端错误监控:如何用 Sentry 捕获 JavaScript 异常并定位源头?