Redis 数据结构(一)—字符串、哈希表、列表

news2025/2/27 17:27:38

Redis(版本7.0)的数据结构主要包括字符串(String)、哈希表(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)、超日志(HyperLogLog)、位图(Bitmap)、地理坐标(Geo)、流(Stream)。

1 字符串 String

键和值既可以是文字也可以是二进制数据。

赋值与读取

单个:GET、SET、GETSET(获取旧值并用新值替换)

批量操作:MGET、MSET、MSTNX

字符串

字符串的字节长度:STRLEN

获取字符串指定索引范围上的内容:GETRANGE

对字符串的指定索引范围进行设置:SETRANGE

追加新内容到值的末尾:APPEND

数值运算

整数运算(不可用于浮点数运算):INCRBY、INCR、DECRBY、DECR

浮点数(可用于整数运算):INCRBYFLOAT

表 字符串数据结构相关命令

NX (Non-Existing):字段不存在则赋值,否则不操作。

XX(Existing):字段存在则赋值,否则不操作。

图 字符串的索引

1.1 示例

限速器:为了保障系统的安全性和性能,并保证系统的重要资源不会滥用。系统的会对用户的行为做些限制: 例如,在一定时间内,用户只能对某个资源访问5次,否则只能再等待下个时间段来访问。

public class SPeedLimiter {

    private final static Jedis jedis = RedisPool.getRedis();
    private final static String SPEED_LIMIT_KEY = "speed_limit_str::%s";

    public static void execute(String ip) {
        Long count = jedis.incr(String.format(SPEED_LIMIT_KEY, ip));
        if (count > 5) {
            System.out.println("操作满5次,请稍后再操作");
            return;
        }
        System.out.println("操作成功:" + ip);
    }

    public static void main(String[] args) {
        for (int i = 0; i < 6; i++) {
            execute("127.0.0.1");
        }
    }
}

2 散列(哈希表)Hash

Redis的散列表是一种存储键值对的数据结构。类似于Java的HashMap。但是其键和值只能是字符串(或字节)类型,不能嵌套。

赋值与读取

单个:HSET(也可以批量设置)、HSETNX、HGET

批量操作:HMSET、HMGET

数值运算

HINCRBY、HINCRBYFLOAT

散列

字段相关:HSTRLEN(字段值字节长度)、HEXISTS(检查字段是否存在)、HDEL(删除字段)

散列相关:HLEN(字段数量)、HKEYS(获取所有字段)、HVALS(获取所有值)、HGETALL(所有字段和值)

表 散列数据结构相关命令

2.1 与字符串结构对比

字符串

字符串键命令提供的操作比散列键更为丰富;

键过期功能针对的是整个键,用户无法为散列中不同字段设置不同的过期时间。

散列

只需在数据库里创建一个键,就可以把任意多的字段和值聚合在一起;

可以有效地组织起相关的多项数据,让程序产生给更容易操作的数,使得针对数据的批量操作变得更方便。

表 散列与字符串数据结构对比

2.2 示例

短网址生成:遇到很长的网址时,我们会将其转换为相应的短网址,用这个短网址访问的内容和原网址是一样的。

原理:将需要转换的网址与数据库的id相关联,然后把这个id值转换为特定的字符串。这样就使用“ 服务 + /特定字符串”的形式进行访问时,后端根据这个字符串查找原网址,然后跳转至原网址。

public class ShortURLGenerator {

    private final static String SHORT_URL_ID_COUNTER_KEY = "short_url_id_counter";
    private final static String SHORT_URL_HASH_KEY = "short_url_hash";
    private final static String START_URL = "http://localhost:8080/";

    private final static Jedis jedis = RedisPool.getRedis();

    public static String generateShortUrl(String targetUrl) {
        Long id = jedis.incr(SHORT_URL_ID_COUNTER_KEY);
        jedis.hset(SHORT_URL_HASH_KEY,id.toString(),targetUrl);
        return START_URL + id;
    }

    public static String resolutionUrl(String url) {
        if (url == null || !url.startsWith(START_URL)) return null;
        String target = url.substring(START_URL.length());
        return jedis.hget(SHORT_URL_HASH_KEY,target);
    }

    public static void main(String[] args) {
        System.out.println(resolutionUrl("http://localhost:8080/1"));
        System.out.println(resolutionUrl("http://localhost:8080/2"));
        System.out.println(resolutionUrl("http://localhost:8080/3"));

        System.out.println(resolutionUrl("2http://localhost:8080/1"));
    }

}

3 列表List

列表是一种线性的有序结构,可以按照元素被推入列表中的顺序来存储元素。这些元素既可以是文字,也可以是二进制,并且元素可重复。

推入弹出

