Redis自学之路—基础数据结构具体方法解析(五)

devtools/2024/11/20 2:32:20/

目录

简介

数据结果具体方法解析

字符串(String)

 操作命令

set设置值

setex

setnx

get获取值

del删除key

mset批量设置值

incr数字运算

append追加指令

strlen字符串长度

getset设置并返回原值

setrange设置指定位置的字符

getrange截取字符串

命令的时间复杂度

使用场景

 缓存功能

计数

共享Session

限速

哈希(Hash)

操作命令

hset设值

hget取值

hdel删除field

hlen计算field个数

hmset批量设值

hget批量取值

hexists判断field是否存在

hvals获取所有value

hgetall获取所有field与value

hincrby自增指定数字

hstrlen计算value的字符串长度

命令的时间复杂度

使用场景

列表(list)

列表类型有两个特点

操作命令

lrange 获取指定范围内的元素列表(不会删除元素)

rpush 向右插入

lpush向左插入

linsert在某个元素前或后插入新元素

lpop从列表左侧弹出(会删除元素)

rpop从列表右侧弹出(会删除元素)

lrem对指定元素进行删除

ltrim按照索引范围修剪列表

lset修改指定索引下标的元素

lindex获取列表指定索引下标的元素

llen获取列表长度

blpop和brpop阻塞式弹出元素

使用场景

消息队列

实现其他数据结构

集合(set)

集合内操作命令

sadd添加元素

srem删除元素

scard计算元素个数

sismember判断元素是否在集合中

srandmember随机从集合返回指定个数元素

spop从集合随机弹出元素

smembers获取所有元素(不会弹出元素)

集合间操作命令

sinter求多个集合的交集

sunion求多个集合的并集

sdiff求多个集合的差集

将交集、并集、差集 的结果保存

使用场景

有序集合(ZSET)

集合内操作命令

zadd添加成员

zcard计算成员个数

zscore计算某个成员的分数

zrank计算成员的排名

zrem删除成员

zincrby增加成员的分数

zrange和zrevrange返回指定排名范围的成员

zrange

zrevrange

zrangebyscore返回指定分数范围的成员

zcount返回指定分数范围成员个数

zremrangebyrank按升序删除指定排名内的元素

zremrangebyscore删除指定分数范围的成员

集合间操作命令

zinterstore交集

zunionstore并集

使用场景


简介

        Redis提供的基础数据结构常用的有5种,分别是字符串(String)、哈希(Hash)、列表(list)、集合(Set)、有序集合(zset)。

数据结果具体方法解析

