Redis常用数据结构

  Redis常用数据结构包括字符串(strings),列表(lists),哈希(hashes),集合(sets),有序集合(sorted sets)。

  redis的key最大不能超过512M,可通过redis-cli config get xxx获取某个参数配置,如获取redis最大内存,redis-cli config get maxmemory。可通过redis-cli config set xxx来设置某个参数的值,如:redis-cli config set maxmemory 400M

  字符串(Strings)

  Redis最简单的数据结构,通过get/set/进行查询和设置参数,set时,吐过key之前已存在,则默认会替换,value最大值不能超过512M,可以通过nx来设置不覆盖之前已存在的value。set key value nx,如果key已存在,返回空,value还是修改之前的值,如果value是整数,则可通过incr等命令进行自增,可通过mset,mget命令添加或查询多组命令。  

  列表(Lists)

  Redis列表是通过链表(linked list)来实现的,插入速度非常快,官网介绍,使用lpush向一个只有10个元素的列表插入元素与向一个有一千万个元素的列表插入元素的速度是相同的,但是查询速度比较慢,这和java中链表的特点一致(插入删除快,查找修改慢)。redis以链表实现列表list的一个原因为在数据库中向一个非常长的量表中快速插入数据是非常重要的。另外,可以在恒定时间内或者指定范围内的数据。当需要快速访问一个非常大的集合中的元素时,可以通过使用另外一种数据结构,sorted set。list常用的命令有lpush,rpush,rpop,lpop,lrange,ltrim,llen等,ltrim与lrange类型,其只保留指定范围内的元素,范围之外的元素将被删除,从0开始,包含起始和结束元素。

  如果要获取最新的五条数据,则可以通过lrange list 0 4来处理,这在有些情况下是很有用的。

127.0.0.1:6379> LPUSH list aa bb cc dd ee ff gg kk ll mm
(integer) 10
127.0.0.1:6379> LRANGE list 0 4
1) "mm"
2) "ll"
3) "kk"
4) "gg"
5) "ff"
127.0.0.1:6379> 

  lrange中元素位置也可以使用负数,如想要获取最早的5条数据,可以通过lrange list -5 -1

127.0.0.1:6379> LRANGE list -5 -1
1) "ee"
2) "dd"
3) "cc"
4) "bb"
5) "aa"
127.0.0.1:6379> 

  如果只保留最新的5条数据,则可以使用ltrim,不在前五条的数据将被删除,节省内存空间

127.0.0.1:6379> LPUSH num 0 1 2 3 4 5 6 7 8 9
(integer) 10
127.0.0.1:6379> LTRIM num 0 4
OK
127.0.0.1:6379> LRANGE num 0 10
1) "9"
2) "8"
3) "7"
4) "6"
5) "5"
127.0.0.1:6379> 

  可以使用lpush与rpop或者rpush与lpop模拟队列,先进先出

127.0.0.1:6379> LPUSH ls01  11 22 33
(integer) 3
127.0.0.1:6379> RPOP ls01
"11"
127.0.0.1:6379> 
127.0.0.1:6379> RPUSH ls02 11 22 33
(integer) 3
127.0.0.1:6379> LPOP ls02
"11"
127.0.0.1:6379>

  可以使用lpush与lpop或者rpush与rpop模拟栈,先进后出

127.0.0.1:6379> LPUSH ls03 11 22 33
(integer) 3
127.0.0.1:6379> LPOP ls03
"33"
127.0.0.1:6379> 
127.0.0.1:6379> RPUSH ls04 11 22 33
(integer) 3
127.0.0.1:6379> RPOP ls04
"33"
127.0.0.1:6379> 

  使用rpush,brpop,lpush,blpop可以实现生产者消费者模式,当获取病毒奥信息,则等待,知道超时,blpop key timeout,等到timeout时间还未获取到数据,则结束命令

  哈希(Hashes)

  类似于java中的map,可用于存储一个对象的属性,常用命令有hset,hget,hgetall,hmset,hdel,hlen

  集合(Sets)

  无序数据,不允许重复,可以执行多个集合的交集,并集和差集,常用的命令有sadd,sismember,smembers,sinter交集,sunion并集,sdiff差集,spop随机获取并移除元素

  sunionstore拷贝集合到一个新的集合中,语法结构:sunionstore newset oldset,

