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://blog.csdn.net/fond_of/article/details/89176370