Redis的数据结构及对应命令(redis的数据结构及对应命令是什么)
mhr18 2024-10-28 16:19 36 浏览 0 评论
String(字符串)
Redis字符串是简单动态的字符串,是可以修改的字符串,内部结构上实现了类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配
(1)声明一个String型变量,使用 set 变量名 变量值 命令。例如:set a aa,设置一个变量a,变量值为aa。
(2)声明一个String变量,同时设置它的过期时间,使用 setex 变量名 过期时间 变量值 命令。例如:setex c 10 cc,设置变量c,值为cc,过期时间为10秒。
(3)声明一个String变量,同时设置它的过期时间,单位为毫秒,使用 psetex 变量名 过期时间 变量值 命令。例如:psetex c 10000 cc,设置变量c,值为cc,过期时间为10秒。
(4)返回一个String变量对应的变量值,使用 get 变量名 命令。
(5)返回一个String的子串,使用 getrange 变量名 开始索引 结束索引 命令。
(6)设置一个变量的值为一个新值,同时返回它的旧值,使用 getset 变量名 变量值 命令。例如:getset a a111,设置变量a的值为a111,同时返回它的旧值。
后面的分布式锁会用到。
(7)同时设置多个String变量,使用 mset 变量1 值1 变量2 值2 ... 命令。例如:mset a1 aa1 b1 bb11,同时设置a1,b1两个变量值。
(8)获取多个变量对应的值,使用 mget 变量1 变量2 变量n 命令。例如:mget a b c,依次返回变量a,b,c的值。
(9)设置一个变量,并判断它是否已存在,使用 setnx 变量 值 命令,如果值已存在,则返回0,如果值不存,则设置并返回1。例如:setnx a avalue,设置a的值为avalue。
(10)同时设置多个变量,并判断它们是否已存在,使用 msetnx 变量1 值1 变量2 值2 ... 命令。如果其中有一个存在,则全部失败,它有事务的原子性,要么都成功,要么都失败。
(11)返回字符串的长度,使用 strlen 变量名 命令。
(12)对一个value进行加1操作,使用 incr 操作的数值变量 命令,返回增长后的值,要求操作对象的值是数字类型。
(13)对一个value进行增加操作,并自定义步长,使用 incrby 操作的数值变量 增长步长 命令,返回增长后的值。
(14)对一个value进行减1操作,使用decr 操作的数值变量 命令。
(15)对一个value进行减小操作,并自定义步长,使用 decr 操作的数值变量 减小量 命令。
(16)在一个变量后面进行追加操作,使用 append 变量名 追加的值 命令。
Hash(哈希)
Redis中的字典相当于Java的HashMap,其内部结构与HashMap也是一致的,同样是数组+链表的二维结构,在一维发生碰撞的时候,会使用碰撞的元素把链表串接起来。
关于扩容
当hash表中的元素个数在等于第一维的数组长度的时候,就会进行扩容,扩容的新数组是原数组大小的2倍。
(1)创建一个Hash变量,使用 hset 名称 键 值 命令。例如:hset map name jim,声明一个Hash变量map,它的键为name,值为jim。
(2)判断某个键是否在Hash中,使用 hexists Hash名称 键名称 命令,存在返回1,不存在返回0。例如:hexists map name,判断name是否是map中存在的键。
(3)根据键取出Hash中的值,使用 hget Hash名称 键名称 命令,存在返回值,不存在返回null。例如:hget map name,返回map中键name所对应的值。
(4)获取Hash中所有的键值对,使用 hgetall Hash变量名 命令。例如,hgetall map,返回map中所有的键值对。
(5)获取一个Hash中所有的键集合,使用 hkeys Hash变量名 命令。例如 hkeys map,返回map中所有的键。
(6)获取一个Hash中所有的值集合,使用 hvals Hash变量名 命令。例如 hvals map,返回map中所有的值。
(7)获取一个Hash的长度,使用 hlen Hash变量名 命令。例如 hlen map,返回map的长度。
(8)同时获取一个哈希中多个键对应的值,使用 hmget Hash变量名 键1 键2 ... 命令。例如 hmget map name age,同时获取map中name和age对应的值。
(9)同时设置多个键值对,使用 hmset Hash变量名 键1 值1 键2 值2 ... 命令。例如 hmset map key1 val1 key2 val2。
(10)删除指定的键值对,使用 hdel Hash变量名 键1 键2 ... 命令,成功则返回删除的个数。例如 hdel map key2 key3,删除map中的key2,key3。
(11)为一个Hash中的键设置对应的值,同时判断键是否已存在,使用 hsetnx Hash变量名 键 值 命令,存在则替换不成功,返回0。
List(列表,存储的元素可重复且有序)
Redis列表相当于Java语言的LinkedList,它是双向链表而不是数组,意味着List的插入和删除操作相当的快,时间复杂度O(1),获取头结点和尾结点也会相当的快,但是索引定位由于需要遍历链表,导致速度很慢,尝尝用作消息队列。当列表最后出来一个元素之后,数据结构将会被自动删除,内存回收。
(1)存入数据到List中,使用lpush List名称 数据值 命令,例如:lpush list 1 2 3 4 5 6,把1 2 3 4 5 6存入list这个List中。
(2)查看数据类型,使用 type 操作对象 命令,例如:type list,查看list对象的数据类型。
(3)查看List的长度,使用 llen 操作对象 命令,例如:llen list,查看list对象的长度。
(4)查看List中指定范围内的数据,使用 lrange 操作对象 索引开始 索引结束 命令,例如:lrange list 0 4,查看list对象中索引为0到4的数据。
注意:List中元素的存放顺序是倒叙的,即先存入的在尾部,后存入的在头部。
(5)设置指定索引处对应的值,使用命令 lset 操作对象 索引 指定值 命令,例如:lset list 0 999,设置list对象0索引处的值为999。
(6)获取指定索引处的元素值,使用命令 lindex 操作对象 索引 命令,例如:lindex list 0,获取list对象索引为0处的值。
(7)移除列表第一个元素,使用 lpop 操作对象 命令,例如:lpop list,移除list列表第一个元素。
(8)移除列表最后一个元素,使用 rpop 操作对象 命令,例如:rpop list,移除list列表最后一个元素。
Set(集合,存储的元素不可重复且无序)
Redis集合相当于java里的hashset,其内部的键值对是无序的唯一的,其内部实现相当于hash,但是和hash不同的是,所有的value都是一个值为NULL。
(1)创建一个集合并添加元素,使用 sadd 集合名称 值1 值2 .... 命令,例如:sadd s1 a b c d,创建s1集合,并把a b c三个值添加进去。
(2)查看数据类型,使用 type 操作对象 命令,例如:type s1,查看s1对象的数据类型。
(3)返回集合的元素个数,使用 scard 集合名称 命令,例如:scard s1,返回s1集合中的元素个数。
(4)重命名集合,使用 rename 原集合名称 新名称 命令,例如:rename s1 set1,把集合s1重命名为set1。
(5)查看元素中的成员,使用 smembers 集合名称 命令,例如:smembers set1,查看集合set1中的成员。
注意:Set集合存储的元素是无序的。
(6)查看两个集合的差集,使用 sdiff 集合1 集合2 命令,例如:sdiff set1 set2,查看set1 和set2的差集。算法为:哪个集合在前面,就找出它在另一个集合中没有的元素。set1在前面,就找出set1中set2所没有的元素。
(7)查看两个集合的交集,使用 sinter 集合1 集合2 命令,例如:sinter set1 set2,查看set1和set2都有的元素。
(8)求两个集合的并集,使用 sunion 集合1 集合2 命令,例如:sunion set1 set2,查看set1和set2的并集。
(9)返回指定集合中随机几位数的元素,使用 srandmember 集合 返回个数 命令,例如:srandmember set1 2,返回set1中,随机的两个元素。
(10)返回一个value是不是指定集合中的value,使用 sismember 集合 value 命令,是则返回1,不是则返回2。例如:sismember set2 a,判断a是不是集合set2中的集合。
(11)移除集合中指定的元素,使用命令 srem set1 元素1 元素2 命令,返回的是移除元素的个数。例如:srem set2 c d,移除集合set2中的c,d元素。
(12)移除集合中随机的一个元素,并返回它,使用命令 spop 集合 命令。例如:spop set2,随机移除set2中的一个元素,并返回它。
实际应用场景:例如在设计秒杀系统的时候,可以提前使用脚本生成一些不会重复的订单号,把它放入set集合订单池中,在开启秒杀后,直接从订单池集合中取出并删除此订单号。
SortedSet即zset(有序集合,元素不可重复且有序,因为每个元素都会关联一个double类型的分数,通过分数来进行从大到小的排序。元素不可重复,但分数可重复)
常用的场景为保存粉丝的列表,value的是粉丝的用户ID,score是关注的时间。其是一个set,保证内部value的唯一性,另外一方面给每个value赋予一个score,代表value的排序权重,
(1)创建一个zset集合并添加元素,使用 zadd 集合名称 分数1 元素1 分数2 元素2 .... 命令。例如:zadd sortedset1 100 a 200 b 300 c,创建sortedset1有序集合并添加元素。
(2)查看zset集合的长度,使用命令 zcard 集合名称 命令。例如:zcard sortedset1,查看sortedset1有序集合的长度。
(3)查看某个元素对应的分数,使用 zscore 集合名称 键名称 命令。例如:zscore sortedset1 a,查看sortedset1集合中,元素a对应的分数。
(4)返回指定分数范围内,集合元素的个数,使用 zcount 集合名称 起始分数 结束分数 命令。例如:zcount sortedset1 0 220,查看集合sortedset1中分数位于0到220之间的元素的个数。
(5)返回指定元素对应的索引,使用 zrank 集合名称 元素 命令。例如:zrank sortedset1 a,返回集合sortedset1中,元素a对应的索引。
(6)增加某个元素对应的分数,改变它的排序,使用 zincrby 集合名称 增加的分数 元素名称 命令。例如:zincrby sortedset1 1000 a,为集合sortedset1中元素a增加1000的分数。
(7)查看集合第a到b个元素,使用 zrange 集合名称 a b 命令,其中a,b相当于索引范围。例如:zrange sortedset1 0 100,查看集合sortedset1中第0到第100个元素。
(8)查看集合第a到b个元素同时显示对应的分数,使用 zrange 集合名称 a b withscores 命令。例如:zrange sortedset1 0 100 withscores,查看集合sortedset1中第0到第100个元素同时显示分数。
相关推荐
- 如何检查 Linux 服务器是物理服务器还是虚拟服务器?
-
在企业级运维、故障排查和性能调优过程中,准确了解服务器的运行环境至关重要。无论是物理机还是虚拟机,都存在各自的优势与限制。在很多场景下,尤其是当你继承一台服务器而不清楚底层硬件细节时,如何快速辨识它是...
- 第四节 Windows 系统 Docker 安装全指南
-
一、Docker在Windows上的运行原理(一)架构限制说明Docker本质上依赖Linux内核特性(如Namespaces、Cgroups等),因此在Windows系统上无法直...
- C++ std:shared_ptr自定义allocator引入内存池
-
当C++项目里做了大量的动态内存分配与释放,可能会导致内存碎片,使系统性能降低。当动态内存分配的开销变得不容忽视时,一种解决办法是一次从操作系统分配一块大的静态内存作为内存池进行手动管理,堆对象内存分...
- Activiti 8.0.0 发布,业务流程管理与工作流系统
-
Activiti8.0.0现已发布。Activiti是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员。其核心是超快速、稳定的BPMN2流程引擎。Activiti可以...
- MyBatis动态SQL的5种高级玩法,90%的人只用过3种
-
MyBatis动态SQL在日常开发中频繁使用,但大多数开发者仅掌握基础标签。本文将介绍五种高阶技巧,助你解锁更灵活的SQL控制能力。一、智能修剪(Trim标签)应用场景:动态处理字段更新,替代<...
- Springboot数据访问(整合Mybatis Plus)
-
Springboot整合MybatisPlus1、创建数据表2、引入maven依赖mybatis-plus-boot-starter主要引入这个依赖,其他相关的依赖在这里就不写了。3、项目结构目录h...
- 盘点金州勇士在奥克兰13年的13大球星 满满的全是...
-
见证了两个月前勇士与猛龙那个史诗般的系列赛后,甲骨文球馆正式成为了历史。那个大大的红色标志被一个字母一个字母地移除,在周四,一切都成为了过去式。然而这座,别名为“Roaracle”(译注:Roar怒吼...
- Mybatis入门看这一篇就够了(mybatis快速入门)
-
什么是MyBatisMyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为M...
- Springboot数据访问(整合druid数据源)
-
Springboot整合druid数据源基本概念SpringBoot默认的数据源是:2.0之前:org.apache.tomcat.jdbc.pool.DataSource2.0及之后:com.z...
- Linux 中的 "/etc/profile.d" 目录有什么作用 ?
-
什么是/etc/profile.d/目录?/etc/profile.d/目录是Linux系统不可或缺的一部分保留配置脚本。它与/etc/profile文件相关联,这是一个启动脚本,该脚...
- 企业数据库安全管理规范(企业数据库安全管理规范最新版)
-
1.目的为规范数据库系统安全使用活动,降低因使用不当而带来的安全风险,保障数据库系统及相关应用系统的安全,特制定本数据库安全管理规范。2.适用范围本规范中所定义的数据管理内容,特指存放在信息系统数据库...
- Oracle 伪列!这些隐藏用法你都知道吗?
-
在Oracle数据库中,有几位特殊的“成员”——伪列,它们虽然不是表中真实存在的物理列,但却能在数据查询、处理过程中发挥出意想不到的强大作用。今天给大家分享Oracle伪列的使用技巧,无论...
- Oracle 高效处理数据的隐藏神器:临时表妙用
-
各位数据库搬砖人,在Oracle的代码世界里闯荡,处理复杂业务时,是不是总被数据“搅得头大”?今天给大家安利一个超实用的隐藏神器——临时表!当你需要临时存储中间计算结果,又不想污染正式数据表...
- Oracle 数据库查询:多表查询(oracle多表关联查询)
-
一、多表查询基础1.JOIN操作-INNERJOIN:返回两个表中满足连接条件的匹配行,不保留未匹配数据。SELECTa.emp_id,b.dept_nameFROMempl...
- 一文掌握怎么利用Shell+Python实现多数据源的异地备份程序
-
简介:在信息化时代,数据安全和业务连续性已成为企业和个人用户关注的焦点。无论是网站数据、数据库、日志文件,还是用户上传的文档、图片等,数据一旦丢失,损失难以估量。尤其是当数据分布在多个不同的目录、服务...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 如何检查 Linux 服务器是物理服务器还是虚拟服务器?
- 第四节 Windows 系统 Docker 安装全指南
- C++ std:shared_ptr自定义allocator引入内存池
- Activiti 8.0.0 发布,业务流程管理与工作流系统
- MyBatis动态SQL的5种高级玩法,90%的人只用过3种
- Springboot数据访问(整合Mybatis Plus)
- 盘点金州勇士在奥克兰13年的13大球星 满满的全是...
- Mybatis入门看这一篇就够了(mybatis快速入门)
- Springboot数据访问(整合druid数据源)
- Linux 中的 "/etc/profile.d" 目录有什么作用 ?
- 标签列表
-
- oracle位图索引 (74)
- oracle基目录 (50)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (53)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)