推入:LPUSH、RPUSH、LPUSHX(只对已存在的列表执行推入操作)、RPUSHX

弹出:LPOP、RPOP

将源列表最右端元素弹出,然后将该元素左推入目标列表:RPOPLPUSH

列表

长度:LLEN

获取单个元素:LINDEX

获取元素列表:LRANGE

覆盖:LSET

插入:LINSERT

修剪:LTRIM

删除:LREM

阻塞

BLPOP、BRPOP、BRPOPLPUSH

表 列表数据结构相关命令

3.1 示例

带有阻塞功能的消息队列:一个线程创建一个简单消息接收者,在没有消息时,这个线程会被阻塞,当消息出现时,该接收者将打印这条消息。

public class BlockMessageQueue {

    private final static String BLOCK_MESSAGE_QUEUE_KEY = "block_message_queue";

    public static void main(String[] args) {
        Runnable run1 = () -> {
            System.out.println("具有阻塞功能的消息队列读取");
            System.out.println(RedisPool.getRedis().brpop(5,BLOCK_MESSAGE_QUEUE_KEY));;
            System.out.println("阻塞功能end");
        };

        Runnable run2 = () -> {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("写入进程2");
            RedisPool.getRedis().lpush(BLOCK_MESSAGE_QUEUE_KEY,"run2");
        };

        Runnable run3 = () -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("写入进程3");
            RedisPool.getRedis().lpush(BLOCK_MESSAGE_QUEUE_KEY,"run3");
        };

        Thread thread1 = new Thread(run1);
        Thread thread2 = new Thread(run2);
        Thread thread3 = new Thread(run3);

