首页 > 数据库 >【Redis】快速入门 数据类型 常用指令 在Java中操作Redis

【Redis】快速入门 数据类型 常用指令 在Java中操作Redis

时间:2024-04-01 10:31:36浏览次数:27  
标签:Java redis 数据类型 key 集合 操作 Redis redisTemplate

文章目录


一、简介

Redis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件

官网: https://redis.io
中文网: https://www.redis.net.cn/

二、特点

主要特点:

  • 基于内存存储,读写性能高
  • 适合存储热点数据(热点商品、资讯、新闻)
  • 企业应用广泛

Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。它存储的value类型比较丰富,也被称为结构化的NoSql数据库。

NoSql(Not Only SQL),不仅仅是SQL,泛指非关系型数据库。NoSql数据库并不是要取代关系型数据库,而是关系型数据库的补充。

关系型数据库(RDBMS):

  • Mysql
  • Oracle
  • DB2
  • SQLServer

非关系型数据库(NoSql):

  • Redis
  • Mongo db
  • MemCached

三、下载与安装

下载:
Redis安装包分为windows版和Linux版:

安装 :
PC 直接 解压缩,解压后目录结构:
1

四、使用

4.1 服务器启动

tab补全即可:

redis-server.exe redis.windows.conf

Redis服务默认端口号为 6379 ,通过快捷键Ctrl + C 即可停止Redis服务

当Redis服务启动成功后,可通过客户端进行连接。

4.2 客户端连接命令

redis-cli.exe

通过redis-cli.exe命令默认连接的是本地的redis服务,并且使用默认6379端口。也可以通过指定如下参数连接:

  • -h ip地址
  • -p 端口号
  • -a 密码(如果需要)

4.3 修改Redis配置文件

设置Redis服务密码,修改redis.windows.conf

文件查找:password

requirepass 123456

注意:

  • 修改密码后需要重启Redis服务才能生效
  • Redis配置文件中 # 表示注释

重启Redis后,再次连接Redis时,需加上密码,否则连接失败。

redis-cli.exe -h localhost -p 6379 -a 123456

此时,-h 和 -p 参数可省略不写。

4.4 客户端图形化界面

启动服务器后,直接使用客户端的图形化工具。
1
连接成功!
1

五、数据类型

5.1 五种常用数据类型介绍

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

  • 字符串 string
  • 哈希 hash
  • 列表 list
  • 集合 set
  • 有序集合 sorted set / zset

5.2 各种数据类型特点

1
解释说明:

  • 字符串(string):普通字符串,Redis中最简单的数据类型
  • 哈希(hash):也叫散列,类似于Java中的HashMap结构
  • 列表(list):按照插入顺序排序,可以有重复元素,类似于Java中的LinkedList
  • 集合(set):无序集合,没有重复元素,类似于Java中的HashSet
  • 有序集合(sorted set/zset):集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素

六、常用命令

6.1 字符串操作命令

Redis 中字符串类型常用命令:

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

更多命令-参考官网

6.2 哈希操作命令

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

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

1
1

6.3 列表操作命令

