Redis常见数据类型(3)-String, Hash

目录

String

命令小结

内部编码

典型的使用场景

缓存功能

计数功能

共享会话

手机验证码

Hash 哈希

命令

hset

hget

hexists

hdel

hkeys

hvals

hgetall

hmget

hlen

hsetnx

hincrby

hincrbyfloat


String

上一篇中介绍了了String里的基本命令, 接下来总结一下

命令小结

命令执行效果时间复杂度
set key value [key value...]设置key的值为valueO(1)
get key 获取指定的key值O(1)
del key[key...]删除指定的keyO(k), k是键的个数
mset key value[key value...]批量设置指定的key和valueO(k), k是键的个数
mget key [key...]批量获取key的值O(k). k是键的个数
incr key指定的key值 + 1O(1)
decr key指定的key值 - 1O(1)
incrby key n指定的key值 + nO(1)
decrby key n指定的key值 - nO(1)
incrbyfloat key n指定的key值 + nO(1)
append key value指定的key值追加valueO(1)
strlen key获取指定key的长度

O(1)

setrange key offset value覆盖指定key的从offset开始的部分值

O(n), n是字符串长度, 

通常视为O(1)

getrange key start end获取指定的key的从start到end的部分值

O(n),n是字符串长度,

通常视为O(1)

内部编码

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

int : 8个字节的长整型.

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

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

 示例:

典型的使用场景

缓存功能

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

流程如下:

(1)用户访问业务层, 查找想要的数据

(2)业务层对缓存层进行查询

(3)如果缓存层查询到数据, 则直接返回给业务层

(4)如果缓存层未查找到, 就从存储层获取

(5)从存储层获取到之后返回给缓存层, 并把该数据写入缓存层

(6)缓存层再将该数据返回给业务层

通过增加缓存功能, 在理想情况下, 每个用户信息, 一个小时期间只有一次MySQL查询, 极大地提升了查询效率, 也降低了MySQL的访问数. 

计数功能

许多应用都会使用Redis作为计数的基础工具, 它可以实现快速计数, 查询缓存的功能, 同时数据可以异步处理或者落地到其它数据源. 例如视频播放网站播放次数可以使用Redis完成: 每播放一次视频, 相应的视频播放次数就会自增1.

实际中要开发一个成熟, 稳定的计数系统, 要面临的挑战远不止如此简单: 防作弊, 按不同维度计数, 避免单点问题, 数据持久化到底层数据源等问题. 

共享会话

如图: 一个分布式web服务将用户的Session信息(例如用户登录信息)保存在各自的服务器中, 但这样会造成一个问题: 处于负载均衡的考虑, 分布式服务会将用户的访问请求均衡到不同的服务器上,并且通常无法保证用户每次请求都会被均衡到同一台服务器上, 这样用户每刷新一次访问是可能会发现需要重新登录, 这个问题是无法容忍的.

session分散存储:

为了解决这个问题, 可以使用Redis将用户的Session信息进行集中管理, 如图,  在这种模式下, 只要保证Redis是高可用和扩展性的, 无论用户被均衡到哪台Web服务器上, 都集中从Redis中查询, 更新Session信息.

Redis集中管理Session:

手机验证码

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

 思路: 使用带过期时间的键, 并设置其过期时间60s, 如果每次发送时该键存在,就会被限制发送, 具体实现就不过多展开了, 老铁们如果感兴趣可以自行查询.

Hash 哈希

几乎所有的主流编程语言都提供了哈希类型, 它们的叫法可能是哈希, 字典, 关联数组, 映射. 说到这, 有的人就会问了, 这Redis本身不就是哈希表么, 怎么又套了一个? 其实是这样实现的: 形如key = "key", value = {{field1, value1},...,{fieldN, valueN}}

字符串类型和哈希类型的对比:

 哈希类型中的映射关系通常称为field-value, 用于区分Redis整体的键值对(key-value), 注意这里的value是指field所对应的值, 不是键(key)对应的值, 请注意value在不同上下文中的作用.

命令

hset

设置hash中指定的字段(field)的值(value).

语法:

hset key field value [field value...] 

命令有效版本: 2.0.0之后

时间复杂度: 插入一组field为O(1), 插入N组field为O(N).

返回值: 添加的字段个数.

示例:

hget

获取hash中指定字段的值. 

语法: 

hget key field 

命令有效版本: 2.0.0

时间复杂度: O(1)

