Redis常用的五种数据类型以及指令

本文详细介绍了Redis的基础知识,包括默认端口、数据库结构、key操作,以及String、List、Set、Zset和Hash等数据类型及其常用指令。涵盖了单值缓存、对象缓存、分布式锁、计数器和会话共享等应用场景。

目录

一、redis基础

1、redis的默认端口号,默认有几个数据库 

2、key相关的操作

 二、Redis数据类型以及常用指令

1、String类型

2、List类型

3、Set类型

4、Zset类型

5、Hash类型


一、redis基础

1、redis的默认端口号,默认有几个数据库 

默认端口号是6379,默认16个数据库,类似数组下标,从0开始,初始数据库默认使用0号,

通过select +数据库编号选择数据库 例如select 6 ,通过flushdb清空当前库,通过flushall清空所有数据库

2、key相关的操作

1、查看当前库所有的key :   keys *

 2、判断key是否存在 :exists key

 3、查看key是什么类型: type key

 4、删除key

  • del key   直接删除
  • unlink key     不会直接删除,会异步删除,最终也达到删除的效果

 5、给key设置过期时间:expire key

 6、查看key还有多少过期时间:ttl key

  • 有三种情况,第一种情况:当返回值大于0,表示还有多少秒过期;第二种情况:当返回值等于-1,表示永不过期;第三种情况:当返回值等于-2,表示已经过期

 二、Redis数据类型以及常用指令

1、String类型

概念:

  • String是Redis中最基本的数据类型,一个key对应一个value,数据结构为简单动态字符串,是可以修改的字符串,内部结构类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存分配频繁,当前字符串实际分配的空间capacity一般高于实际字符串长度len,当字符串长度小于1M时,每次扩容呈翻倍扩容,如果超过1M,扩容一次只会增加1M,最大不超过512M
  • String是二进制安全的,意味着Redis的String可以包含任何数据,比如jpg图片,或者序列化的对象。
     
相关指令:

1、添加数据:

  • set key value   --设置相同的key变为更新
  • mset key1 value1 key2 value2........  --同时设置多个key value
  •  setnx key value    --当不存在key时才设置
  • msetnx key1 value1 key2 value2 key3 value3 ......            --同时设置多个key value,仅当key不存在时才可添加,原子性操作,当一个key设置失败,其他都失败
  • setex key second value  --添加数据同时设置过期时间
  • getset key value  --获取值同时替换新值

2、获取数据:

  • get key 
  • mget key1 key2 key3             --同时获取多个值

3、追加数据:

  • append key         --追加value

 4、复写部分value

  • setrange key  起始位置      --复写部分value

 5、截取部分value

  • getrange key 起始位置 结束位置          --截取部分value

 6、得到value的长度

  •  strlen key     --得到String的长度

7、自增自减

  • incr key   自增1
  •  decr key  自减1
  • incrby key n      增长n
  •  decrby key  n      减少n

8、设置某个键的过期时间

  • EXPIRE  key  seconds
使用场景

1、单值缓存

  1. SET  key  value   
  2. GET  key 

2、对象缓存

  •  SET  user:1  value(json格式数据)
  • MSET  user:1:name  zhuge   user:1:balance  1888     MGET  user:1:name   user:1:balance

3、分布式锁

  1. SETNX  product:10001  true         //返回1代表获取锁成功
  2. SETNX  product:10001  true         //返回0代表获取锁失败
  3. 。。。执行业务操作
  4. DEL  product:10001            //执行完业务释放锁
  • SET product:10001 true  ex  10  nx    //防止程序意外终止导致死锁

4、计数器

INCR article:readcount:{文章id}

GET article:readcount:{文章id} 

5、Web集群session共享

spring session + redis实现session共享

6、分布式系统全局序列号    

INCRBY  orderId  1000  //redis批量生成序列号提升性能,每台服务器预先申请1000个id,各个服                                          务器再进行id自增,可能会造成不连续ID以及浪费ID,但是影响不是很大

2、List类型