Redis 列表是简单的字符串列表,按照插入顺序排序,常用命令:

  • LPUSH key value1 [value2] 将一个或多个值插入到列表头部
  • LRANGE key start stop 获取列表指定范围内的元素
    • lrange mylist 0 -1 将列表数据全打印
  • RPOP key 移除并获取列表最后一个元素
    • 类似队列的POP,最先插入的在最前面,先取出
  • LLEN key 获取列表长度
  • BRPOP key1 [key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超 时或发现可弹出元素为止

1
队列结构 push pop
1

6.4 集合操作命令

  • Redis set 是string类型的无序集合
  • 集合成员是唯一的,这就意味着集合中不能出现重复的数据

常用命令:

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

1
1

6.5 有序集合操作命令

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

常用命令:

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

在这里插入图片描述
1

6.6 通用命令

Redis的通用命令是不分数据类型的,都可以使用的命令:

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

七、在Java中操作Redis

7.1 Redis的Java客户端

使用Redis的Java客户端,如同我们使用JDBC操作MySQL数据库一样。

Redis 的 Java 客户端很多,常用的几种:

  • Jedis
  • Lettuce
  • Spring Data Redis

Spring 对 Redis 客户端进行了整合,提供了 Spring Data Redis,在Spring Boot项目中还提供了对应的Starter,即 spring-boot-starter-data-redis

7.2 Spring Data Redis使用方式

Spring-Data-Redis-官方文档

7.2.1 介绍

Spring Boot提供了对应的Starter,maven坐标:

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

Spring Data Redis中提供了一个高度封装的类:RedisTemplate,对相关api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:

  • ValueOperations:string数据操作
  • SetOperations:set类型数据操作
  • ZSetOperations:zset类型数据操作
  • HashOperations:hash类型的数据操作
  • ListOperations:list类型的数据操作

7.2.2 环境搭建

  1. 导入Spring Data Redis的maven坐标:
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 配置Redis数据源
    在application-dev.yml中添加:
sky:
  redis:
    host: localhost
    port: 6379
    password: 123456
    database: 10

解释说明:

  • database:指定使用Redis的哪个数据库,
  • Redis服务启动后默认有16个数据库,编号分别是从0到15。
  • 1
  • 可以通过修改Redis配置文件来指定数据库的数量。
  • 不同数据库的数据是完全隔离的

application.yml中添加读取application-dev.yml中的相关Redis配置:

spring:
  profiles:
    active: dev
  redis:
    host: ${sky.redis.host}
    port: ${sky.redis.port}
    password: ${sky.redis.password}
    database: ${sky.redis.database}
  1. 编写配置类,创建RedisTemplate对象
@Configuration
@Slf4j
public class RedisConfiguration {
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        log.info("开始创建redis模板工厂....");
        RedisTemplate redisTemplate = new RedisTemplate();
        // 设置redis的连接工厂对象
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 设置redis key 的序列化器
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

解释说明:

  • 当前配置类不是必须的,因为 Spring Boot 框架会自动装配 RedisTemplate 对象,
  • 但是默认的key序列化器JdkSerializationRedisSerializer,导致我们存到Redis中后的数据和原始数据有差别,
  • 故设置为StringRedisSerializer序列化器。
  1. 通过RedisTemplate对象操作Redis
@SpringBootTest(classes = SkyApplication.class)
public class SpringDataRedisTest {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void testRedisTemplate(){
        System.out.println(redisTemplate);

        //string数据操作
        ValueOperations valueOperations = redisTemplate.opsForValue();
        //hash类型的数据操作
        HashOperations hashOperations = redisTemplate.opsForHash();
        //list类型的数据操作
        ListOperations listOperations = redisTemplate.opsForList();
        //set类型数据操作
        SetOperations setOperations = redisTemplate.opsForSet();
        //zset类型数据操作
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
    }
}

1
说明RedisTemplate对象注入成功,并且通过该RedisTemplate对象获取操作5种数据类型相关对象。

7.2.3 操作常见类型数据

1

1. 操作字符串类型数据

1

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

        hashOperations.put("100","name","doug");
        hashOperations.put("100","age","25");

        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");
    }

1

3. 操作列表类型数据
    /**
     * 操作列表类型的数据
     */
    @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);
    }

在这里插入图片描述

4. 操作集合类型数据
    /**
     * 操作集合类型的数据
     */
    @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 set1 = setOperations.members("set1");
        System.out.println("set1 = " + set1);

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

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

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

        setOperations.remove("set1","a","b");
    }

1
1

5. 操作有序集合类型数据
    /**
     * 操作有序集合类型的数据
     */
    @Test
    public void testZSet() {
        //zadd zrange zincrby zrem
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
        zSetOperations.add("zset1","a",11.1);
        zSetOperations.add("zset1","b",22.2);
        zSetOperations.add("zset1","c",44.4);

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

        zSetOperations.incrementScore("zset1","c",33.3);//给c增加33.3

        zSetOperations.remove("zset1","a","b");
    }