127.0.0.1:6379> SADD set 1 2 3
(integer) 3
127.0.0.1:6379> SUNIONSTORE set01 set
(integer) 3
127.0.0.1:6379> 

 若将oldset放到前面,且newset为空,则会清空oldset

127.0.0.1:6379> sadd set 1 2 3
(integer) 3
127.0.0.1:6379> SUNIONSTORE set set001
(integer) 0
127.0.0.1:6379> SMEMBERS set
(empty list or set)
127.0.0.1:6379> 

  scard获取给定集合的成员个数

127.0.0.1:6379> sadd myset 0 1 2 3 4 5 6 7 8
(integer) 9
127.0.0.1:6379> scard myset
(integer) 9
127.0.0.1:6379> 

  srandmember随机获取集合中的元素,但不移除元素

127.0.0.1:6379> SRANDMEMBER myset
"8"
127.0.0.1:6379> SRANDMEMBER myset
"6"
127.0.0.1:6379> SRANDMEMBER myset
"6"
127.0.0.1:6379> SRANDMEMBER myset 2
1) "1"
2) "0"
127.0.0.1:6379> SRANDMEMBER myset 2
1) "1"
2) "8"
127.0.0.1:6379> 

  有序集合(Sorted sets)

  数据无序,不允许重复,每个元素都对应一个float型的分数,集合中元素按照顺序获取,排序规则如下

  1、如果A和B是两个具有不同分值的元素,如果A的分值大于B的分值,则A>B

  2、如果A和B有相同的分值,则如果A的字符串字典顺序比B的大,则A>B。A与B不可能具有相同的字符串,若字符串相同,则其分值将被覆盖。

127.0.0.1:6379> ZADD exam 134 math 120 Chinese 128 English 252 Synthesis
(integer) 4
127.0.0.1:6379> ZRANGE exam 0 -1
1) "Chinese"
2) "English"
3) "math"
4) "Synthesis"
127.0.0.1:6379> 

  能够确认的是,输出的元素已经是有序的了,其中0和-1意思为从第一个数据到最后一个数据,输出分数可能更加直观

127.0.0.1:6379> ZRANGE exam 0 -1 withscores
1) "Chinese"
2) "120"
3) "English"
4) "128"
5) "math"
6) "134"
7) "Synthesis"
8) "252"
127.0.0.1:6379> 

  反向输出可以使用zrevrange

127.0.0.1:6379> zrevrange exam 0 -1 withscores
1) "Synthesis"
2) "252"
3) "math"
4) "134"
5) "English"
6) "128"
7) "Chinese"
8) "120"
127.0.0.1:6379> 

  查找小于130分的课程

127.0.0.1:6379> ZRANGEBYSCORE exam -inf 130 withscores
1) "Chinese"
2) "120"
3) "English"
4) "128"
127.0.0.1:6379> 

  查找大于130分的课程

127.0.0.1:6379> ZRANGEBYSCORE exam 130 +inf withscores
1) "math"
2) "134"
3) "Synthesis"
4) "252"
127.0.0.1:6379> 

  查找120到128的分数

127.0.0.1:6379> ZRANGEBYSCORE exam 120 128 withscores
1) "Chinese"
2) "120"
3) "English"
4) "128"
127.0.0.1:6379> 

  可以发现,ZRANGEBYSCORE 查询出的元素包含第一个和最后一个,删除时也是如此

127.0.0.1:6379> ZREMRANGEBYSCORE exam 120 128
(integer) 2
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> ZRANGE exam 0 -1 withscores
1) "math"
2) "134"
3) "Synthesis"
4) "252"
127.0.0.1:6379> 

  当分值相同,以字典顺序排序

127.0.0.1:6379> ZADD users 60 wangyangming 60 huxueyuan 60 lihongzhang 60 zengguopa
(integer) 4
127.0.0.1:6379> ZRANGE users 0 -1
1) "huxueyuan"
2) "lihongzhang"
3) "wangyangming"
4) "zengguopa"
127.0.0.1:6379> 

  根据字段顺序查询元素,包括第一个元素,但不包括最后一个元素,如下例子为包含h开头的元素,但不包含w开头的元素。

127.0.0.1:6379> ZRANGEBYLEX users [h [w 
1) "huxueyuan"
2) "lihongzhang"
127.0.0.1:6379> 

  

 

posted @ 2019-03-19 17:25  大坑水滴  阅读(770)  评论(0编辑  收藏  举报