问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Redis 5种基本数据类型详解

发布网友 发布时间:2024-09-29 04:07

我来回答

1个回答

热心网友 时间:2024-10-16 16:24

Redis数据结构简介

对Redis来说,所有的key(键)都是字符串。我们在谈基础数据结构时,讨论的是存储值的数据类型,主要包括常见的5种数据类型,分别是:String、List、Set、Zset、Hash。

结构类型结构存储的值结构的读写能力String字符串可以是字符串、整数或浮点数对整个字符串或字符串的一部分进行操作;对整数或浮点数进行自增或自减操作;List列表一个链表,链表上的每个节点都包含一个字符串对链表的两端进行push和pop操作,读取单个或多个元素;根据值查找或删除元素;Set集合包含字符串的无序集合字符串的集合,包含基础的方法有看是否存在添加、获取、删除;还包含计算交集、并集、差集等Hash散列包含键值对的无序散列表包含方法有添加、获取、删除单个元素Zset有序集合和散列一样,用于存储键值对字符串成员与浮点数分数之间的有序映射;元素的排列顺序由分数的大小决定;包含方法有添加、获取、删除单个元素以及根据分值范围或成员来获取元素基础数据结构详解String字符串

String是redis中最基本的数据类型,一个key对应一个value。

String类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。

命令使用

命令简述使用GET获取存储在给定键中的值GET nameSET设置存储在给定键中的值SET name valueDEL删除存储在给定键中的值DEL nameINCR将键存储的值加1INCR keyDECR将键存储的值减1DECR keyINCRBY将键存储的值加上整数INCRBY key amountDECRBY将键存储的值减去整数DECRBY key amount

命令执行

127.0.0.1:6379>sethelloworldOK127.0.0.1:6379>gethello"world"127.0.0.1:6379>delhello(integer)1127.0.0.1:6379>gethello(nil)127.0.0.1:6379>getcounter"2"127.0.0.1:6379>incrcounter(integer)3127.0.0.1:6379>getcounter"3"127.0.0.1:6379>incrbycounter100(integer)103127.0.0.1:6379>getcounter"103"127.0.0.1:6379>decrcounter(integer)102127.0.0.1:6379>getcounter"102"

实战场景

缓存: 经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力。

计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。

session:常见方案spring session + redis实现session共享,

List列表

Redis中的List其实就是链表(Redis用双端链表实现List)。

使用List结构,我们可以轻松地实现最新消息排队功能(比如新浪微博的TimeLine)。List的另一个应用就是消息队列,可以利用List的 PUSH 操作,将任务存放在List中,然后工作线程再用 POP 操作将任务取出进行执行。

命令使用

命令简述使用RPUSH将给定值推入到列表右端RPUSH key valueLPUSH将给定值推入到列表左端LPUSH key valueRPOP从列表的右端弹出一个值,并返回被弹出的值RPOP keyLPOP从列表的左端弹出一个值,并返回被弹出的值LPOP keyLRANGE获取列表在给定范围上的所有值LRANGE key 0 -1LINDEX通过索引获取列表中的元素。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。LINEX key index

使用列表的技巧

lpush+lpop=Stack(栈)

lpush+rpop=Queue(队列)

lpush+ltrim=Capped Collection(有限集合)

lpush+brpop=Message Queue(消息队列)

命令执行

127.0.0.1:6379>lpushmylist12lllsmem(integer)5127.0.0.1:6379>lrangemylist0-11)"mem"2)"ls"3)"ll"4)"2"5)"1"127.0.0.1:6379>lindexmylist-1"1"127.0.0.1:6379>lindexmylist10#index不在mylist的区间范围内(nil)

实战场景

微博TimeLine: 有人发布微博,用lpush加入时间轴,展示新的列表信息。

消息队列

Set集合

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

命令使用

命令简述使用SADD向集合添加一个或多个成员SADD key valueSCARD获取集合的成员数SCARD keySMEMBER返回集合中的所有成员SMEMBER key memberSISMEMBER判断 member 元素是否是集合 key 的成员SISMEMBER key member

其它一些集合操作,请参考这里https://www.runoob.com/redis/redis-sets.html

命令执行

127.0.0.1:6379>saddmysetycfycf1xiaoycf(integer)3127.0.0.1:6379>smembermyset1)"xiao"2)"ycf1"3)"ycf"127.0.0.1:6379>sismembermysetycf(integer)1

实战场景

标签(tag),给用户添加标签,或者用户给消息添加标签,这样有同一标签或者类似标签的可以给推荐关注的事或者关注的人。

点赞,或点踩,收藏等,可以放到set中实现

Hash散列

Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。

命令使用

命令简述使用HSET添加键值对HSET hash-key sub-key1 value1HGET获取指定散列键的值HGET hash-key key1HGETALL获取散列中包含的所有键值对HGETALL hash-keyHDEL如果给定键存在于散列中,那么就移除这个键HDEL hash-key sub-key1

