搜索
首页数据库Redis整理一些常见Redis数据结构(总结)

整理一些常见Redis数据结构(总结)

Dec 06, 2021 am 09:57 AM
redis数据结构

本篇文章给大家整理分享一些常见Redis数据结构,还有一些常用指令整理,希望对大家有所帮助!

整理一些常见Redis数据结构(总结)

什么是数据结构?

有Java基础的应该知道常用的一些数据结构,比如数组、队列、栈等等... 那Redis的数据结构跟Java的数据结构有什么区别吗?答案是有的,如果一些小伙伴了解的Map的话就知道Map中有一个Key值和一个Value值,Redis的数据结构也是这样的。

Redis的数据结构:String、List、Hash、Set的话都是有一个Key值和一个Value值。

Key值是名字,Value值就是数据。这两个是绑定在一起的,一个Key值对应一个Value值,我们称之这样的为键值对。【相关推荐:Redis视频教程

Redis常用的基本命令

在Redis中,在不同的场景下会使用不同的命令。但是不是每个命令都需要记住呢?不是的,只需要熟悉最常用的命令就好了,在需要使用一些少用的命令可以去官方文档查阅即可。下面来介绍Redis中一些常用的命令。

1.# exists(判断key值是否存在):如果存在返回1,反之返回0
  例子: exists name(name为key)

2.# del(删除key): 删除成功返回1,反之返回0

3.# type(判断key的类型)

