Redis数据结构-String字符串

1.String字符串

字符串类型是Redis中最基础的数据结构,关于数据结构与要特别注意的是:首先Redis中所有的键的类型都是字符串类型,而且其他集中数据结构也都是在字符串类似基础上进行构建,例如列表和集合的元素类型是字符串类型,所有字符串类型能为其他4中数据结构的学习奠定基础。其次字符串类型的值可以是字符串,包含一般格式的字符串和JSON,XML格式的字符串;数字,也可以是整数或者浮点数;甚至是二进制流数据,例如图片,音频,视频等。不过一个字符串的最大值不能超过512MB

2.常见命令

2.1 SET

将String类型的value设置到key中。如果之前key存在,则覆盖,无论原来的数据类型是什么。之前关于此key的TTL也会全部失效。

语法:SET key value [expiration EX seconds | PX milliseconds]  [NX |XX]

时间复杂度:O(1)

选项:

EX seconds ——使用秒作为单位设置key的过期时间

PX milliseconds——使用毫秒作为单位设置key的过期时间

NX——只要key不存在时才进行设置,即如果key之前已经存在,设置不执行

XX——只在key存在时才进行设置,即如果key之前已经存在,设置不执行

返回值:

如果设置成功,返回OK。

如果由于SET指定NX或者XX但条件不满足,SET不会执行,并返回(nil)

示例:

 2.2 MGET

一次性获取多个key的值。如果对应的key不存在或者对应的数据类型不是string,返回nil

语法:MGET key [key ...]

时间复杂度:O(1)(或O(N),N是key的数量)

返回值:对应value的列表

示例:

2.3 MSET

一次设置多个key的值

语法:MSET key value [key value...]

时间复杂度:O(1)(或O(N),N是key的数量)

返回值:永远是OK

示例:

多次 get vs单次mget

Redis是一个客户端-服务器结构的程序,客户端和服务器之间通信是通过网络实现的,多次get产生了多次请求,进行多次网络通信。单次mget只进行一次网络通信,mget减少了网络事件,所以性能较高

2.4 SETNX

设置key-value但只允许在key之前不存在的情况下

语法:SETNX key value

时间复杂度:O(1)

返回值:1表示设置成功,0表示没有设置成功

示例:

2.5 INCR

将key对应的value(String类型)表示的数字+1。如果key不存在,则视为key对应的value是0。如果key对应的string不是一个整数或者范围超过了64位有符号整数,则报错

语法:INCR key

时间复杂度:O(1)

返回值:integer类型的加完后的数值

示例:

2.6 INCRBY

将key对应的string表示的数字加上对应的值。如果key不存在,则视为key对应的value是0.如果key对应的string不是一个整数或者范围超过了64位有符号整数,则报错

语法:INCRBY key decrement

时间复杂度:O(1)

返回值:integer类型的加完后的数值

示例:

 2.7 DECR

将key对应的string表示的数字减一。如果key对应的value是0.如果key对应的string不是一个整数或者范围超过了64位有符号整数,则报数

语法:DECR key

时间复杂度:O(1)

返回值:integer类型的减完后的数值

示例:

2.8 INCRBYFLOAT

将key对应的string表示的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。如果key不存在,则视为key对应的value是0.如果key对应的不是string,或者不是一个浮点数,则报错。允许采用科学计数法表示浮点数

语法:INCRBYFLOAT

时间复杂度:O(1)

返回值:加/减完后的数值

示例:

2.9 APPEND

如果key已经存在并且是一个string,命令会将value追加到原有的string的后面。如果key不存在,则效果等同于SET命令

语法:APPEND KEY VALUE

时间复杂度:O(1)

返回值:追加完成之后string的长度

示例:

2.10 GETRANGE

返回key对应的string的子串,有start和end确定(左闭右闭)。可以使用负数表示倒数。-1表示倒数第一个字符,其他的于此类似。超过范围的偏移量会根据string的长度调整成正确的值

语法:GETRANGE key start end

时间复杂度:O(N),N为[start,end]区间的长度。由于string通常比较短,可以视为是O(1)

返回值:string类型的子串

示例:

2.11 SETRANGE

覆盖字符串的一部分,从指定的偏移开始

语法:SETRANGE key offset value

时间复杂度:O(N),N为value的长度,由于一般的value比较短,通常视为O(1)

返回值:替换后的string

示例:

2.11 STRLEN

获取key对应的string的长度。当key存放的类型不是string时,报错

语法:STRLEN key 

时间复杂度:O(1)

返回值:string的长度,或者当key不存在时,返回0

示例:

3.String的内部编码

字符串类型的内部编码有3种:

int:8个字节的长整型

embstr:小于等于39个字节的字符串

raw:大于39个字节的字符串

Redis会根据当前值的类型和长度动态决定使用那种内部编码实现

