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

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

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

相关文章:

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

Redis&#xff08;版本7.0&#xff09;的数据结构主要包括字符串&#xff08;String&#xff09;、哈希表&#xff08;Hash&#xff09;、列表&#xff08;List&#xff09;、集合&#xff08;Set&#xff09;、有序集合&#xff08;Sorted Set&#xff09;、超日志&#xff08…...

【Python】用Python和Paramiko实现远程服务器自动化管理

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在现代IT环境中,远程服务器管理已成为运维工作的常态。随着自动化运维的需求不断增加,如何高效地管理远程服务器,提升操作的灵活性和效率…...

PDF处理的创新工具:福昕低代码平台尝鲜

在当今数字化时代&#xff0c;PDF文件的处理和管理变得越来越重要。福昕低代码平台是新发布的一款创新的工具&#xff0c;旨在简化PDF处理和管理的流程。通过这个平台&#xff0c;用户可以通过简单的拖拽界面上的按钮&#xff0c;轻松完成对Cloud API的调用工作流&#xff0c;而…...

openstack创建浮动IP全过程

1、创建外部网络&#xff0c;即是provider网络&#xff0c;有关provider网络的详细解释请参见我之前的文章openstack中的self-service和provider网络_openstack provider网络不能创建vlan吗-CSDN博客 network create --share --external --provider-physical-network physnet1…...

nginx漏洞修复

漏洞名称&#xff1a;web服务器http信息头公开 解决&#xff0c;在以下各个监听端口加上一行&#xff0c;然后重启****nginx server_tokens off; 漏洞名称&#xff1a;默认的nginx http服务器设置 解决&#xff1a;请求头加上以下参数 add_header Content-Security-Policy “…...

Jackson - 序列化时更改字段名称

在这个简短的教程中&#xff0c;我将向您展示如何在序列化时更改字段名称以映射到另一个JSON属性。 Jackson库提供了JsonProperty注解&#xff0c;用于改变序列化JSON中的属性名称。 依赖项 首先&#xff0c;在pom.xml文件中添加以下依赖项&#xff1a; <dependency>…...

策略模式实战 - 猜拳游戏

**可以整体的替换一套算法&#xff0c;这就是策略模式。**这样对于同一个问题&#xff0c;可以有多种解决方案——算法实现的时候&#xff0c;可以通过策略模式来非常方便的进行算法的整体替换&#xff0c;而各种算法是独立封装好的&#xff0c;不用修改其内部逻辑。 具体的实…...

AWS ECS Task 添加 Prometheus 监控采集配置详细指南

以下是一篇完整的博文,介绍如何在 AWS ECS 环境中实现 JVM 监控。 AWS ECS 环境下的 JVM 监控实践 概述 在 AWS ECS (Elastic Container Service) 环境中监控 Java 应用性能是一项重要任务。本文将详细介绍如何使用 AWS Distro for OpenTelemetry (ADOT) 结合 Spring Boot …...

5. 一分钟读懂“工厂方法模式”

5.1 模式介绍 你可能会发现&#xff0c;简单工厂模式没在经典设计模式里出现&#xff0c;别急&#xff0c;它其实只是个常用的编程技巧&#xff0c;而不是标准的设计模式。简单工厂模式有三个要素&#xff1a;1个产品接口、n个产品类、1个工厂类&#xff0c;工厂类通过if/else来…...

基于 AutoFlow 快速搭建基于 TiDB 向量搜索的本地知识库问答机器人

导读 本文将详细介绍如何通过 PingCAP 开源项目 AutoFlow 实现快速搭建基于 TiDB 的本地知识库问答机器人。如果提前准备好 Docker、TiDB 环境&#xff0c;整个搭建过程估计在 10 分钟左右即可完成&#xff0c;无须开发任何代码。 文中使用一篇 TiDB 文档作为本地数据源作为示…...

C语言学习:速通指针(2)