1
在这里插入图片描述

6. 通用命令操作
    /**
     * 通用命令操作
     */
    @Test
    public void testCommon() {
        //keys exists type del
        Set keys = redisTemplate.keys("*");
        System.out.println("keys = " + keys);

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

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

        redisTemplate.delete("mylist");
    }

1

标签:Java,redis,数据类型,key,集合,操作,Redis,redisTemplate
From: https://blog.csdn.net/GavinGroves/article/details/137072632

相关文章

  • 这 Java 程序员简历一看就是包装的。。
    大家好,我是R哥。最近做Java面试辅导,看了许多小伙伴的简历,有的人的简历一看就知道是包装的,比如这位,他自己都承认了:包装过的简历,作为多年面试官,我一眼就能看出来,相信其他面试官也会有同样的感觉,这也是为什么很多人的简历都是已读不回的状态。下面我简单说说包装的简历的特点。......
  • android :java 计算器xml文件
     这个代码显示异常<?xmlversion="1.0"encoding="utf-8"?><GridLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="matc......
  • Java基础-JDK,JRE,JVM面试题
    目录1、JDK2、JRE3、JVM(1)JVM的跨语言特性(2)垃圾回收机制(GC)(3)内存溢出(OOM)(4)内存泄漏(5)内存溢出与内存泄漏的关系1、JDKJavaDevelopmentKit,Java开发工具包,包含JRE、开发工具(javac编译、java运行、jdb调试、jar打包);2、JREJavaRuntimeEnvironment,Java运行时环境,包含JV......
  • 如在 Java 中分割 Excel 工作表
    前言在Excel中创建的大多数商业报告不是单页的文档,而是包含了多个上下文相关的信息,这些信息被存储在多个工作表中。例如我们的一些地区销售报告、按部门分类的员工记录、每家店铺的库存清单等。然而,随着Excel文件中工作表数量的增加,要在单一文档内导航和管理数据会变得十分具有......
  • 从 Redis 开源协议变更到 ES 国产化:一次技术自主的机遇
    引言近日,RedisLabs宣布其主导的开源项目Redis将采用双重源代码可用许可证(RSALv2)和服务器端公共许可证(SSPLv1)。这一重大决策标志着Redis从传统的BSD许可证向更加严格的控制权转变,同时也引发了广泛的社区和行业讨论。这不仅是一个关于许可证变更的故事,更是关于开源社区如何......
  • 学习java第二十九天
    如何通过注解配置文件?@Configuration 用于指定当前类是一个spring配置类,当创建容器时会从该类上加载注解,value属性用于指定配置类的字节码。@ComponentScan 用于指定Spring在初始化容器时要扫描的包。basePackages属性用于指定要扫描的包。@PropertySource 用于加......
  • 【粉丝福利社】《Effective Java》(文末送书-进行中)
    ......
  • Java实现ATM机模拟系统(week1)
    目录目的项目规划(第一周)ATM机系统第一周需求分析账户管理大类Account(账户)类AccountOperations(对账户操作)接口创建账户账户内容管理账户权限管理User类UserOperations(用户操作)接口Operations类货币大类基本属性方法操作界面合作开发(利用git)后言 ......
  • Redission分布式锁介绍和配置引入
        本人在实际项目用于确保Key一致性经常使用的一种加锁方式,帮助分布式环境中互斥访问。很多人问不用锁不是一样完成目标吗?但需要清楚的是这是在高并发的场景下,多节点同时访问缓存的场景,是一般单体项目所无法比拟的,使用锁方式可以控制并发访问,避免缓存击穿和雪崩等问......
  • Redis持久化:RDB与AOF
    redis将数据以键值对的形式存储在内存之中,而内存中的数据会掉电丢失,因此仅仅是把数据存储在内存是无法做到数据持久化的,因此还需要把数据转移到硬盘中去。Redis数据持久化有两只方式:定期备份RDB、实时备份AOF。RDB(RedisDataBase):数据备份存储的位置:(我们可以从redis.conf配置......