redis存储小数,本质上还是当字符串来存储的,这意味着每次进行算数运算时,都需要将字符串转为小数,再将运算结果转为字符串,计算过程中的转换都是开销

4.String的典型场景

4.1缓存功能

缓存功能是String比较典型的运用场景,其中Redis作为缓冲层,MySQL作为存储层,绝大部分请求的数据都是从Redis中获取。由于Redis具有支撑高并发的特性,所以缓存通常能起到加速读写和降低后端压力的作用

MySQL+Redis组成的缓存存储框架结构

业务层 也可以看做是应用服务器,缓存层是Redis服务器(用于存放热点数据),存储层是MySQL服务器

假设业务是根据用户uid获取用户信息:

首先从Redis获取用户信息,如果没有从Redis中得到用户信息,及缓存miss,则进一步从MySQL中获取对应的信息,随后写入缓存并返回。如果从Redis中获取到用户的信息,则直接返回。通过增加缓存的功能,可以极大地提高查询的效率,也降低了对MySQL的访问次数

4.2计数功能

许多应用都会使用Redis作为技术的基础工具,他可以实现快速的技术,查询缓存的功能,同时数据可以一步处理或者落地到其他的数据源

 实际的开发一个成熟,稳定的真实技术系统,要面临的挑战远不止如此简单:防作弊,按照不同的维度技术,避免单点问题(单个redis挂了,数据丢失),数据持久化到底层数据源等

4.3共享会话

一个分布式Web服务将用户的Session信息保存在各自的服务器中,但这样会造成一个问题:处于负载均衡的考虑,分布式服务会将用户的访问请求均衡到不同的服务器上,并且通常无法保证用户每次请求都会被均衡到同一台服务器上,这样当用户刷新一次访问是可能会发现需要重新登陆的,这个问题对于用户来说是非常不适的

Session分散存储

为了解决这个问题,可以使用Redis将用户的Session信息进行集中管理。

Redis集中管理Session

 这种模式下,无论用户被均衡到哪台服务器上,都会集中从Redis中查询,更新Session信息

4.4短信验证码 

很多应用处于安全考虑,会在每次登陆时,让用户输入手机号并且配合给手机发送验证码,然后让用户输入收到的验证码进行验证,从而确定是否是用户本人。为了短信接口不会频繁访问,会限制用户每分钟获取验证码的频率,例如一分钟不能超过五次等

解决思路:

通过Redis命令对制定的key设置有效时间,在有效时间内访问Redis即可成功,如果超出有效时间就登录失败

当然实际中并不会像我描述的这么简单,还需要根据业务的场景进行具体的编写

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

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

相关文章

cline通过硅基流动平台接入DeepSeek-R1模型接入指南

为帮助您更高效、安全地通过硅基流动平台接入DeepSeek-R1模型,以下为优化后的接入方案: DeepSeek-R1硅基流动平台接入指南 📌 核心优势 成本低廉:注册即送2000万Tokens(价值约14元)高可用性:规…

Java多线程三:补充知识

精心整理了最新的面试资料,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Lambda表达式 简介: 希腊字母表中排序第十一位的字母,英语名称为Lambda避免匿名内部类定义过多其实质属于函数式编程的概念 为什么要使用lam…

装修流程图: 装修前准备 → 设计阶段 → 施工阶段 → 安装阶段 → 收尾阶段 → 入住

文章目录 引言I 毛坯房装修的全流程**1. 装修前准备****1.1 确定装修预算****1.2 选择装修方式****1.3 选择装修公司****1.4 办理装修手续****2. 设计阶段****2.1 量房****2.2 设计方案****2.3 确认方案****3. 施工阶段****3.1 主体拆改****3.2 水电改造****3.3 防水工程****3.…

Embedding方法:从Word2Vec到ltem2Vec

引言 在推荐系统领域,如何有效表征物品特征始终是核心挑战。传统协同过滤方法受限于稀疏性问题,直到2016年微软研究院提出的Item2Vec方法,将自然语言处理中的Word2Vec技术创造性应用于物品表征学习,开启了嵌入学习的新纪元。 It…

Udp发送和接收数据(python和QT)

服务端代码 (python) import socketdef udp_server(host0.0.0.0, port12345):# 创建一个UDP套接字sock socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定服务器的IP地址和端口号sock.bind((host, port))print(f"UDP服务器已启动,监听端口 {port}...&…

VBA脚本将DeepSeek嵌入Word中教程

一、获取API-Key 目前我们可以直接只用官网的API来实现,申请这一步是关键 也可以直接访问官网的API平台:https://platform.deepseek.com/ ,没注册的注册完登录一下,我们点击到左侧菜单的“APIKeys”按钮,然后点击右侧…

DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署

DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署 **DeepSeek** 是一款专注于深度学习和人工智能的工具或平台,通常与人工智能、机器学习、自动化分析等领域有关。它的主要功能可能包括:深度学习模型搜索&…

网站搭建基本流程

需求分析: 实现网站搭建的过程:首先进行网站的需求性分析 网站可分为前台系统和后台系统,由不同的功能拆分为不同的模块 如下是一个电商网站可以拆分出的模块: 在编写代码前,我们要先对网站进行架构,通过…

解决elementUi el-select 响应式不生效的问题

情况一,字段类型不匹配 考虑option的value值的字段类型是否和api返回的字段类型一致&#xff0c;如果一个为字符串一个为数字类型是无法匹配上的 <template> <div><el-select v-model"value" size"large"style"width: 240px"&…

QT实战-基于QWidget实现的异形tip窗口

本文主要介绍了qt中,基于QWidget实现异形tip窗口的几种实现方式,话不多说,先上图, 1.使用QPainter和QPainterPath实现 代码:tipwnd1.h #ifndef TIPWND1_H #define TIPWND1_H#include <QWidget>class TipWnd1 : public QWidget {Q_OBJECTQ_PROPERTY(QColor my_border…

【C++篇】树影摇曳,旋转无声:探寻AVL树的平衡之道

文章目录 从结构到操作&#xff1a;手撕AVL树的实现一、AVL树介绍1.1 什么是AVL树1.2 平衡因子的定义1.3 平衡的意义1.4 AVL树的操作 二、AVL树的节点结构2.1 节点结构的定义&#xff1a; 三、插入操作3.1 插入操作概述3.2 步骤1&#xff1a;按二叉查找树规则插入节点3.3 步骤2…

么是静态住宅IP,跨境电商为什么需要静态住宅IP

静态住宅IP是指直接分配给一台属于私人住宅网络的设备的固定IP地址&#xff0c;这种地址不会频繁更改。它们作为代理IP&#xff0c;使使用者能够通过这些代理服务器进行网络访问&#xff0c;而对外显示的则是该住宅的IP地址。由于这些IP地址属于真实的住宅或个人&#xff0c;并…

清华大学deepseek教程第四版 DeepSeek+DeepResearch 让科研像聊天一样简单(附下载)

deepseek使用教程系列 DeepSeekDeepResearch 让科研像聊天一样简单(附下载) https://pan.baidu.com/s/1VMgRmCSEzNvhLZQc8mu6iQ?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/f3d4511b790a

leetcode刷题记录(一百零七)——279. 完全平方数

&#xff08;一&#xff09;问题描述 279. 完全平方数 - 力扣&#xff08;LeetCode&#xff09;279. 完全平方数 - 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#x…

软考高级信息系统项目管理师笔记-第2章信息技术发展

第2章 信息技术发展 2.1 信息技术及其发展 1、按表现形态的不同,信息技术可分为硬技术(物化技术)与软技术(非物化技术)。前者指各种信息设备及其功 能,如传感器、服务器、智能手机、通信卫星、笔记本电脑。后者指有关信息获取与处理的各种知识、方法 与技能,如语言文字…

搭建RAG知识库的完整源码实现

搭建RAG知识库的完整源码实现&#xff08;基于Python 3.8&#xff09;&#xff1a; # -*- coding: utf-8 -*- # 文件名&#xff1a;rag_knowledge_base.py # RAG知识库搭建完整源码&#xff08;含中文注释&#xff09;import os import re import shutil import chromadb from…

利用AFE+MCU构建电池管理系统(BMS)

前言 实际BMS项目中&#xff0c;可能会综合考虑成本、可拓展、通信交互等&#xff0c;用AFE&#xff08;模拟前端&#xff09;MCU&#xff08;微控制器&#xff09;实现BMS&#xff08;电池管理系统&#xff09;。 希望看到这篇博客的朋友能指出错误或提供改进建议。 有纰漏…

基于SpringBoot的智慧家政服务平台系统设计与实现的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

什么是 Cloud Studio DeepSeek ; 怎么实现Open WebUI快速体验

什么是 Cloud Studio DeepSeek ;怎么实现Open WebUI快速体验 一、概述 欢迎使用 Cloud Studio DeepSeek 工作空间!我们已为您预装并启动了以下服务,等待加载十几秒即可查看效果: Ollama 服务:支持通过 API 调用 DeepSeek 模型。 AnythingLLM 前端服务:提供交互式聊天界…

【Python 语法】常用 Python 内置函数

reversed() 反转reversed() 的语法反转字符串、列表、元组 sorted() 自定义排序sorted() 语法使用示例1. 基本排序&#xff1a;默认升序排列2. 基本排序&#xff1a;降序排列3. 自定义排序&#xff1a;使用 key 参数4. 自定义排序&#xff1a;按某种规则进行排序5. 排序字典&am…