概念:

  • List类型属于一键多值类型,Redis的列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的头部(左边),或者尾部(右边)
  • 它的底层是个双向链表,对两端的操作性能很高,但是通过索引下标的操作中间节点的性能会比较差
  • List的数据结构为快速链表QuickList,首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是Ziplist(压缩列表),它将所有元素紧挨着一起存储,分配的是一块连续的内存,当数据量比较多的时候才会改成Quicklist,因为普通的链表需要附加指针空间太大,浪费空间。比如一列表里只存int类型的数据,结构上还需要两个额外的指针prev和next。Redis将链表和Ziplist结合起来成了QuickList,也就是将多个Ziplist使用双向指针串起来。
     

 相关指令:

1、插入数据

  • lpush key value1 value2 value3 ....      --从左边插入,插入的结果为 value3 value2 value1
  • rpush key value1 value2 value3 ....      --从右边插入,插入的结果为 value1 value2 value3

2、删除数据

  • lpop key      --从左边弹出一个值,value就会把这个值去掉,当所有值弹出去时,key不存在
  • rpop key   --从右边弹出一个值,value就会把这个值去掉,当所有值弹出去时,key不存在

3、从key1右边取一个值放入key2左边

  • rpoplpush  key1 key2     --从key1右边取一个值放到key2的左边

4、从左边开始范围获取值

  • lrange key 起始坐标 结束坐标       --从左开始获取list的坐标范围内的值,0到-1表示获取所有值

5、从坐标开始通过下标获取值

  • lindex key  index   --从左边开始按照下表获取值

6、获取链表的长度

  • llen key    --获取链表的长度

7、在value中指定值前面或者后面插入值

  • linsert key  before|after  ”目标值“  ”插入的值“      --在目标值后面或者前面插入一个值

 8、从坐标开始删除n个目标值

  • lrem key  个数  ”目标值“    -- 从左边开始删除n个目标值

9、从左边开始替换指定下标的值

lset key index ”替换值“   --从左边开始替换指定下标的value值

3、Set类型

概念:

  • Redis Set 对外提供的功能与list类似,是一个列表的功能,特殊之处在于set是可以自动排重的,并且Set提供了一个判断成员是否存在一个set集合的重要接口,是list所没有的,Redis Set是String类型的无序集合,底层其实就是value为null的hash表,所以添加、删除、查找的复杂度都是0(1)
  • Redis Set数据结构是一个Dict字典,字典使用哈希表实现的,所有的value都指向一个内部值

 相关指令:

1、添加数据

  • sadd key  value1 value2 value3    --将多个元素添加到集合key中,如果元素存在则自动忽略

2、获取数据

  • smembers key   --从集合中获取所有元素,不删除
  • srandmember key  数量      --从集合中随机获取n个元素,不会删除元素

3、判断是否存在value

  • sismember key value    --查询集合中是否存在value元素

4、查找key中元素个数

  • scard key    --返回集合中的元素个数

5、删除元素

  • srem key  value    --从集合中删除value元素
  • spop key    --随机从集合中吐出(删除)一个元素,当集合中的元素都被吐出,集合就不存在了

6、将元素从集合key1移动到集合key2

  • smove key1 key2  value     --将value元素从set集合key1移动到set集合key2 中

7、求交集

  • sinter key1 key2     --求两集合中的交集

8、求并集

  • sunion key1 key2     --求两集合的并集

9、求差集

  • sdiff key1 key2     --求两集合的差集

4、Zset类型

概念:

  • Redis有序集合Zset与普通集合非常相似,是一个没有重复元素的集合,不同之处是有序集合的每个成员都关联了一个评分(score),这个评分被用来按照从低分到最高分的方式排序集合中的成员,集合成员是唯一的,但是评分是可以重复的。
  • Zset使用了两个数据结构,Hash以及跳跃表.

 相关指令:

1、添加数据

  • zadd key score value  score1 value1 score2 value2.....   --添加数据

2、获取数据

  • zrange key 起始下标 结束下标   --查询下标范围内的值
  • zrange key 起始下标 结束下标   withscores     --查询下标范围内的值,携带分数

3、按照分数排序

  • zrangebyscore key min  max   whithscores       --按照分数从小到大进行排序,返回携带分数

  •  zrevrangebyscore key max  min  withcores           --按照范围内分数从大到小排序

4、将集合中的某个value分数+n

  •  zincrby key n  value           将key集合中的value的分数增大n

 

5、删除集合中元素

  • zrem key value    删除集合中的某个元素

 6、查询分数区间内有多少个元素

  • zcount key min max             --查询在分数区间内共有几个元素