字符串(String)

        字符串类型是Redis最基础的数据结构。首先键都是字符串类型,而且其他几种数据结构都是在字符串类型基础上构建的,所以字符串类型能为其他四种数据结构的学习奠定基础。字符串类型的值实际可以是字符串(简单的字符串、复杂的字符串(例如JSON\XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过512MB。

   虽然Redis是C写的,C里面有字符串<本质使用char数组来实现>,但是处于种种考虑,Redis还是自己实现了字符串类型

 操作命令

set设置值

set key value [EX seconds | PX milliseconds | EXAT timestamp | PXAT milliseconds-timestamp | KEEPTTL] [NX | XX]    [GET]

set命令有几个选项:

  • ex seconds:为键设置秒级过期时间
  • px milliseconds:为键设置毫秒级过期时间
  • nx:键必须不存在,才可以设置成功,用于添加(分布式锁使用)
  • xx:与nx相反,键必须存在,才可以设置成功,用于更新

从执行效果上看,ex参数和expire命令基本一样。还有一个需要特别注意的地方是如果一个字符串已经设置了过期时间,然后调用了set方法修改了它,它的过期时间会消失。

而nx和xx执行效果如下

除了set选项,Redis还提供了setex和setnx两个命令:

setex

为键设置秒级过期时间

setex key seconds value

setnx

键必须不存在,才可以设置成功,用于添加

setnx key value

setex和setnx的作用和ex和nx选项是一样的,

        setex为键设置秒级过期时间,

        setnx设置时键必须不存在,才可以设置成功。

get获取值

如果要获取的键不存在,则返回nil(空)

get key

del删除key

del key [key ...]

mset批量设置值

通过mset命令一次性设置4个键值对;

通过mget批量获取值;

mset key value [key value ...]

批量获取了键a、b、c、d的值:

        如果有些键不存在,那么它的值为nil(空),结果是按照传入键的顺序返回。

批量操作命令可以有效提高效率;

        1.假如没有mget这样的命令,要执行n次get命令具体耗时:

                n次 get时间 = n次网络时间 + n次命令时间

        2.使用mget命令后,要执行n次get命令操作具体耗时如下:

                n次get时间 = 1次网络时间 + n次命令时间


incr数字运算

incr命令用于对值做自增操作,返回结果分为三种情况:

  • 值不是整数,返回错误。
  • 值是整数,返回自增后的结果。
  • 键不存在,按照值为0自增,返回结果为1.

incr key

除了incr命令,

  • Redis提供了decr(自减)、
  • incrby(自增指定数字)、
  • decrby(自减指定数字)、
  • incrbyfloat(自增浮点数)
append追加指令

append可以向字符串尾部追加值

append key value

strlen字符串长度

返回字符串长度

strlen key

注意:每个中午占3个字节

getset设置并返回原值

getset和set一样会设置值,但是不同的是,它同时会返回键原来的值

getset key value

setrange设置指定位置的字符

下标从0开始计算。

setrange key offset value

getrange截取字符串

getrange截取字符串中的一部分,形成一个子串,需求指明开始和结束的偏移量,截取的范围是个闭区间。

getrange key start end

命令的时间复杂度

字符串这些命令中,

        除了del、mset、mget支持多个键的批量操作,时间复杂度和键的个数相关,为O(n),

        getrange和字符串长度相关,也是O(n),

        其余的命令基本上都是O(1)的时间复杂度,在速度上还是非常快的。

使用场景

        字符串类型的使用场景很广泛:

  •  缓存功能

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

  • 计数

        使用Redis作为计数的基础工具,它可以实现快速计数、查询缓存的功能,同时数据可以异步落地到其他数据源。

  • 共享Session

        一个分布式Web服务将用户的Session信息(例如用户登录信息)保存在各自服务器中,这样会造成一个问题,处于负载均衡的考虑,分布式服务会将用户的访问均衡到不同服务器上,用户刷新一次访问可能会发现需求重启登录,这个问题是用户无法容忍的。

        为了解决这个问题,可以使用Redis将用户的Session进行集中管理,在这种模式下只要保证Redis是高可用和扩展性的,每次用户更新或者查询登录信息都直接从Redis中集中获取。

  • 限速

        比如,很多应用处于安全的考虑,会在每次进行登录时,让用户输入手机验证码,从而确定是否是用户本人。但是为了短信接口不被频繁访问,会限制用户每分钟获取验证码的频率,例如一分钟不能超过5次。一些网站限制一个IP地址不能在一秒钟之内访问超过n次也可以采用类似的思路。

哈希(Hash)

        Java里提供了HashMap,Redis中也有类似的数据结构,就是哈希类型。但是要注意,哈希类型中的映射关系叫作field-value,注意这里的value是指field对应的值,不是键对应的值。

操作命令

基本上,哈希的操作命令和字符串的操作命令很类似,很多命令在字符串类型的命令前面加上了h字母,代表是操作哈希类型,同时还要指明操作的field的值。

hset设值

如果设置成功会返回1,反之会返回0. 此外Redis提供了hsetnx命令,它们的关系就像set和setnx命令一样,只不过作用域由键变为field。

 hset key field value [field value ...]

hget取值

如果键或field不存在,会返回nil。

hget key field

hdel删除field

hdel会删除一个或多个field,返回结果为成功删除field的个数。

hlen计算field个数

hmset批量设值

hget批量取值

hexists判断field是否存在

若存在返回1,不存在返回0

hkeys获取所有field

它返回指定哈希键所有的field

hvals获取所有value


http://www.ppmy.cn/devtools/135357.html

相关文章

Python学习26天

集合 # 定义集合 num {1, 2, 3, 4, 5} print(f"num&#xff1a;{num}\nnum数据类型为&#xff1a;{type(num)}") # 求集合中元素个数 print(f"num中元素个数为&#xff1a;{len(num)}") # 增加集合中的元素 num.add(6) print(num) # {1,2,3,4,5,6} # 删除…

基于微信小程序的河池旅游设计与实现

一、前言 随着移动互联网的快速发展&#xff0c;微信小程序以其便捷性、无需安装等优势受到广泛关注。河池拥有丰富的旅游资源&#xff0c;包括独特的自然风光&#xff08;如巴马长寿之乡的山水、宜州下枧河风光等&#xff09;、多彩的民族文化&#xff08;如壮族铜鼓文化、仫佬…

RTSP播放器EasyPlayer.js播放器UniApp或者内嵌其他App里面webview需要截图下载

EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS、WEBRTC、FMP4视频直播与视频点播等多种协议&#xff0c;支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式&#xff0c;支持MSE、WASM、WebCodec等多种解码方…

千帆启航,人才先行 | 讯方技术HarmonyOS人才训练营

HarmonyOS NEXT鸿蒙星河版已于1月份面向开发者开放申请&#xff0c;鸿蒙原生应用厂商正在加速开发&#xff0c;预计2024年中旬&#xff0c;将覆盖5000个头部App&#xff0c;鸿蒙原生应用版图基本成型&#xff0c;未来HarmonyOS将继续赋能千行百业。 为响应鸿蒙生态发展对人才需…

设备如何连接到 MySQL Server

通常,设备或其他系统(如你的监控设备)会通过 TCP/IP 协议 连接到 MySQL 服务器。这通常包括以下步骤: 配置 MySQL 允许远程连接 MySQL 默认仅允许本地连接(即只能从 MySQL 服务器所在的机器访问)。要允许远程连接,需要修改 MySQL 配置文件 my.cnf,通常位于 /etc/mysql/…

Pytest-Bdd-Playwright 系列教程(11):场景快捷方式

Pytest-Bdd-Playwright 系列教程&#xff08;11&#xff09;&#xff1a;场景快捷方式 前言1. 手动绑定场景的传统方法2. 场景快捷方式的自动绑定方法2.1 绑定所有场景2.2 绑定多个路径2.3 自动与手动绑定的结合 3. 示例&#xff1a;结合 Playwright 的实际应用3.1 项目目录结构…

DEVOPS: 集群伸缩原理

概述 阿里云 K8S 集群的一个重要特性&#xff0c;是集群的节点可以动态的增加或减少有了这个特性&#xff0c;集群才能在计算资源不足的情况下扩容新的节点&#xff0c;同时也可以在资源利用 率降低的时候&#xff0c;释放节点以节省费用理解实现原理&#xff0c;在遇到问题的…

解决游戏找不到steam_api64.dll,轻松恢复电脑Steam游戏恢复运行

文件基本信息 文件名 steam_api64.dll 类型 动态链接库文件&#xff08;Dynamic Link Library&#xff09; 适用平台 64位Windows操作系统 Steam_api64.dll是一个专门用于64位Windows操作系统的动态链接库文件&#xff0c;它是Steam游戏平台的核心组件之一。该文件主要负…