当前位置: 首页 > news >正文

Redis基础数据类型

一、Redis介绍

Redis全称Remote Dictionary Service,即远程字典服务。

Redis作为一款开源的基于内存的键值对存储系统,主要被用作高性能缓存服务器使用,也可作为消息中间件、Session共享等,官方概述如下:

Redis 是世界上最快的内存数据库。它提供适用于缓存、向量搜索和 NoSQL 数据库的云和本地解决方案,可无缝集成到任何技术栈中——使数字客户能够轻松构建、扩展和部署我们世界赖以运行的快速应用。

Redis 提供 数据结构,例如 字符串、 哈希、 列表、 集合、带有范围查询的 有序集合、 位图、 HyperLogLog、 地理空间索引以及 流。Redis 内置了 复制、 Lua 脚本、 LRU 逐出、 事务以及不同级别的 磁盘持久化,并通过 Redis Sentinel 提供高可用性,通过 Redis Cluster 提供自动分区。

等等.....

二、Redis基础数据类型

Redis作为键值对存储系统,以CS架构模式提供服务,数据的组织形式为KV键值对。即在Redis服务器中会维护大量KV键值对,客户端可以通过K获取V,以及其他的增删改查操作。对应V的数据类型包含很多,如上文提及的:字符串、哈希、列表、集合、有序结合、位图等等。其中字符串、哈希、列表、集合、有序结合这五种数据结构使用较为普遍,本文主要粗略总结介绍上述五种基础数据类型。

三、string - 字符串

string数据类型,即字符串。其类型上是一种动态字符串,会根据字符串长度进行扩容或者缩容。并且是二进制安全的字符串,可以用作存储图片、二进制协议等二进制数据。

其常用基础命令包含:

# 设置 key 的 value 值
SET key val
# 获取 key 的 value
GET key
​
# 执行原子加一的操作
INCR key
# 执行原子加一个整数的操作
INCRBY key increment
# 执行原子减一的操作
DECR key
# 执行原子减一个整数的操作
DECRBY key decrement
​
# 如果key不存在,这种情况下等同SET命令。 当key存在时,什么也不做
# set Not eXist ok 这个命令是否执行了 0,1 是不是操作结果是不是成功
SETNX key value
​
# 删除 key val 键值对
DEL key
​
# 设置或者清空key的value(字符串)在offset处的bit值。 setbit embstr raw int
# 动态字符串 能够节约内存
SETBIT key offset value
# 返回key对应的string在offset处的bit值
GETBIT key offset
# 统计字符串被设置为1的bit数.
BITCOUNT key

对应string数据类型的应用就包括:数据对象存储、累加器、分布式锁、位运算等。

其中对象存储通过set、get即可实现一般对象的存储。累加器通过incr、decr实现V的自增、自减操作。

分布式锁关键命令通过SETNX配合EXPIRE命令实现。位运算主要应用可以设想签到场景。

四、list - 列表

list列表,其内部通过双向链表实现,列表首尾操作时间复杂度为O(1),查找中间元素时间复杂度为O(n)。

常用基础命令:

# 从队列的左侧入队一个或多个元素
LPUSH key value [value ...]
# 从队列的左侧弹出一个元素
LPOP key
# 从队列的右侧入队一个或多个元素
RPUSH key value [value ...]
# 从队列的右侧弹出一个元素
RPOP key
# 返回从队列的 start 和 end 之间的元素 0, 1 2 负索引
LRANGE key start end
# 从存于 key 的列表里移除前 count 次出现的值为 value 的元素
# list 没有去重功能 hash set zset
LREM key count value
# 它是 RPOP 的阻塞版本,因为这个命令会在给定list无法弹出任何元素的时候阻塞连接
BRPOP key timeout # 超时时间 + 延时队列

对于list的应用也是对应到其基础命令,既然其可以实现双端操作,且时间复杂度为O(1)则可以利用双端操作实现栈、队列。

同时list提供了BRPOP、BLPOP阻塞弹出,则可以进一步实现阻塞队列。即通过LPUSH + BRPOP 或者 RPUSH + LRPOP实现。

另外还可以通过LTRIM实现对list的裁剪,该应用可以放到一些需要维护一个固定窗口记录的应用场景。

五、hash - 哈希

hash结构也是KV键值对维护的数据类型,Redis中的hash作为Redis KV键值对中的V,其对应关系也就多了一层K,在Redis的hash中称为field。

常用基础命令:

# 获取 key 对应 hash 中的 field 对应的值
HGET key field
# 设置 key 对应 hash 中的 field 对应的值
HSET key field value
# 设置多个hash键值对
HMSET key field1 value1 field2 value2 ... fieldn valuen
# 获取多个field的值
HMGET key field1 field2 ... fieldn
# 给 key 对应 hash 中的 field 对应的值加一个整数值
HINCRBY key field increment
# 获取 key 对应的 hash 有多少个键值对
HLEN key
# 删除 key 对应的 hash 的键值对,该键为field
HDEL key field

hash的应用场景更多就放在了存储对象的场景,作为一种高效清晰的数据组织方式使用。

六、set - 集合

set集合即数学范畴中的集合这一概念,其中存储的元素是唯一的。且set中的元素不是有序的,如果要求有序还有一种数据类型zset - 有序集合。

常用基础命令:

# 添加一个或多个指定的member元素到集合的 key中
SADD key member [member ...]
# 计算集合元素个数
SCARD key
# SMEMBERS key
SMEMBERS key
# 返回成员 member 是否是存储的集合 key的成员
SISMEMBER key member
# 随机返回key集合中的一个或者多个元素,不删除这些元素
SRANDMEMBER key [count]
# 从存储在key的集合中移除并返回一个或多个随机元素
SPOP key [count]
# 返回一个集合与给定集合的差集的元素
SDIFF key [key ...]
# 返回指定所有的集合的成员的交集
SINTER key [key ...]
# 返回给定的多个集合的并集中的所有成员
SUNION key [key ...]

set的应用,在平常场景中对于集合的交并差集操作就很多,比如两个用户的共同好友(交集)、可能认识的人(差集)。

再有就是利用set维护唯一元素的特性,可以在抽奖场景中使用。

七、zset - 有序集合

zset的特性就是在set的基础上,保证了集合内部元素的有序。

常用基础命令:

# 添加到键为key有序集合(sorted set)里面
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
# 从键为key有序集合中删除 member 的键值对
ZREM key member [member ...]
# 返回有序集key中,成员member的score值
ZSCORE key member
# 为有序集key的成员member的score值加上增量increment
ZINCRBY key increment member
# 返回key的有序集元素个数
ZCARD key
# 返回有序集key中成员member的排名
ZRANK key member
# 返回存储在有序集合key中的指定范围的元素 order by id limit 1,100
ZRANGE key start stop [WITHSCORES]
# 返回有序集key中,指定区间内的成员(逆序)
ZREVRANGE key start stop [WITHSCORES]

zset的应用,可以利用其有序的特性。在排行榜场景可以利用zset实现。

 更多资料:0voice · GitHub

http://www.lryc.cn/news/614002.html

相关文章:

  • 【DFS系列 | 递归】DFS算法入门:递归原理与实现详解
  • 【MySQL】初识索引
  • 优选算法2
  • Redis中String数据结构为什么以长度44为embstr和raw实现的分界线?
  • 【JavaEE】(10) JavaEE 简介
  • 多级缓存架构:新品咖啡上线引发的数据库压力风暴与高并发实战化解方案
  • Spring Boot Redis 缓存完全指南
  • 破解 Django N+1 查询困境:使用 select_related 与 prefetch_related 实践指南
  • sqlite的sql语法与技术架构研究
  • http请求响应
  • npm run 常见脚本
  • token过期为了保证安全,refresh token不过期,那么拿到refresh token就可以获取token,不还是不安全吗
  • C/C++与JavaScript的WebAssembly协作开发指南
  • 【科研绘图系列】R语言绘制气泡图
  • 【优选算法】多源BFS
  • CALL与 RET指令及C#抽象函数和虚函数执行过程解析
  • 【代码随想录day 14】 力扣 111.二叉树的最小深度
  • 集成电路学习:什么是URDF统一机器人描述格式
  • Spring MVC 父子容器深度解析:原理、实战与优化
  • Pytest项目_day09(skip、skipif跳过)
  • iOS 签名证书全流程详解,申请、管理与上架实战
  • 三方相机问题分析七:【datespace导致GPU异常】facebook 黑块和Instagram花图问题
  • 【性能测试】-2- JMeter工具的使用
  • 网吧在线选座系统|基于java和小程序的网吧在线选座小程序系统设计与实现(源码+数据库+文档)
  • 【Jmeter】设置线程组运行顺序的方法
  • Baumer相机如何通过YoloV8深度学习模型实现危险区域人员的实时检测识别(C#代码UI界面版)
  • 利用千眼狼sCMOS相机开展冷离子云成像与测量实验
  • 平板探测器的主要技术指标
  • Spring Boot 优雅配置InfluxDB3客户端指南:@Configuration + @Bean + yml实战
  • C# 异步编程(GUI程序中的异步操作)