4.ttl(查看key存活时间

想学习更多命令可以自行到中文文档进行查询:http://www.redis.cn/

String类型的介绍与使用场景

String字符串类型是Redis中最基本的数据类型,在Redis中的应用场景很广,一个key对应一个value。

Redis的String是动态字符串,可修改的字符串,它的内部结构类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的分配。

String类型是二进制安全的,意思就是Redis的String可以包含任何的数据。如:数字,字符串,图片等

String类型的应用场景:验证码、计数器、订单重复提交、用户登录信息、商品详情的实现

String的常用命令

1.# set/get 设置和获取key-value 注意中间一定要加空格
  例子: set xxx(key) xxx(value) 
         get xxx(key)
         
2.# mget/mset 批量设置或获取多个key的值
     mset user:name jack user:age 2
     mget user:name user:age
     
3.# incr incr对key对应的值进行加1操作,并返回新的值
    incr video:uv:1 
     
4. # incrby 将key对应的数字加increment.如果key不存在,操作之前,key就会被置为0
    incrby video:uv:1 10
    
5.# setex 设置key对应字符串value,并且设置key在给定的seconds时间之后超时过期操作
    setex code 20 778899 (设置一个key为code value为778899 20秒后过期)4

6. # setnx 将key设置值为value,如果存在该key那么什么都不做,如果不存在key那么等同于set命令
   setnx name xdclass.net
 
7. # getset 设置key的值,并返回key旧的值
    get name uuuuu (这时会返回xdclass.net,重新在get一下会获得重新设置的值uuuuu)

注意: 值的长度不能超过512MB,遵循key的命名规范:业务名:表明:ID(不要过长,用冒号分割)

String的内部结构(内部结构为深入探究)

Redis中没有使用C语言的传统字符串来表示,而是构建了一种名为简单动态字符串(SDS)的抽象类型。为什么Redis要用自己构建的SDS而不是直接用C语言的String呢?原因其实很简单,就是为了提升Redis操作的性能。

SDS字符串与C语言字符串具有什么优势?

  • 常数复杂度获取字符串长度:C语言想获取长度,那么它必须要遍历一整个字符串才行。SDS通过len属性获取SDS字符串长度的时间复杂度从O(N)变成了O(1),保证了获取字符串长度时不会成为Redis的性能瓶颈。

  • 减少修改带来的内存重新分配次数:内存重分配就是说在修改字符串时,由于内存空间的不足或者是超出了,需要对执行内存的重分配操作,这种操作由于会涉及到内存,所以导致时间的成本高,所以我们应该尽量的避免内存重分配。而在SDS就是有len和free这两个属性,可以使用优化策略来减少对内存重分配次数。

List类型的介绍与使用场景

List类型说白了就是一个链表 插入元素进去后是有序排列的,value值是可以重复的,可以通过对应的下标获取对应的value值,链表的左右两边都能进行插入和删除数据。在插入时,如果该键并不存在,那么Redis将为该键创建一个新的链表。与此相反,如果这个链表中的所有元素都被删除,那么该键也会被删除掉。

应用场景:简单队列、最新评论列表、非实时排行榜:定时计算榜单,如手机日销榜单

List的常用命令

1. # lpush 将一个或多个值插入到列表头部
     lpush phone:rank:daily iphone6
     
2. # rpop 移除并获取列表的最后一个元素
     rpor phone:rank:daily 

3. # llen 获取列表长度
     llen phone:rank:daily
     
4. # lrange 获取key对应的list的指定下标范围元素,其中0表示列表的第一个元素,-1表示获取列表的所有元素     
     lrange phone:rank:daily 0 -1
     
5. # rpush 在key对应的list尾部添加一个元素
     rpush phone:rank:daily xiaodi 

6. # lpop 从key对应的List的尾部删除一个元素,并返回该元素
     lpop phone:rank:daily
     
7. # bropo 移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止    
     brpop phone:rank:daily 20
     
8. # lrem 移除元素
     lrem phone:rank:daily 2 a

List的内部结构(内部结构为深入探究)

上面了解了List的常用命令的使用,我们现在就来看下list的底层结构。

List有两种实现方式

  • 压缩链表(ziplist):是Redis为了节省内存空间而开发的,它是特殊编码的连续内存块而组成的一个顺序数据结构,一个压缩列表 可以包含许多任意的节点,它的重点是内存连续!

  • 双端链表:使用prev和next这两个指针,是可以从前向后也可以从后向前来实现lpush和rpush这些指令。因为是链表,所以也导致了lindex指令获取某个元素需要遍历链表才能获取得到。时间复杂度O(n)。

     当列表的对象同时满足下述两个条件时,列表对象采用压缩链表编码:

    (1)列表对象保存的所有元素长度都小于64个字节;

    (2)列表元素所保存的元素个数小于512个

在Redis3.2之后,采用的是快速链表-quicklist。quicklist是一个双向链表,并且它还是一个有ziplist特性的双向链表,就是说quicklist每个节点都是ziplist。这个快速链表结合了两者的优点。

Hash类型的介绍与使用场景

Redis中的Hash类型是一个String类型的field和value的映射表,Hash特别适合用于存储对象,Hash类似于Map结构。因为在Redis里,Hash又是另外的一种键值对结构,而Redis本身就是key-value类型,所以这个Hash结构是套在了Redis下的value里。

下面说说Hash的底层数据结构:

一种是ziplist 当存储的数据超过所配置的数量大小时就是转成Hashtable这种结构。这种转换会比较消耗性能,所以尽量少用这种转换操作。

另一种就是hashtable 这种结构的时间复杂度为O(1),但是会比较消耗内存空间。  

对于Hash在Redis中的应用场景:购物车、用户个人信息、商品详情的实现

Hash的常用命令

1. # hset 设置key指定的哈希集指定字段的值
     hset product:detail:1 title iphone11
     
2. # hget 返回key指定的哈希集中该字段所关联的值
     hget product:detail:1 title

3. # hgetall 返回key指定的哈希集中所有的字段和值
     hegetall product:detail:1
     
4. # hdel 从key指定的哈希集中移除指定的域     
     hdel product:detail:1 title
     
5. # hexists 返回hash里面的field是否存在
    hexists product:detail:1 title  (存在返回1,不存在返回0)

6. # hincrby 增加key指定的哈希集中的指定字段的数值,如果是-1则是递减
     hincrby product:detail:1 key 1 (对key里的value值进行递增或递减)
     
7. # hmset 设置key指定的哈希集中指定字段的值    
     hmset product:detail:2 title xiaomi price 1000 stock 10
     
8. # hmget 返回key指定的哈希集中指定字段的值
     hmget product:detail:2 title price

注意: 每个Hash可以存储232-1键值对

Set类型的介绍与使用场景

Redis中的Set类型是一个集合,集合的概念是一堆不重复的组合。利用Redis提供的Set数据结构可以存储一些集合性的数据。因为Redis很友好的为集合提供了求集、并集、差集等操作( PS:不懂的同学可以问下以前的数学老师哦~哈哈哈哈),那么就可以非常方便的实现共同关注、共同喜好等功能。对上面的集合操作,你还可以使用不同的命令选择奖结果返回给客户端还是存集合到一个新的集合中。

Redis中Set应用场景:去重、社交应用关注(粉丝,共同好友)、统计网站PV(UV、IP)大数据里面的用户画像标签集合

Set的常用命令

1. # sadd 添加一个或多个指定的元素到集合中,如果指定的元素已经在集合key中则忽略
     sadd user:tags female
     sadd user:tags bmw
     
2. # scard 返回集合存储的key的基数(集合元素的数量)
     scard user:tags

3. # sdiff 返回的集合元素是第一个key集合与后面所有key集合的差集
     sdiff user:tags:1 user:tags:2
     
4. # sinter 返回指定所有的集合的成员的交集    
     sinter user:tags:1 user:tags:2
     
5. # sismember 返回成员是否有存储的集合key的成员
    sismember user:tags:1 bmw  

6. # srem 在集合中移除指定的元素,如果指定元素不是key集合中的则忽略
     srem user:tags:1 bmw 
     
7. # sunion 返回给定的多个集合的并集所有的成员   
     sunion user:tags:1 user:tags:2

SortedSet类型的介绍与使用场景

和Set相比,SortedSet是将Set中的元素增加了一个权重参数score,使得集合中的元素能够按 score进行有序排序,比如存储一个存储班上同学成绩的SortedSet集合,该集合value可以设为同学的学号,然而score就可以是考试成绩。这样才插入数据的时候,就已经为数据进行了排序。另外,SortedSet还可以用来做带权重的队列。

应用场景:实时排行榜、优先级任务(队列)、朋友圈(文章)点赞-取消

SortedSet中跳跃表的介绍

跳跃表实则是一个链表,在传统的链表中想要查找一个元素就要从最原始的地方开始查找,直到查找到该元素。在跳跃表中呢,它会把链表进行抽层,抽层的时候会隔几个元素分为一个节点,抽层之后也是一条链表,节点会变少了。如下图所示,当要寻找元素78时,如果是寻常的链表就会从左往右挨个查询,这时查询了8次才能找带该元素。当使用跳跃表后,从第二层的开始出发,当查询到79这个节点时发现没有78,则返回到57这个节点再返回第一层去寻找该元素。

1.png

SortedSet的常用命令

1.# zadd 向有序集合里添加一个或者多个成员,或者更新已存在成员的分数
    zadd video:rank 90 springcloud
    zadd video:rank 80 springboot
    zadd video:rank 50 redis
    
 2.# zcard 获取有序集合的成员数
    zcard video:rank
    
 3.# zcount 计算在有序集合中指定的区间分数的成员数
     zcount video:rank 0 60
 
 4.# zincrby 在有序集合中对指定成员的分数加上增量
     zincrby video:rank 2 springcloud
 
 5.# zrange 通过索引区间返回有序集合指定内的成员,成员位置分数按(从小到大排序)
     zrange voideo:rank 0 -1 
     zrange voideo:rank 0 -1  withscores(返回分数)
 
 6.# zrevrange 通过索引集合中指定成员的排名,其中有序集合成员按score值递增(从大到小排序)
     zrevrange voideo:rank 0 -1 
 
 7.# zrevrank 返回有序集合中指定的成员排名,有序集合成员按分数递减(从大到小排序)
     zrevrank voideo:rank springcloud 
 
 8.# zrank 返回有序集key中成员member的排名,其中有序集成员按score值递增(从小到大排序)
     zrank voideo:rank
 
 9.# zrem 移除有序集合中的一个或者多个成员
      zrem voideo:rank redis
 
 10.# zscore 返回有序集合中的成员分数值
     zscore voideo:rank springcloud

好啦Redis的数据类型都整理好了,如果文章对你有帮助的话记得点点赞哈,可以的话也点点关注哦。求求各位大哥啦。

更多编程相关知识,请访问:编程入门!!

以上是整理一些常见Redis数据结构(总结)的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:掘金社区。如有侵权,请联系admin@php.cn删除
REDIS:对其数据库方法进行分类REDIS:对其数据库方法进行分类Apr 15, 2025 am 12:06 AM

Redis的数据库方法包括内存数据库和键值存储。1)Redis将数据存储在内存中,读写速度快。2)它使用键值对存储数据,支持复杂数据结构,如列表、集合、哈希表和有序集合,适用于缓存和NoSQL数据库。

