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.mzph.cn/news/839268.shtml

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

相关文章

AJAX、

文章目录 AJAX1. AJAX简介AJAX特点 2. XML简介3. AJAX发送get请求4. post请求设置体参数5. 设置请求头信息6. AJAX请求服务端响应json数据7. ie缓存问题8. 请求超时问题和网络异常9. 取消请求10. 请求重复取消11. jQuery中的AJAX请求12. axios函数发送AJAX使用fetch函数发送AJA…

跨境电商赛道,云手机到底能不能化繁为简?

当下国内电商背景: 从零售额的数据来看:随着互联网的普及和消费者购物习惯的改变,国内电商市场规模持续扩大。据相关数据显示,网络消费亮点纷呈,一季度全国网上零售额达到了3.3万亿元,同比增长12.4%。这表…

html 段落与排版标记 Web前端开发技术、详细文章(例如)

段落与排版标记 网页的外观是否美观,很大程度上取决于其排版。在页面中出现大段的文字,通常采用分段进行规划,对换行也有极其严格的划分。本节从段落的细节设置入手,利用段落与排版标记自如地处理大段的文字。 段落p标记 在HTM…

探索SRM系统的未来:第一批吃螃蟹的企业如何用API/插件打破效率瓶颈?

官.网地址:合合TextIn - 合合信息旗下OCR云服务产品 一、SRM开放集成实践前瞻 二、开放集成渐成系统升级新趋势 降本增效是企业经营的一大永恒话题。通常而言,企业在不同发展阶段中,会使用到不同的管理系统,或产生不同的业务场…

LLM提示词编写技巧-prompt必知必会

LLM大模型提示词编写技巧 提示词的构成要素基础技巧添加明确的语法分解任务指定输出结构 进阶技巧少样本学习 Few Shot零样本学习zero shot思维链提示 CoTCO-STAR框架 高阶技巧自动推理并生成工具 ART推理行动 ReACT 好用的提示词示例绘制工作流程图编写技术博客 参考资料 提示…

热红外传感器

热红外传感器 一、热红外测温原理二、热红外传感器三、MLX90640-D55(MLX90640-BAB)测试 一、热红外测温原理 自然界中当物体的温度高于 绝对零度 时,由于它内部 热运动 的存在,就会不断地向四周辐射电磁波,其中就包含了波段位于0.75~100μm …

K8S认证|CKA题库+答案| 14. 排查故障节点

14、排查集群中的故障节点 您必须在以下Cluster/Node上完成此考题: Cluster Master node Worker node wk8s master …

LLMjacking:针对云托管AI大模型服务的新型攻击

Sysdig威胁研究团队(TRT)观察到一种新型攻击,命名为LLMjacking。它利用窃取的云凭证,对托管在云上的十个大型语言模型(LLM)服务发起攻击。 这些凭证是从一个流行的目标获得,即运行着一个存在漏洞的Laravel版本(CVE-2021-3129&…

常见算法(1)

1.基本查找/顺序查找 核心:从0索引之后挨个查找 实现代码: public class test {public static void main(String [] arg) throws ParseException {int[] arr {121,85,46,15,55,77,63,49};int number55;System.out.println(bashi(arr,number));}publi…

【编译原理复习笔记】正则表达式与自动机

正则表达式 正则表达式是一种用来描述正则语言的更紧凑的表达方法 e.g. r a ( a ∣ b ) ∗ ( ϵ ∣ ( . ∣ ) ( a ∣ b ) ) ra(a|b)^*(\epsilon|(.|\\_ )(a|b)) ra(a∣b)∗(ϵ∣(.∣)​(a∣b)) 正则表达式可以由较小的正则表达式按照特定的规则递归地构建。每个正则表达式定义…

综述 | 走向图对比学习:综述与展望

【摘要】近年来,图的深度学习在各个领域取得了显著的成功。然而,对带注释的图形数据的依赖仍然是一个很大的瓶颈,因为它的成本过高且耗费时间。为了应对这一挑战,图的自监督学习(SSL)得到了越来越多的关注,并取得了重大…

群晖搭建网页版Linux Ubuntu系统并实现远程访问

文章目录 1. 下载Docker-Webtop镜像2. 运行Docker-Webtop镜像3. 本地访问网页版Linux系统4. 群晖NAS安装Cpolar工具5. 配置异地访问Linux系统6. 异地远程访问Linux系统7. 固定异地访问的公网地址 docker-webtop是一个基于Docker的Web桌面应用,它允许用户通过浏览器远…

二十五、openlayers官网示例CustomOverviewMap解析——实现鹰眼地图、预览窗口、小窗窗口地图、旋转控件

官网demo地址: Custom Overview Map 这个示例展示了如何在地图上增加一个小窗窗口的地图并跟随着地图的旋转而旋转视角。 首先加载了一个地图。其中 DragRotateAndZoom是一个交互事件,它可以实现按住shift键鼠标拖拽旋转地图。 const map new Map({int…

客户端Web资源缓存

为了提高Web服务器的性能,其中的一种可以提高Web服务器性能的方法就是采用缓存技术。 1.缓存 1.1.什么是缓存? 如果某个资源的计算耗时或耗资源,则执行一次并存储结果。当有人随后请求该资源时,返回存储的结果,而不是再次计算。…

【Linux】-Flink分布式内存计算集群部署[21]

注意: 本节的操作,需要前置准备好Hadoop生态集群,请先部署好Hadoop环境 简介 Flink同spark一样,是一款分布式内存计算引擎,可以支撑海量数据的分布式计算 Flink在大数据体系同样是明星产品,作为新一代的…

ElasticSearch集群重平衡(Shard allocation)案例分析及性能调优

何谓重平衡 ElasticSearch为了使数据平均分布在集群节点上,重平衡机制会由Master节点决定索引分片具体分配到哪个Data节点以及何时在节点之间迁移分片,使分片在数据大小、分片数量的层面上尽可能均匀分布在集群中的所有Data节点,充分发挥每个…

css - sass or scss ?

总的来说,Sass 和 SCSS 提供的功能是一样的,选择哪种语法主要取决于你的个人或团队的偏好。

4.2 循环语句(for, while)

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【Linux取经路】基于信号量和环形队列的生产消费者模型

文章目录 一、POSIX 信号量二、POSIX 信号量的接口2.1 sem_init——初始化信号量2.2 sem_destroy——销毁信号量2.3 sem_wait——等待信号量2.4 sem_post——发布信号量 三、基于环形队列的生产消费者模型3.1 单生产单消费模型3.2 多生产多消费模型3.3 基于任务的多生产多消费模…

期货学习笔记-横盘行情学习1

横盘行情的特征及分类 横盘行情的概念 横盘行情时中继形态的一种,一般常出现在大涨或大跌之后出现横盘行情是对当前趋势行情的修正,是对市场零散筹码的清理,是为了集中筹码更便于后期行情的展开 横盘行情的特征 1.水平运动:该…