返回值: 字段对应的值或者是nil.

hexists

判断hash中是否有指定的字段.

语法:

hexists key field 

命令有效版本: 2.0.0之后.

时间复杂度: O(1)

返回值: 1表示存在, 0表示不存在

示例:

hdel

删除hash中的指定字段.

语法:

hdel key field [field ...]

命令有效版本: 2.0.0之后

时间复杂度: 删除一个元素为O(1). 删除N个元素为O(N).

返回值: 本次操作删除的字段个数. 

示例:

hkeys

获取hash中的所有字段.

语法:

hkeys key 

命令有效版本: 2.0.0之后.

时间复杂度: O(N), N为field个数. 

返回值: 字段列表

示例:

hvals

获取hash中的所有值.

语法:

hvals key 

命令有效版本: 2.0.0之后

时间复杂度: O(N), N为field个数.

返回值: 所有的值.

示例:

hgetall

获取hash中所有字段以及对应的值.

语法:

hgetall key 

命令有效版本: 2.0.0之后

时间复杂度: O(N), N为field个数

返回值: 字段和对应的值. 

示例:

hmget

一次获取hash中多个字段的值.

语法:

hmget key field [field ...] 

命令有效版本: 2.0.0之后

时间复杂度: 只查询一个元素为O(1), 查询多个元素为O(N), N为查询元素个数.

返回值: 字段对应的值或者nil.

示例:

hlen

获取hash中所有字段的个数.

语法:

hlen key 

命令有效版本: 2.0.0之后

时间复杂度: O(1)

返回值: 字段个数.

hsetnx

在字段不存在的情况下, 设置hash中的字段和值.

语法:

hsetnx key field value 

命令有效版本: 2.0.0之后

时间复杂度: O(1)

返回值: 1表示成功, 0 表示失败

示例:

 

hincrby

将hash中字段对应的数值添加指定的值.

语法:

 hincrby key field increment

命令有效版本: 2.0.0之后

时间复杂度: O(1)

返回值: 该字段变化后的值.

示例:

hincrbyfloat

hincrby的浮点数版本, 不过多解释. 

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

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

相关文章

《Python编程从入门到实践》day37

# 昨日知识点回顾 制定规范、创建虚拟环境并激活,正在虚拟环境创建项目、数据库和应用程序 # 今日知识点学习 18.2.4 定义模型Entry # models.py from django.db import models# Create your models here. class Topic(models.Model):"""用户学习的…

Vue2基础及其进阶面试(一)

简单版项目初始化 新建一个vue2 官网文档:介绍 — Vue.js 先确保下载了vue的脚手架 npm install -g vue-cli npm install -g vue/cli --force vue -V 创建项目 vue create 自己起个名字 选择自己选择特性 选择: Babel:他可以将我们写…

微软开发者大会,Copilot Agents发布,掀起新一轮生产力革命!

把AI融入生产力工具的未来会是什么样?微软今天给出了蓝图。 今天凌晨,微软召开了Microsoft Build 2024 开发者大会,同前两天的Google I/O开发者大会一样,本次大会的核心词还是“AI”,其中最主要的内容是最新的Copilot…

拼多多暂时超越阿里成为电商第一

关注卢松松,会经常给你分享一些我的经验和观点。 拼多多的财报又炸裂了: 拼多多发布了第一季度财报,营收868亿,增长了131%,净利润279亿,增长了246%,营销服务收入424亿,也就是商家的…

BCD编码Java实现

最常用的BCD编码,就是使用"0"至"9"这十个数值的二进码来表示。这种编码方式,在称之为“8421码”(日常所说的BCD码大都是指8421BCD码形式)。除此以外,对应不同需求,各人亦开发了不同的编…

Linux多线程系列三: 生产者消费者模型,信号量使用,基于阻塞队列和环形队列的这两种生产者消费者代码的实现

Linux多线程系列三: 生产者消费者模型,信号量,基于阻塞队列和环形队列的这两种生产者消费者代码的实现 一.生产者消费者模型的理论1.现实生活中的生产者消费者模型2.多线程当中的生产者消费者模型3.理论 二.基于阻塞队列的生产者消费者模型的基础代码1.阻塞队列的介绍2.大致框架…

rust的版本问题,安装问题,下载问题

rust的版本、安装、下载问题 rust版本问题, 在使用rust的时候,应用rust的包,有时候包的使用和rust版本有关系。 error: failed to run custom build command for pear_codegen v0.1.2 Caused by: process didnt exit successfully: D:\rus…

