Redis基本知识及简单操作

王者杯·14天创作挑战营·第5期 10w+人浏览 626人参与

一、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

创建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;
        });
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值