Redis 五种数据结构详解(string,hash,list,set,zset)
一、五种数据结构:
1. String——字符串
String 数据结构是简单的 key-value 类型,value 不仅可以是 String,也可以是数字(当数字类型用 Long 可以表示的时候encoding 就是整型,其他都存储在 sdshdr 当做字符串)。使用 Strings 类型,可以完全实现目前 Memcached 的功能,并且效率更高。还可以享受 Redis 的定时持久化(可以选择 RDB 模式或者 AOF 模式),操作日志及 Replication 等功能。
字符串常用的语法:
① 赋值:set string1 hello
② 取值:get string1
③ 删除:del string1 (这个命令可以用于所有的类型)
④ 数值加一:incr num1 如果值为空,则默认从0加一,如果值无法转为数字,则报异常。
⑤ 数值减一:decr num1 如果值为空,则默认从0减一,如果值无法转为数字,则报异常。
⑥ 数值增加指定的数值:incrby num1 2
⑦ 数值减少指定的数值:decrby num1 2
⑧ 拼接:append num1 123 如果值存在就拼接,如果不存在就新增
2. Hash——哈希
在 Memcached 中,我们经常将一些结构化的信息打包成 hashmap,在客户端序列化后存储为一个字符串的值(一般是 JSON 格式),比如用户的昵称、年龄、性别、积分等。这时候在需要修改其中某一项时,通常需要将字符串(JSON)取出来,然后进行反序列化,修改某一项的值,再序列化成字符串(JSON)存储回去。简单修改一个属性就干这么多事情,消耗必定是很大的,也不适用于一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。而 Redis 的 Hash 结构可以使你像在数据库中 Update 一个属性一样只修改某一项属性值。
哈希表常用的语法:
① 赋值:hset myhash age 18
② 取值:hget myhash age
③ 赋多个值:hmset myhash name zhangsan age 21
④ 取多个值:hmget myhash name age
⑤ 获得所有键值对:hgetall myhash
⑥ 移除:hdel myhash name age
3. List——列表
List 说白了就是链表,插入删除数据非常快。可以用于消息中间件的补救措施,比如消息队列中的消息发送成功存入一个链表,发送失败存入一个链表,一段时间后将发送成功的链表清空,发送失败的链表中的消息继续发送,直到成功后存入成功的链表,目的是为了保证数据的一致性。
(1) ArrayList使用数组方式:根据索引去查询速度非常快,但是新增与删除元素时需要涉及到位移操作,效率比较低
(2)LinkedList使用双向链接方式:每个元素都记录了前后元素的指针,插入和删除数据时,只是改变了前后元素指针所指向的元素,速度快。
① lpush: 左侧插入 如:lpush mylist a b c 返回3,表示是数量。 lpush mylist 1 2 3 返回6
② rpush: 右侧插入 如:rpush mylist a b c 返回3,表示是数量。 rpush mylist 1 2 3 返回6
③ lrange: 查看列表,从哪开始到哪结束,0:表示从链表的头部开始,-1表示从链表的尾部第一个元素开始,-2表示从链表的尾部第二个元素开始
如:lrange mylist 0 5,返回:3,2,1,c,b,a.
lrange mylist 0 -1,返回:a,b,c,1,2,3.
lrange mylist 0 -2,返回:a,b,c,1,2
④ lpop: 左弹出,它会返回并弹出指定key所关联的那个链表中的第一个元素,不存在返回nil
如:lpop mylist,返回3,弹出之后,里面就没有这个元素了,
lrange mylist 0 -1,返回的结果中,不在有这个元素。
⑤ rpop: 右弹出,如rpop mylist2,弹出3,
lrange mylist2 0 -1,查看,这个元素已经不存在了。
⑥ llen: 获取列表中的元素个数,如果这个列表不存在,则返回0,
如: llen mylist,返回5.
⑦ lpushx: 仅当我们参数中指定的key存在时,可以向关联的list的头部去插入一个值,如果不存在,就不会进行插入,返回0。
如:lpushx mylisy x,表示将x插入到链表的头部,
lrange mylist 0 -1,可以看到新插入的元素。
⑧ rpushx:仅当我们参数中指定的key存在时,可以向关联的list的尾部去插入一个值,如果不存在,就不会进行插入,返回0。
如:rpushx mylist2 y ,表示向mylist2列表的尾部插入一个元素y,
lrange mylist2 0 -1,查看,可以看到y元素在最后面。
⑨ lrem:写上具体的一个key,后面会跟上一个count,value。它会删除count个为value的元素,如果count大于0,它就会从头向尾遍历,并删除count个为value的元素,如果count小于0,它会从后面向前面遍历。如果count等于0,则删除链表中所有等于value的元素。
如:lrem mylist3 2 3, 表示从头到尾删除2个3.
lrem mylist3 -2 1,表示从后面向前删除2个1.
lrem mylist3 0 2,表示删除mylist3中的所有2.
⑩ lset: 来设置列表中的某个index的角标的元素的值。0表示第一个元素,-1表示最尾的元素。我们可以操作链表的角标,如果不存在,就抛出异常。
如:lset mylist 3 mm,表示将链表mylist的第三个值设置为mm.
11. linsert: 在某个元素的前或后插入某个元素,如linsert mylist4 before b 11,表示在mylist4链表中的b之前插入11。
linsert mylist4 after b 22,表示在mylist4链表中的b后面插入22 rpoplpush: 将链表中的尾部元素弹出,并添加到头部。
12. rpoplpush mylist5 mylist5,表示将链表mylist5中的一个元素弹出,压入到链表mylist6中,返回1,表示成功。
rpoplpush使用场景:
4. Set——集合
Set 是一个无重复数据的无序集合,集合的概念就是一堆不重复值的组合。利用 Redis 提供的 Set 数据结构,可以存储一些集合性的数据。比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。因为 Redis 非常人性化的为集合提供了求交集、并集、差集等操作,那么就可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。
① sadd myset 1 2 3 向set中增加元素,不允许重复
② srem myset 1 2 删除数据
③ smember myset 所有的值
④ sismember myset a 0不存在 1存在
⑤ sdiff myset1 myset2 差集运算
⑥ sinter myset1 myset2 交集运算
⑦ sunion myset1 myset2 并集运算
⑧ scard myset set 长度
⑨ srandmenber myset 随机获取 value
⑩ sdiffstore my1 mya1 myb1 将 mya1/b1的差集存入 my1
11.sinterstore my1 mya1 myb1 将 mya1/b1的交集存入 my1
12.sunionstore my1 mya1 myb1 将 mya1/b1的并集存入 my1
5. Sorted Set——有序集合
和Sets相比,Sorted Sets是将 Set 中的元素增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,比如一个存储全班同学成绩的 Sorted Sets,其集合 value 可以是同学的学号,而 score 就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。另外还可以用 Sorted Sets 来做带权重的队列,比如普通消息的 score 为1,重要消息的 score 为2,然后工作线程可以选择按 score 的倒序来获取工作任务。让重要的任务优先执行。
① zadd mysort 70 zhangsan 80 lisi
② zadd mysort 100 zhangsan:如果元素存在,会覆盖掉之前的分数
③ zcard mysort:获取成员的数量
④ zscore mysort zhangsan:获取成员的分数
⑥ zrem mysort zhangsan:删除某个成员
⑦ 范围查找:zrange mysort 0 -1
zrange mysort 0 -1 withscores(显示分数)
⑧ 排序(降序):zrevrange mysort 0 -1 withscores
⑨ 按照排名的范围进行删除:zremrangebyrank mysort 0 4
⑩ 按照分数的范围进行删除:zremrangebyscore mysort 80 100
扩展:
返回分数在某个区间的成员,并按照分数降序排列:
zrangebyscore mysort 0 100 withscore limit 0 2
限制返回2条数据
设置指定成员增加的分数(给zhangsan加3分):zincrby mysort 3 zhangsan
分数在某个区间的成员个数:zcount mysort 80 90
二、key的常用操作:
查看所有的key:keys *
查看包含指定字符的key:keys my?
删除key:del key1 key2
判断key是否存在:exists my1
重命名key:rename myname mynewname
设置key的超时时间(单位是秒):expire mynewname 1000
查看key剩余时间:ttl mynewname(没有设置时间则返回-1)
查看key的类型:type mysort
深入学习门户:
Redis命令API:http://redisdoc.com/
Redis命令参考:http://www.runoob.com/redis/redis-commands.html
Redis数据结构使用场景:http://www.runoob.com/w3cnote/redis-use-scene.html
---------------------------------------------------------------------------------------------------------------------------
转载请注明出处:https://www.cnblogs.com/HelloXTF/p/10683485.html
Redis 五种数据结构详解(string,hash,list,set,zset)的更多相关文章
- redis 五种数据结构详解(string,list,set,zset,hash)
redis 五种数据结构详解(string,list,set,zset,hash) Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存 ...
- redis 五种数据结构详解(string,list,set,zset,hash),各种问题综合
redis 五种数据结构详解(string,list,set,zset,hash) https://www.cnblogs.com/sdgf/p/6244937.html redis 与 spring ...
- 【Redis】redis 五种数据结构详解(string,list,set,zset,hash)
redis 五种数据结构详解(string,list,set,zset,hash) Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存 ...
- Redis(一)、Redis五种数据结构
Redis五种数据结构如下: 对redis来说,所有的key(键)都是字符串. 1.String 字符串类型 是redis中最基本的数据类型,一个key对应一个value. String类型是二进制安 ...
- Redis五种数据结构简介
Redis五种结构 1.String 可以是字符串,整数或者浮点数,对整个字符串或者字符串中的一部分执行操作,对整个整数或者浮点执行自增(increment)或者自减(decrement)操作. 字符 ...
- rabbitmq五种模式详解(含实现代码)
一.五种模式详解 1.简单模式(Queue模式) 当生产端发送消息到交换机,交换机根据消息属性发送到队列,消费者监听绑定队列实现消息的接收和消费逻辑编写.简单模式下,强调的一个队列queue只被一个消 ...
- 2.Redis五种数据结构
2.Redis五种数据结构2.1 预备2.1.1 全局命令2.1.2 数据结构和内部编码2.1.3 单线程架构2.2 字符串2.2.1 命令2.2.2 内部编码2.2.3 典型使用场景2.3 哈希2. ...
- Redis五种数据结构(Windows Server)
1.Redis的五种数据结构 这里推荐大家在命名redis的key的时候最好的加上前缀,并且使用 :来分割前缀 ,这里在使用可视化工具查看的时候就比较好区分,比如我的的前缀是 Demo:test:(一 ...
- Redis五种数据结构(二)
Redis数据结构 Redis数据结构介绍 Redis是一种高级的key-value的存储系统,其中value支持五种数据类型. 字符串(String) 哈希(hash) 字符串列表(list) 字符 ...
随机推荐
- Swiper 在IE9 及其他浏览器使用
Swiper 在IE9 及其他浏览器使用 前言 昨天遇到一个问题,swiper 使用版本是3.4.2 除了Ie9浏览器外其他浏览器都正常,IE9 无法轮播,执行控制台报错源码问题.没办法,只能降级兼容 ...
- vulnhub靶机之Quaoar
Quaoar 靶机非常简单. 扫描端口主机. wordpress建站. 扫到两个用户,分别是wpuser以及admin. 爆破出了后台: 传了一个一句话木马,连上蚁剑又传了个反弹shell. 反弹sh ...
- vulnhub-Os-hackNos-2
vulnhub-Os-hackNos-2 开局扫主机,发现141是存活的,进行nmap扫描,获取端口信息. 发现22,80端口开放,进行目录爆破. 发现tsweb,浏览器访问,推测是wordpress ...
- hadoop分布式格式化时出现异常java.net.unknownhostexception
当搭建好分布式集群后,准备使用命令格式化时 hdfs namenode format 在日志的最后一行出现 java.net.unknownhostexception的异常,通常是你的主机名没有配置好 ...
- Spring及tomcat初始化日志
Tomcat StandardContext初始化过程 //org.apache.catalina.core.StandardContext#startInternal // 子容器启动 for (C ...
- 过万 star 高星项目的秘密——GitHub 热点速览 Vol.39
作者:HelloGitHub-小鱼干 虽然国外十一并不过国庆,但是本周的 GitHub 也稍显疲软,GitHub 周榜的获 star 超过 1k 的项目寥寥无几,本周新开源的项目更是屈指可数.用 C ...
- 国际化的实现i18n--错误码国际化以及在springboot项目中使用
国际化 ,英文叫 internationalization 单词太长 ,又被简称为 i18n(取头取尾中间有18个字母); 主要涉及3个类: Locale用来设置定制的语言和国家代码 Resource ...
- python 系统设置
1. 设置python运行环境为utf-8 import sys #引用sys模块 reload(sys) #重新加载sys sys.setdefaultencoding("utf-8&qu ...
- Hyper-V Server + Windows Admin Center
2020年的十一黄金周是双节,偶然间得知再出现双节可能要几十年之后了,很可惜我并没有出去游玩的打算.所以假期没什么事,就来研究下Hyper Server + Windows Admin Center. ...
- matlab中strcmpi比较字符串(不区分大小写)
来源:https://ww2.mathworks.cn/help/matlab/ref/strcmpi.html?searchHighlight=strcmpi&s_tid=doc_srcht ...