这里要学习的有以下内容 1. const修饰指针 2. 野指针 3. assert断⾔ 4. 指针的使⽤和传址调⽤ 那么从这里开始 1. const 修饰指针 const修饰变量 首先我们知道变量是可以修改的&#xff0c;如果把变量的地址交给⼀个指针变量&#xff0c;通过指针变量的也可以修改这个变…...

windows 上ffmpeg编译好的版本选择

1. Gyan.dev Gyan.dev 是一个广受信赖的 FFmpeg 预编译库提供者&#xff0c;提供多种版本的 FFmpeg&#xff0c;包括静态和动态链接版本。 下载链接: https://www.gyan.dev/ffmpeg/builds/ 特点&#xff1a; 提供最新稳定版和开发版。 支持静态和共享&#xff08;动态&…...

Java设计模式笔记(二)

十四、模版方法模式 1、介绍 1&#xff09;模板方法模式(Template Method Pattern)&#xff0c;又叫模板模式(Template Patern)&#xff0c;在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需重写方法实现&#xff0c;但调用将以抽象类中定义的方式进行。 2&…...

Vue CLI的作用

Vue CLI&#xff08;Command Line Interface&#xff09;是一个基于Vue.js的官方脚手架工具&#xff0c;其主要作用是帮助开发者快速搭建Vue项目的基础结构和开发环境。以下是Vue CLI的具体作用&#xff1a; 1、项目模板与快速生成 Vue CLI提供了一系列预设的项目模板&#x…...

短视频矩阵系统开发|技术源代码部署

短视频矩阵系统通过多账号运营管理、多平台视频智能分发等功能&#xff0c;助力企业实现视频引流、粉丝沉淀和转化。 短视频矩阵系统是一种创新的营销工具&#xff0c;它整合了多账号管理、视频智能分发、数据可视化等多种功能&#xff0c;为企业在短视频领域的发展提供了强大…...

Erlang socket编程(二)

模拟服务器和客户端通信 %%%------------------------------------------------------------------- %%% author Administrator %%% copyright (C) 2024, <COMPANY> %%% doc %%% %%% end %%% Created : 03. 12月 2024 22:28 %%%---------------------------------------…...

工业检测基础-线扫相机和面阵相机参数及应用

以下是工业面阵相机和线扫相机的重要参数、应用场景以及调节方法的科普&#xff1a; 重要参数 分辨率&#xff1a; 面阵相机&#xff1a;由相机所采用的芯片分辨率决定&#xff0c;常用的有500万、1200万、6500万等像素&#xff0c;一般用长宽表示。如19201080等&#xff0c;…...

【无标题】建议用坚果云直接同步zotero,其他方法已经过时,容易出现bug

created: 2024-12-06T16:07:45 (UTC 08:00) tags: [] source: https://zotero-chinese.com/user-guide/sync author: 数据与文件的同步 | Zotero 中文社区 Excerpt Zotero 中文社区&#xff0c;Zotero 中文维护小组&#xff0c;Zotero 插件&#xff0c;Zotero 中文 CSL 样式 数…...

基于STM32设计的智能宠物喂养系统(华为云IOT)_273

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成【4】设计意义【5】国内外研究现状【6】摘要1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】设备端开发【2】上位机开发1.5 参考文献1.6 系统框架图1.7 系统原理图1.8 实物图1.9…...

cesium truf 利用缓冲如何将一个点缓冲成一个方形

&#xff1a; 在Cesium中如果你想要一个更简单的方法将一个点缓冲成一个方形区域&#xff0c;你可以考虑以下步骤&#xff1a; 确定中心点&#xff1a;首先&#xff0c;你需要有一个中心点的经纬度坐标。计算边长&#xff1a;确定你想要缓冲的方形的边长&#xff0c;这里以10…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

Ray框架:分布式AI训练与调参实践

Ray框架&#xff1a;分布式AI训练与调参实践 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 Ray框架&#xff1a;分布式AI训练与调参实践摘要引言框架架构解析1. 核心组件设计2. 关键技术实现2.1 动态资源调度2.2 …...