为什么要使用redis?利益和优势为什么要使用redis?利益和优势Apr 14, 2025 am 12:07 AM

Redis是一个强大的数据库解决方案,因为它提供了极速性能、丰富的数据结构、高可用性和扩展性、持久化能力以及广泛的生态系统支持。1)极速性能:Redis的数据存储在内存中,读写速度极快,适合高并发和低延迟应用。2)丰富的数据结构:支持多种数据类型,如列表、集合等,适用于多种场景。3)高可用性和扩展性:支持主从复制和集群模式,实现高可用性和水平扩展。4)持久化和数据安全:通过RDB和AOF两种方式实现数据持久化,确保数据的完整性和可靠性。5)广泛的生态系统和社区支持:拥有庞大的生态系统和活跃社区,

了解NOSQL:Redis的关键特征了解NOSQL:Redis的关键特征Apr 13, 2025 am 12:17 AM

Redis的关键特性包括速度、灵活性和丰富的数据结构支持。1)速度:Redis作为内存数据库,读写操作几乎瞬时,适用于缓存和会话管理。2)灵活性:支持多种数据结构,如字符串、列表、集合等,适用于复杂数据处理。3)数据结构支持:提供字符串、列表、集合、哈希表等,适合不同业务需求。

REDIS:确定其主要功能REDIS:确定其主要功能Apr 12, 2025 am 12:01 AM