        thread1.start();
        thread2.start();
        thread3.start();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2257981.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cisco Packet Tracer | Cisco Packet Tracer - VLAN 实验 - 交换机的 VLAN 划分

关注这个工具的其它相关笔记&#xff1a;Cisco Packet Tracer —— 使用教程合集-CSDN博客 0x01&#xff1a;VLAN 划分 - 单个交换机 0x0101&#xff1a;拓扑搭建流程 从软件底部拖出一台交换机&#xff08;笔者选择的型号是 2960 IOS15&#xff09;&#xff1a; 然后再拖出四…

元宇宙时代的社交平台:Facebook的愿景与实践

随着科技的不断进步&#xff0c;元宇宙&#xff08;Metaverse&#xff09;这一概念逐渐走进了人们的视野。作为全球最大的社交平台之一&#xff0c;Facebook&#xff08;现Meta&#xff09;在这场元宇宙革命中扮演着重要角色。Meta不仅在不断扩展其社交平台的边界&#xff0c;还…

Nignx部署Java服务测试使用的Spring Boot项目Demo

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

计算机网络ENSP课设--三层架构企业网络

本课程设计搭建一个小型互联网&#xff0c;并模拟Internet的典型Web服务过程。通过此次课程设计&#xff0c;可以进一步理解Internet的工作原理和协议过程&#xff0c;并提高综合知识的运用能力和分析能力。具体目标包括&#xff1a; &#xff08;1&#xff09;掌握网络拓扑的…

记一次:使用C#创建一个串口工具

前言&#xff1a;公司的上位机打不开串口&#xff0c;发送的时候设备总是关机&#xff0c;因为和这个同事关系比较好&#xff0c;编写这款软件是用C#编写的&#xff0c;于是乎帮着解决了一下&#xff08;是真解决了&#xff09;&#xff0c;然后整理了一下自己的笔记 一、开发…

SQL 获取今天的当月开始结束范围:

使用 GETDATE() 结合 DATEADD() 和 DATEDIFF() 函数来获取当前月的开始和结束时间范围。以下是实现当前月时间范围查询的 SQL&#xff1a; FDATE > DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) FDATE < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) 1, 0) …

利用Java爬虫MinC根据ID获取商品详情的完整指南

在当今数字化时代&#xff0c;获取商品详情数据对于市场分析、价格监控和竞争对手分析至关重要。Java作为一种强大且广泛使用的编程语言&#xff0c;非常适合开发复杂的爬虫系统。本文将详细介绍如何利用Java编写爬虫程序来根据商品ID获取商品详情&#xff0c;并提供完整的代码…

RabbitMQ-入门

RabbitMQ-入门 基本说明 AMQP协议&#xff08;高消息队列协议&#xff1a;Advanced Message Queuing Protocol&#xff09;&#xff1a;https://www.rabbitmq.com/tutorials/amqp-concepts.html 基础组件术语 生产者&#xff08;Publisher&#xff09;&#xff1a;发消息到某…

【JAVA项目】基于ssm的【美食推荐管理系统】

【JAVA项目】基于ssm的【美食推荐管理系统】 技术简介&#xff1a;采用JSP技术、B/S架构、SSM框架、MySQL技术等实现。 系统简介&#xff1a;美食推荐管理系统&#xff0c;在系统首页可以查看首页、热门美食、美食教程、美食店铺、美食社区、美食资讯、我的、跳转到后台等内容。…

go-zero(十二)消息队列

go zero 消息队列 在微服务架构中&#xff0c;消息队列主要通过异步通信实现服务间的解耦&#xff0c;使得各个服务可以独立发展和扩展。 go-zero中使用的队列组件go-queue&#xff0c;是gozero官方实现的基于Kafka和Beanstalkd 的消息队列框架,我们使用kafka作为演示。 一、…

day30-IO-阶段综合案例(带权重的随机每日一记)(笔记完全来源于黑马程序员)

目录 0 目录一、听黑马阿玮的视频记录的笔记1. 制造假数据1.1 如何制造假数据1.2 练习1-生成方式1&#xff1a;爬取姓氏、男生名字、女生名字1.3 练习2-生成方式1&#xff1a;在练习1的基础上&#xff0c;将数据写入本地文件1.4 练习3-生成方式2&#xff1a;利用糊涂包生成假数…

Excel的文件导入遇到大文件时

Excel的文件导入向导如何把已导入数据排除 入起始行&#xff0c;选择从哪一行开始导入。 比如&#xff0c;前两行已经导入了&#xff0c;第二次导入的时候排除前两行&#xff0c;从第三行开始&#xff0c;就将导入起始行设置为3即可&#xff0c;且不勾选含标题行。 但遇到大文…

qemu安装arm64架构银河麒麟

qemu虚拟化软件&#xff0c;可以在一个平台上模拟另一个硬件平台&#xff0c;可以支持多种处理器架构。 一、安装 安装教程&#xff1a;https://blog.csdn.net/qq_36035382/article/details/125308044 下载链接&#xff1a;https://qemu.weilnetz.de/w64/2024/ 我下载的是 …

Linux-ubuntu环境配置

一&#xff0c;安装VWware&#xff0c;里面导入镜像文件 这些都是文件夹里面有的&#xff0c;然后对着正点原子视频安装就行&#xff0c;虚拟机的破解码&#xff0c;去百度搜一个能用就行&#xff0c;中间遇见俩问题。①乌班图里面不能上网&#xff0c;②插入U盘后&#xff0c;…

如何在 Ubuntu 22.04 上安装和使用 Apache Kafka

简介 Apache Kafka是一个高性能、低延迟的分布式流处理平台&#xff0c;广泛用于构建实时数据管道和流式应用。本文将指导你如何在Ubuntu 22.04系统上快速部署Apache Kafka&#xff0c;让你体验到Kafka在处理大规模实时数据流方面的强大能力。通过本教程&#xff0c;你将学会如…

TCP/IP杂记

TCP三次握手、四次挥手 从应用角度&#xff0c;不用多考虑为什么有三次&#xff0c;遵循标准即可。 ubuntu 下 wireshark安装&#xff1a; sudo add-apt-repository universe sudo apt install wireshark 三次握手实证&#xff1a; 第一次握手的情况如下&#xff1a;&#…

【2024最新Java面试宝典】—— SpringBoot面试题(44道含答案)

1. 什么是 Spring Boot&#xff1f; Spring Boot 是 Spring 开源组织下的子项目&#xff0c;是 Spring 组件一站式解决方案&#xff0c;主要是简化了使用 Spring 的难度&#xff0c;简省了繁重的配置&#xff0c;提供了各种启动器&#xff0c;使开发者能快速上手。 2. 为什么…

MTK Android12 开机向导

文章目录 需求-场景参考资料&#xff1a;博客资料官网参考资料&#xff1a;参考资料注意点 附件资料文件说明&#xff1a;推荐工具&#xff1a;配置定制的 声明叠加层 APK需求实现替换字符、删减开机向导界面、添加开机向导界面删除部分界面需求&#xff0c;官网说明如下更新部…

思科模拟器路由器的基本配置

一、实验目的 了解路由器的作用掌握路由器的基本配置方法 3、掌握路由器模块的使用和互连方式 二、实验环境 2811路由器一台&#xff0c;计算机两台&#xff0c;Console配置线一根&#xff0c;网线若干&#xff1b;本实验拓扑图如图8-1所示&#xff1b;计算机IP地址规划如表8-…

HTTP multipart/form-data 请求

序言 最近在写项目的过程中有一个需求是利用 HTTP 协议传输图片和视频&#xff0c;经过查询方法相应的方法发现使用 multipart/form-data 的方式&#xff0c;这是最常见处理二进制文件的表单编码类型。  学习了一下午&#xff0c;现在总结一下使用的方法和相关的知识点&#x…