命令执行

127.0.0.1:6379>hsetusername1ycf(integer)1127.0.0.1:6379>hsetuseremail1ycf@163.com(integer)1127.0.0.1:6379>hgetalluser1)"name1"2)"ycf"3)"email1"4)"ycf@163.com"127.0.0.1:6379>hgetuseruser(nil)127.0.0.1:6379>hgetusername1"ycf"127.0.0.1:6379>hsetusername2xiaoycf(integer)1127.0.0.1:6379>hsetuseremail2xiaoycf@163.com(integer)1127.0.0.1:6379>hgetalluser1)"name1"2)"ycf"3)"email1"4)"ycf@163.com"5)"name2"6)"xiaoycf"7)"email2"8)"xiaoycf@163.com"

实战场景

缓存: 能直观,相比string更节省空间,的维护缓存信息,如用户信息,视频信息等。

Zset有序集合

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

命令使用

命令简述使用ZADD将一个带有给定分值的成员添加到哦有序集合里面ZADD zset-key 178 member1ZRANGE根据元素在有序集合中所处的位置,从有序集合中获取多个元素ZRANGE zset-key 0-1 withccoresZREM如果给定元素成员存在于有序集合中,那么就移除这个元素ZREM zset-key member1

更多命令请参考这里 https://www.runoob.com/redis/redis-sorted-sets.html

命令执行

127.0.0.1:6379>zaddmyscoreset100ycf90xiaoycf(integer)2127.0.0.1:6379>ZRANGEmyscoreset0-11)"xiaoycf"2)"ycf"127.0.0.1:6379>ZSCOREmyscoresetycf"100"

实战场景

排行榜:有序集合经典使用场景。例如小说视频等网站需要对用户上传的小说视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行。

参考文章

https://www.cnblogs.com/haoprogrammer/p/11065461.html

https://www.pianshen.com/article/6479421770/

https://www.runoob.com/redis/redis-sorted-sets.html

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
牡丹叶子枯了怎么办 牡丹枯叶怎么回事 "他同情冤魂、惩办恶人,既有同情心又主持公道,既可爱又恐怖” 冯宝成传销诈骗邪教组织 冯保成团队,传销诈骗,家人深陷其中,求助。 南朝词臣北朝客,归来唯见秦淮碧。 池台竹树三亩馀至今人道江家宅的意思 池台竹树三亩馀至今人道江家宅是什... 高效、加分学习工具——小小答题错题本上线了 如何将三张合在一起的图片合并 砂锅红烧肉的做法 最正宗的做法_砂锅红烧肉怎么做 砂锅版红烧肉做法: Redis中三种特殊数据类型详解 为什么哥哥要删我微信呢。哥哥要结婚了? Liqui-Cel 膜接触器、脱气膜国内哪家可以供应? 一般病人送花选什么好 快七夕了,我要送男友花,可是他现在正躺在医院大床上,我该送什麽花祝福... 七夕适合不适合看病人 民营企业贷款,银行强行要求打工的法定代表人做无限连带责任担保合理吗... 哈飞明意汽车,启动不来,没油没电,是霍尔式点火的。什么原因,?? 东风11型机车简介 侄儿刚刚一岁,最近因为感冒,牙都不长了。想给他吃点营养素。亲们推荐一... 东风内燃机车介绍 我梦见侄儿吐血 他还小才5个月,这几天有点感冒又有点咳嗽,我梦见他吐血... Mac上有没有五笔输入法? 苹果mac五笔输入法哪个好用? 历代名著精选集:韩非子目录 韩非子·安危第二十五作者思想 韩非子·安危第二十五原文3 2022新人领证结婚祝福语 淘粉吧玛瑙币怎么提现 淘粉吧返利提现实名认证淘粉吧返利 天然酵母耐高糖酵母 做面包为什么要用耐高糖酵母 GTA5怎么刷物品:一种流行游戏内的资源管理策略 福建长乐的护照几年换一次,我是金峰镇的也是在长乐市公安局办证大厅办理... 长乐更换护照需要带什么证件 比现款更精致更运动,全新奥迪A3即将亮相广州车展 ie3.0鼠标dpi值低能否通过设置提高速度? 我有两道数学题不会,就各位帮帮我! ie3.0复刻版只有400dpi,适合打游戏吗?新版外壳掉色吗。 我有两道初一数学题解不开,数学尖子们帮下忙 两道数学题不会,亲们会哪个回答哪个,好不!急急急急急急!!!作业!_百度... 有两道数学题不会 帮下忙 有两道初二数学题不会,求各位指点!最好是有详细过程,谢谢! 韩非子·主道第五作者思想 韩非子·主道第五作者简介 永恒之塔中如何才能显示附近的天族玩家 韩非子·主道第五作品原文3 剑灵,如何像永恒之塔一样在文件上隐藏玩家 韩非子·主道第五作品原文2 韩非子·主道第五作品原文1