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) 字符 ...
随机推荐
- Win10使用VMWare15安装Ubuntu-18.04.2-desktop-amd64
本文在Win10系统中使用VMWare Workstation Pro 15.1.0虚拟机安装Ubuntu-18.04.2-desktop-amd64.iso系统,同时安装VMWare Tools(实 ...
- php第七天-文件处理系统
0x01 文件系统概述 1.1文件类型 在程序运行时,程序本身和数据一般都存在内存中,当程序运行结束后,存放在内存中的数据被释放. 如果需要长期保存程序运行所需的原始数据,或程序运行产生的结果,就必须 ...
- spring+springmvc+mybatis+shiro
创建maven框架https://blog.csdn.net/Ajax_mt/article/details/78549119 具体下边 https://blog.csdn.net/w2222288/ ...
- 【FastDFS】SpringBoot整合FastDFS实战,我只看这一篇!!
写在前面 在<[FastDFS]小伙伴们说在CentOS 8服务器上搭建FastDFS环境总报错?>和<[FastDFS]面试官:如何实现文件的大规模分布式存储?(全程实战)> ...
- 走进shiro,构建安全的应用程序---shiro修仙序章
0. 写在前面 在最近的一个项目当中,我们基于Shiro实现我们系统的认证和授权.借此机会,写几篇博客,总结一下在本次实践当中遇到的问题,和较全面地学习一下Shiro的知识点, 1. 权限管理 权限管 ...
- Arduino 中 EEprom 写入读取清除
转自:https://www.arduino.cn/thread-1157-1-1.html EEPROM (Electrically Erasable Programmable Read-Only ...
- 使用类模板的C++线性表实现(数组方式)
main.h #ifndef _MAIN_H_ #define _MAIN_H_ #include <iostream> #include <exception> #inclu ...
- 浙大《数据结构》学习&练习(一)算法初步
1.数据结构是数据在计算机中的组织方式,类比图书在图书馆中的存储,应该如何分类,如何在书架上存取. 2.抽象数据结构是对一类的数据的一种组织方式的通用(抽象)描述,包括类型的名称,数据对象集和操作集. ...
- 题解【QTree3】
题目描述 给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白 有两种操作: 0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑) 1 v : 询问1到v的路径上的第一个黑点,若无,输出 ...
- Scala小记(一)
Scala小记----初识Scala 一,什么是Scale? Scala是一门面向对象的,使用JVM运行的函数式编程语言,(函数式编程语言:指的就是那些将方法或者说是函数来作为参数 进行传递的编程语言 ...