1.列表类型
1.1 列表数据结构
左边为key,是字符串类型右边为value,是一个有序的队列,与python的列表结构相同可以在Redis中对列表的value进行如下操作 从左边添加元素 从右边添加元素 从左边删除元素 从右边删除元素 计算列表长度 删除列表中指定元素 从列表中获取子列表元素 可以按照索引来获取指定元素
1.2 列表类型的特点
有序可以重复左右两边插入弹出
1.3 列表类型常用的方法
rpush key value1 value2 ... valueN 从列表右端插入值(1-N个)lpush key value1 value2 ... valueN 从列表左端插入值(1-N个)linsert key before value newValue 在list指定的值前插入newValuelinsert key after value newValue 在list指定的值后插入newValuelpop key 从列表左侧弹出一个itemrpop key 从列表右侧弹出一个itemlrem key count value 根据count值,从列表中删除所有value相等的项 count > 0,从左到右,删除最多count个value相等的项 count < 0,从右到左,删除最多Math.abs(count)个value相等的项 count = 0,删除所有value相等的项ltrim key start end 按照索引范围修剪列表lrange key start end(包含end) 获取列表指定索引范围所有itemlindex key index 获取列表指定索引的itemllen key 获取列表长度lset key index newValue 设置列表指定索引值为newValueblpop key timeout lpop阻塞版本,timeout是阻塞超时时间,timeout=0为永不超时brpop key timeout rpop阻塞版本,timeout是阻塞超时时间,timeout=0为永不超时
例子:
127.0.0.1:6379> rpush mylist a b c d(integer) 4127.0.0.1:6379> lrange mylist 0 -11) "a"2) "b"3) "c"4) "d"127.0.0.1:6379> lpush mylist 0(integer) 5127.0.0.1:6379> lrange mylist 0 -11) "0"2) "a"3) "b"4) "c"5) "d"127.0.0.1:6379> rpop mylist"d"127.0.0.1:6379> lrange mylist 0 -11) "0"2) "a"3) "b"4) "c"127.0.0.1:6379>
说明:
lpush加lpop的操作相当于Stacklpush加rpop的操作相当于Queuelpush加ltrim的操作相当于Capped Collectionlpush加brpop的操作相当于Message Queue
列表类型API的时间复杂度说明
rpush,lpush命令的时间复杂度为O(1)到O(N),由从列表中获取元素的个数来决定linsert after/before,lrem,ltrim,lrange,lindex,lset命令的时间复杂度为O(N)lpop,rpop,llen,blpop,brpop命令的时间复杂度都是O(1)
2.集合类型
2.1 集合类型数据结构
左边为key,是字符串类型右边为value,可以将一些字符串进行一些组合,是集合类型可以向value中添加或者删除一个元素Redis中的集合类型还支持集合之间的操作,这与Redis中的其他数据结构是不同的Redis可以对两个集合进行操作,取两个集合的交集,并集,差集以及对称差集等等
2.2 集合类型的特点
无序无重复支持集合间操作
2.3 集合类型常用的方法
sadd key element 向集合key添加element(如果element已经存在,添加失败)srem key element 将集合key中的element移除掉scard user:1:follow 计算集合大小sismember user:1:follow it 判断it是否在集合中srandmember user:1:follow count 从集合中随机挑count个元素,不破坏集合的结构spop user:1:follow 从集合中随机弹出一个元素,弹出后集合中没有这个元素了 smembers user:1:follow 获取集合所有元素,无序,小心使用
时间复杂度说明:
sadd,srem,scard,sismember,srandmember,spop,smember命令的时间复杂度都是O(1)
例子:
127.0.0.1:6379> sadd user:1:follow it news his sports(integer) 4127.0.0.1:6379> smembers user:1:follow1) "news"2) "sports"3) "his"4) "it"127.0.0.1:6379> spop user:1:follow"sports"127.0.0.1:6379> smembers user:1:follow1) "news"2) "his"3) "it"127.0.0.1:6379> scard user:1:follow(integer) 3127.0.0.1:6379> sismember user:1:follow entertainment(integer) 0
2.4 集合间API
sdiff 差集sinter 交集sunion 并集sdiff|sinter|sunion + store destkey 将差集,交集,并集结果保存在destkey中
2.5 实战
在一些抽奖活动中,就可以用Redis的集合来实现,使用spop把已经中奖的用户弹出在社交网络中,常用的如点赞,踩等功能也可以用集合来实现社交网络中,共同关注的好友可以用集合的交集实现
3.有序集合类型
3.1 有序集合的数据结构
key-value结构左边为key,是字符串类型,右边为value,由两部分组成:score和valuescore表示分值,表示value在有序集合中的位置
3.2 有序集合类型常用的方法
zadd key score element(可以是多对) 添加score和elementzrem key element(可以是多个) 删除元素 zscore key element 返回元素的分数 zincrby key increScore element 增加或减少元素的分数 zcard key 返回元素的总个数zrange key start end [withscores] 返回指定索引范围内的升序元素[分值]zrangebyscore key minScore maxScore 返回指定分数范围内的长序元素[分值]zcount len minScore maxScore 返回有序集合内在指定分数范围内的个数zremrangebyrank key start end 删除指定排名内的升序元素 zremrangebyscore key minScore maxScore 删除指定分数内的升序元素zrevrank 获取有序集合中从高到低的排名 zrevrange 从高到低排名后获取一定范围的值zrevrangebyscore 按score从高到低排名的结果zinterstore 对两个有序集合的交集进行运算,并保存zunionstore 对两个有序集合的并集进行运算,并保存
3.3 有序集合常用方法的时间复杂度
zadd命令的时间复杂度为log(N),n是有序集合中元素的个数zrem,zscore,zincrby,zcard命令的时间复杂度为O(1)zrange,zremrangebyrank,zrangebyscore,zcount,zremrangebyscore命令的时间复杂度为log(N) + m,n为有序集合元素的个数,m为有序集合中被操作元素的个数
例子:
127.0.0.1:6379> zadd player:rank 1000 python 900 java 800 php 600 sql(integer) 4127.0.0.1:6379> zscore player:rank php"800"127.0.0.1:6379> zcard player:rank(integer) 4127.0.0.1:6379> zrank player:rank python(integer) 3127.0.0.1:6379> zrem player:rank java(integer) 1127.0.0.1:6379> zrange player:rank 0 -1 withscores1) "sql"2) "600"3) "php"4) "800"5) "python"6) "1000"127.0.0.1:6379> zadd player:rank 1000 python 900 java 800 php 600 sql(integer) 1127.0.0.1:6379> zrange player:rank 0 -11) "sql"2) "php"3) "java"4) "python"127.0.0.1:6379> zcount player:rank 700 901(integer) 2127.0.0.1:6379> zrangebyscore player:rank 700 9011) "php"2) "java"127.0.0.1:6379> zremrangebyrank player:rank 0 1(integer) 2127.0.0.1:6379> zrange player:rank 0 -11) "java"2) "python"127.0.0.1:6379> zrange player:rank 0 -1 withscores1) "java"2) "900"3) "python"4) "1000"
3.4 有序集合实战
排行榜
4. 集合与有序集合的区别
都没有重复元素集合无序,有序集合是有序的集合中只有element,有序集合中有element+score
5. 列表与有序集合的区别
列表可以有重复元素,有序集合没有重复元素列表有序,有序集合有序列表中只有element,有序集合中有element+score