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的浮点数版本, 不过多解释. 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是谷歌留痕?

其实它就是指你的网站在谷歌中留下的种种痕迹,无论你是在做外链,还是优化网站内容,或是改善用户体验,所有这些都会在谷歌的搜索引擎里留下一些“脚印”,用比较seo一点的说法,指的是网站在其构建和优化过程中…

5.22 R语言-正态性检验

正态性检验 正态性检验的目的是确定一组数据是否符合正态分布(也称高斯分布)。在统计分析和数据建模中,正态性假设是许多统计方法和模型的基础。了解数据是否符合正态分布有助于选择适当的统计方法和确保分析结果的有效性。 本文主要从概率…

安全牛专访美创CTO周杰:数据安全进入体系化建设阶段,数据安全管理平台应用正当时

在数字经济时代,数据作为生产要素发挥越来越重要的作用,数据安全也得到了前所未有的重视。而随着数据安全能力已经进入了相对体系化建设的阶段,更加智能化、协同化的新一代数据安全管理平台得到了各类企业组织的广泛关注。 本期牛人访谈邀请到…

java中写word换行符 poi 换行

省流: 表格外的文本,使用“\r”或者“(char)11”来换行,建议用"\r"。 表格内的文本,使用“(char)11”来换行。 正文: 测试用word文档: t1.doc内容如下: t2.doc内容如下&#xff…

芯片半导体研发公司的数据防泄漏解决方案

在当今信息化时代,半导体研发公司的数据防泄密工作显得尤为重要。半导体行业涉及大量的核心技术、研发文档和客户信息,一旦数据泄露,将给企业带来无法估量的损失。因此,建立一套有效的数据防泄密解决方案成为半导体研发公司的当务…

最新腾讯音乐人挂机脚本,号称日赚300+【永久脚本+使用教程】

项目介绍 首先需要认证腾讯音乐人,上传自己的歌曲,然后用小号通过脚本去刷自己的歌曲 ,赚取播放量 ,1万播放大概就是50到130之间 腾讯认证不需要露脸,不吞量,不封号 脚本,全自动无脑挂机&…

链表经典OJ问题【环形链表】

题目导入 题目一:给你一个链表的头节点 head ,判断链表中是否有环 题目二:给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL。 题目一 给你一个链表的头节点 head ,…

【CTF Web】CTFShow web3 Writeup(SQL注入+PHP+UNION注入)

web3 1 管理员被狠狠的教育了&#xff0c;所以决定好好修复一番。这次没问题了。 解法 注意到&#xff1a; <!-- flag in id 1000 -->但是拦截很多种字符。 if(preg_match("/or|\-|\\|\*|\<|\>|\!|x|hex|\/i",$id)){die("id error"); }使用…

Hadoop+Spark大数据技术 实验7 Spark综合编程

删除字符串 package HelloPackageimport scala.io.StdInobject DeleteStr {def main(args: Array[String]): Unit {var str1 ""var str2 ""var i 0var j 0var flag 0print("请输入第一个字符串:")str1 StdIn.readLine()print("请输…

Docker简单使用

1.简单认识 软件的打包技术&#xff0c;就是将打乱的多个文件打包为一个整体&#xff0c;比如想使用nginx&#xff0c;需要先有一台linux的虚拟机&#xff0c;然后在虚拟机上安装nginx.比如虚拟机大小1G&#xff0c;nginx100M。当有了docker后我们可以下载nginx 的镜像文件&am…

Excel/WPS《超级处理器》同类项处理,合并同类项与拆分同类项目

在工作中处理表格数据&#xff0c;经常会遇到同类项处理的问题&#xff0c;合并同类项或者拆分同类项&#xff0c;接下来介绍使用超级处理器工具如何完成。 合并同类项 将同一列中的相同内容合并为一个单元格。 1&#xff09;用分隔符号隔开 将AB列表格&#xff0c;合并后为…

chrome125.0.6422.60驱动包下载

百度网盘地址:https://pan.baidu.com/s/1DAr_O58GQ6m4sk_QePZscA?pwd=5t0j 提取码:5t0j Chrome驱动包(ChromeDriver)是一个用于支持自动化测试的工具,它提供了对Google Chrome浏览器的控制,使您可以编写和运行自动化脚本来测试网站。这个驱动程序是由Selenium项目开…

Web安全:SQL注入之时间盲注原理+步骤+实战操作

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

【Python】 Python脚本中的#!(Shebang):使用指南与最佳实践

基本原理 在Python脚本编程中&#xff0c;#!&#xff08;通常称为shebang&#xff09;是一个特殊的行&#xff0c;它告诉操作系统使用哪个解释器来执行脚本。在Unix-like系统中&#xff0c;shebang是必需的&#xff0c;因为它允许脚本作为独立的程序运行&#xff0c;而不需要显…

mysql 、oss 结合使用

以下是一个使用 Express、MySQL、OSS 和 axios 的 Node.js 示例。这个示例创建了一个 Express 服务器&#xff0c;该服务器有一个路由用于处理视频上传的请求。视频文件首先被上传到 OSS&#xff0c;然后视频的 OSS URL 被存储到 MySQL 数据库。 首先&#xff0c;我们需要安装必…

mysql实战——xtrabackup全量备份/增量备份及恢复

一、测试前准备 mysql数据库 端口3306数据文件目录 /data/mysql/3306/data 安装目录/usr/lcoal/mysql配置文件/etc/my.cnf 创建数据库 testXtra 创建备份目录 备份目录/data/backup/备份恢复数据文件目录/data/mysql/3307/data备份恢复配置文件/etc/my_3307.cnf 二、开始…

【spring】@ResponseBody注解学习

ResponseBody介绍 ResponseBody 是一个Spring框架中的注解&#xff0c;主要用于Web开发&#xff0c;特别是在Spring MVC框架中。它的核心作用是改变Spring MVC处理HTTP请求响应的行为&#xff0c;使得从控制器方法返回的数据直接写入HTTP响应体&#xff08;Response Body&…

tomcat--安全配置多虚拟机

端口8005/tcp 安全配置管理 8005是Tomcat的管理端口&#xff0c;默认监听在127.0.0.1上。无需验证就可发送SHUTDOWN (大小写敏感)这个字符串&#xff0c;tomcat接收到后就会关闭此Server。此管理功能建议禁用&#xff0c;可将SHUTDOWN改为一串猜不出的字符串实现或者port修改成…

自己手写一个线性表List【C风格】

#include <iostream>//线性表、顺序表List#define MAX_SIZE 20 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0typedef int Status;//返回状态类型 typedef int ElemType;//元素类型//结构体 typedef struct {ElemType data[MAX_SIZE];//数据类型&#x…

探索 JavaScript 新增声明命令与解构赋值的魅力:从 ES5 迈向 ES6

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; ES5、ES6介绍 文章目录 &#x1f4af;声明命令 let、const&#x1f35f;1 let声明符&a…