7、查询某个元素的排名

  • zrank key value     --查询集合中某个元素的排名 

5、Hash类型

概念:

  • Redis Hash是一个键值对集合,值是一个field和value的映射表,Hash特别适合用来存储对象,类似java里面的Map <String,Object>。例如存储一个user对象,key是user   value可以是{id :1 ,name: zhangsan , age:18}
  • Redis Hash 类型对应的数据结构有两种,ZipList,Hashtable,当field-value长度较短且个数较少的时候使用ZipList,否则使用Hashtable
     

 相关指令:

1、添加数据

  • hset  key1  field1  value1   key2   field2  value2  key3   field3  value3 .....   --添加数据
  • hsetnx key field value   添加一个值,仅当该值不存在时才能添加成功

 

2、获取数据

  • hget key field      --获取key中某个属性的值 

3、判断key中某个属性是否存在

  • hexists  key   field     判断key中某个属性是否存在

4、列出集合中所有的field

  • hkeys  key     列出该集合中所有的field

5、列出集合中所有的value

  • hvals key  查改该集合中所有的value

 6、集合中某个value自增n

  • hincrby key field n    --集合中某个属性自增n

 

<think>首先,用户的问题是关于Redis支持的五种数据类型。用户引用了三个来源,但系统指令说这些引用仅供参考,我应该专注于用户的实际问题:Redis支持的五种数据类型。 从用户的消息中: - 引用[1]提到Redis的八种数据类型,但它说“字符串 (String) 数据结构”,并提到有详细文章。 - 引用[2]说Redis五种数据类型,并讨论String。 - 引用[3]讨论了Redis的数据结构,包括string、hash、list、set、zset、hyperloglog等。 用户明确说:“我想了解Redis支持的五种数据类型”,所以我需要回答Redis支持的五种数据类型。 标准答案:Redis支持多种数据类型,但传统上被称为五种核心数据类型:Strings、Hashes、Lists、Sets、Sorted Sets(Zsets)。引用[3]提到了hyperloglog,但用户指定了“五种”,所以我应该聚焦于这五种。 系统指令: - 所有行内数学表达式必须用$...$格式(但这里可能不涉及数学)。 - 独立公式用$$...$$(可能不适用)。 - LaTeX语法正确(确保代码块正确)。 - 使用中文回答。 - 生成相关问题(在末尾)。 - 回答中引用的段落末尾添加引用标识(如[^1])。 回答结构: - 系统指令要求帮助用户逐步解决问题,结构清晰。 - 用户的问题是介绍五种数据类型。 步骤: 1. **介绍Redis数据类型**:简要说明Redis支持多种数据类型,核心是五种。 2. **详细描述每种类型**: - String - Hash - List - Set - Sorted Set (Zset) 3. **解释底层数据结构**(可选,用户提到底层原理)。 4. **添加代码示例**(如果适用),因为系统示例中有Python代码。 5. **添加引用标识**:基于提供的引用。引用[1]、[2]、[3]都有相关信息,我应该在相关段落末尾添加标识。 6. **生成相关问题**:在末尾添加类似“§§相关问题§§”部分。 生成的引用标识:[^1], [^2], [^3] 对应于用户提供的引用。 内容大纲: - **开头**: Redis是一个高性能的键值存储系统,支持多种数据类型。核心的五种数据类型是Strings、Hashes、Lists、Sets和Sorted Sets。[引用来源] - **每种类型**: - **String**: 最基本类型,存储字符串、数字等。最大512MB。常用命令如SET, GET。[^2] - **Hash**: 存储字段和值的映射,适合存储对象。[底层实现是哈希表] - **List**: 字符串列表,有序,支持插入和删除操作。[底层是双向链表] - **Set**: 无序集合,元素唯一,不允许重复。[底层是哈希表或intset] - **Sorted Set (Zset)**: 有序集合,每个元素关联一个分数,用于排序。[底层是跳跃表和哈希表] - **底层原理简述**: 简要提到数据结构。 - **结尾**: 总结或过渡到相关问题。 相关问题: 1. Redis的每种数据类型的最佳应用场景是什么? 2. 如何选择合适的数据类型来优化Redis性能? 3. Redis中HyperLogLog和Streams等其他数据类型的介绍? 确保中文回答。 添加代码示例: 例如,展示一些基本的Redis命令。 最后,系统指令说“生成相关问题”,所以添加“§§相关问题§§”部分。 </think>### Redis支持的五种数据类型介绍 Redis 是一个高性能的键值存储系统,支持多种数据类型以满足不同应用需求。核心的五种数据类型包括:Strings(字符串)、Hashes(哈希)、Lists(列表)、Sets(集合)和 Sorted Sets(有序集合)。每种数据类型都有其特定用途、底层实现和常用命令。下面我将逐一介绍它们,并基于标准Redis文档和底层原理进行说明[^1][^2][^3]。 1. **Strings(字符串)** - Strings 是最基本的数据类型,用于存储文本、数字或二进制数据(如序列化对象)。每个键值对最大支持512MB存储空间。 - **底层实现**:基于简单动态字符串(SDS)数据结构,高效支持追加和长度查询。 - **常用命令**:`SET key value`(设置值)、`GET key`(获取值)、`INCR key`(数字递增)。 - **应用场景**:缓存用户会话、计数器或存储小型配置文件[^2]。 2. **Hashes(哈希)** - Hashes 存储字段(field)和值(value)的映射,适合表示对象(如用户信息)。每个哈希最多可存储约40亿个字段值对。 - **底层实现**:使用哈希表(字典结构),通过哈希函数优化查找效率。 - **常用命令**:`HSET key field value`(设置字段值)、`HGET key field`(获取字段值)、`HGETALL key`(获取所有字段值)。 - **应用场景**:存储用户配置文件或商品属性,减少小键的数量[^1][^3]。 3. **Lists(列表)** - Lists 是有序的字符串集合,支持从头部或尾部插入和删除元素。元素可重复。 - **底层实现**:基于双向链表(linked list)或压缩列表(ziplist),在元素少时优化内存。 - **常用命令**:`LPUSH key value`(头部插入)、`RPOP key`(尾部删除)、`LRANGE key start stop`(范围查询)。 - **应用场景**:消息队列、最新消息列表或历史记录[^3]。 4. **Sets(集合)** - Sets 是无序的唯一元素集合,常用于去重操作。支持集合运算(如并集、交集)。 - **底层实现**:使用哈希表实现,确保元素唯一性;或 intset(整数集合)优化小整数存储。 - **常用命令**:`SADD key member`(添加元素)、`SMEMBERS key`(获取所有元素)、`SINTER key1 key2`(交集计算)。 - **应用场景**:标签系统、好友关系或唯一内容过滤[^1][^2]。 5. **Sorted Sets(有序集合,Zsets)** - Sorted Sets 类似 Sets,但每个元素关联一个分数(score)用于排序。元素唯一,但分数可重复。 - **底层实现**:组合跳跃表(skiplist)和哈希表,实现高效排序和范围查询。 - **常用命令**:`ZADD key score member`(添加元素)、`ZRANGE key start stop`(范围检索)、`ZSCORE key member`(获取分数)。 - **应用场景**:排行榜、优先级队列或时间序列数据[^1][^3]。 #### 底层原理简要说明 Redis数据类型底层采用高效的数据结构(如哈希表、链表、跳跃表),确保低延迟和高吞吐。Redis 的内存管理优化了不同类型的使用场景,例如 Lists 在元素少时使用 ziplist 节省空间,Sets 在元素为整数时用 intset。此外,Redis 还支持其他扩展类型(如 HyperLogLog 用于基数统计),但上述五种是核心且最常用的[^1][^2][^3]。 #### 示例命令 以下是使用 Redis CLI 的简单示例: ```bash # Strings 示例 SET username "Alice" GET username # 输出 "Alice" # Hashes 示例 HSET user:1 name "Bob" age 30 HGET user:1 name # 输出 "Bob" # Lists 示例 LPUSH messages "msg1" LRANGE messages 0 -1 # 输出 ["msg1"] # Sets 示例 SADD tags "redis" "database" SMEMBERS tags # 输出 ["redis", "database"] # Sorted Sets 示例 ZADD leaderboard 100 "Player1" ZRANGE leaderboard 0 -1 WITHSCORES # 输出 ["Player1", "100"] ``` 以上介绍基于 Redis 的官方特性和常见用法。如果您有具体场景需求,我可以进一步解释如何选择数据类型或优化性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值