【Mac】Dreamweaver 2021 for mac v21.3 Rid中文版安装教程

软件介绍 Dreamweaver是Adobe公司开发的一款专业网页设计与前端开发软件。它集成了所见即所得(WYSIWYG)编辑器和代码编辑器,可以帮助开发者快速创建和编辑网页。Dreamweaver提供了丰富的功能和工具,包括代码提示、语法高亮、代码…

es数据备份和迁移Elasticsearch

Elasticsearch数据备份与恢复 前提 # 注意: 1.在进行本地备份时使用--type需要备份索引和数据(mapping,data) 2.在将数据备份到另外一台ES节点时需要比本地备份多备份一种数据类型(analyzer,mapping,data,template) …

STM32看门狗

文章目录 WDG(Watchdog)看门狗独立看门狗独立看门狗框图超时时间计算 窗口看门狗超时时间 独立看门狗与窗口看门狗对比补充 WDG(Watchdog)看门狗 看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干…

SpringCloud Alibaba的相关组件的简介及其使用

Spring Cloud Alibaba是阿里巴巴为开发者提供的一套微服务解决方案,它基于Spring Cloud项目,提供了一系列功能强大的组件,包括服务注册与发现、配置中心、熔断与限流、消息队列等。 本文将对Spring Cloud Alibaba的相关组件进行简介&#xff…

如何搭建一个vue项目(完整步骤)

搭建一个新的vue项目 一、安装node环境二、搭建vue项目环境1、全局安装vue-cli2、进入你的项目目录,创建一个基于 webpack 模板的新项目3、进入项目:cd vue-demo,安装依赖4、npm run dev,启动项目 三、vue项目目录讲解四、开始我们…

安装和使用图像处理软件GraphicsMagick @FreeBSD

GraphicsMagick是一个用于处理图像的读取、写入和操作的工具软件。它被誉为图像处理领域的“瑞士军刀”,短小精悍,支持超过88种图像格式,包括DPX、GIF、JPEG、JPEG-2000、PNG、PDF、PNM和TIFF等。 GraphicsMagick的主要特点包括:…

【openlayers系统学习】3.5colormap详解(颜色映射)

五、colormap详解(颜色映射) ​colormap​ 包是一个很好的实用程序库,用于创建颜色图。该库已作为项目的依赖项添加(1.7美化(设置style))。要导入它,请编辑 main.js​ 以包含以下行…

蓝桥楼赛第30期-Python-第三天赛题 从参数中提取信息题解

楼赛 第30期 Python 模块大比拼 提取用户输入信息 介绍 正则表达式(英文为 Regular Expression,常简写为regex、regexp 或 RE),也叫规则表达式、正规表达式,是计算机科学的一个概念。 所谓“正则”,可以…

Golang实现递归复制文件夹

代码 package zdpgo_fileimport ("errors""os""path/filepath""strings" )// CopyDir 复制文件夹 // param srcPath 源文件夹 // param desPath 目标文件夹 // return error 错误信息 func CopyDir(srcPath, desPath string) error {…

金丝雀发布(灰度发布)介绍 及 声明式管理方法简介

目录 一 应用发布策略 1,滚动发布(k8s默认) 2,蓝绿发布 3,金丝雀发布 二 金丝雀发布(Canary Release) (灰度发布) 1,金丝雀发布图解 2&#xff0…

【NLP】文本分类

n-gram 的局限性 n-gram 只能对于填空这样的通顺性问题做出推测,但是没有办法完全解决句子的语义问题,从而无法实现文本的分类 文本的分类,就是将文本在语义的理解下划分到特定的主题下 手工规则 如一些垃圾过滤系统,需要人工制…

Docker部署springboot包并联通MySQL

Docker部署jar 实现功能 部署springboot下发布的jar包不同docker容器之间通信(如MySQL访问、Redis访问)多个jar包部署 参考文献 Just a moment… Just a moment… https://www.jb51.net/article/279449.htm springboot配置 这里使用多yaml配置文件&…

如何在go项目中实现发送邮箱验证码、邮箱+验证码登录

前期准备 GoLand :2024.1.1 下载官网:https://www.jetbrains.com/zh-cn/go/download/other.html Postman: 下载官网:https://www.postman.com/downloads/ 效果图(使用Postman) Google: QQ: And …