Redis的核心功能是高性能的内存数据存储和处理系统。1)高速数据访问:Redis将数据存储在内存中,提供微秒级别的读写速度。2)丰富的数据结构:支持字符串、列表、集合等,适应多种应用场景。3)持久化:通过RDB和AOF方式将数据持久化到磁盘。4)发布订阅:可用于消息队列或实时通信系统。

REDIS:流行数据结构指南REDIS:流行数据结构指南Apr 11, 2025 am 12:04 AM

Redis支持多种数据结构,具体包括:1.字符串(String),适合存储单一值数据;2.列表(List),适用于队列和栈;3.集合(Set),用于存储不重复数据;4.有序集合(SortedSet),适用于排行榜和优先级队列;5.哈希表(Hash),适合存储对象或结构化数据。

redis计数器怎么实现redis计数器怎么实现Apr 10, 2025 pm 10:21 PM

Redis计数器是一种使用Redis键值对存储来实现计数操作的机制,包含以下步骤:创建计数器键、增加计数、减少计数、重置计数和获取计数。Redis计数器的优势包括速度快、高并发、持久性和简单易用。它可用于用户访问计数、实时指标跟踪、游戏分数和排名以及订单处理计数等场景。

redis命令行怎么用redis命令行怎么用Apr 10, 2025 pm 10:18 PM

使用 Redis 命令行工具 (redis-cli) 可通过以下步骤管理和操作 Redis:连接到服务器,指定地址和端口。使用命令名称和参数向服务器发送命令。使用 HELP 命令查看特定命令的帮助信息。使用 QUIT 命令退出命令行工具。

redis集群模式怎么搭建redis集群模式怎么搭建Apr 10, 2025 pm 10:15 PM

Redis集群模式通过分片将Redis实例部署到多个服务器,提高可扩展性和可用性。搭建步骤如下:创建奇数个Redis实例,端口不同;创建3个sentinel实例,监控Redis实例并进行故障转移;配置sentinel配置文件,添加监控Redis实例信息和故障转移设置;配置Redis实例配置文件,启用集群模式并指定集群信息文件路径;创建nodes.conf文件,包含各Redis实例的信息;启动集群,执行create命令创建集群并指定副本数量;登录集群执行CLUSTER INFO命令验证集群状态;使

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具