以下数据操作 参考博客:https://blog.csdn.net/u010476739/article/details/99490167
Redis
简介
Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
-
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
-
Redis 与其他 key - value 缓存产品有以下三个特点:
-
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
-
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
-
Redis支持数据的备份,即master-slave模式的数据备份。
优点
-
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
-
丰富的数据类型 – Redis支持二进制案例的 Strings,Lists,Hashes,Sets 及 Ordered Sets 数据类型操作。
-
原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
-
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
-
快
- 纯内存操作
- 单线程避免上下文切换
- 非阻塞IO多路复用机制
缺点
- 内存限制,不能用作海量数据
Redis支持五种数据类型:
-
string(字符串)
-
hash(哈希)
键值对、特别适合存储对象、键和值都是字符串 -
list(列表)
字符串列表、链表结构 -
set(集合)
字符串集合、非重复、无序、基于hash原理 -
zset(sorted set:有序集合)
在set基础上添加了用于排序的权重属性
组织特点:
目录:
Key操作
redis 是一个 Key-Value数据库,先说说对 Key的操作
- 查看当前连接的是哪个数据库(redis默认有16个)
127.0.0.1:6500> select 1
OK
127.0.0.1:6500[1]> select 0
OK
-
切换当前使用的数据库:select 0
-
判断键“str-value”是否存在:exists str-key
127.0.0.1:6500> exists str-key
(integer) 0
127.0.0.1:6500> set str-key str-value
OK
127.0.0.1:6500> exists str-key
(integer) 1
存在返回1,不存在返回0
- 设置键“str-key”的值为“str-value”:set str-key str-value
127.0.0.1:6500> set str-key str-value
OK
- 判断键(str-key)存储的数据类型
127.0.0.1:6500> type str-key
string
- 新添加两个键,然后搜索
127.0.0.1:6500> set key1 "hello,redis"
OK
127.0.0.1:6500> set key2 "who are you"
OK
127.0.0.1:6500> keys *
"key2"
"key1"
"str-key"
127.0.0.1:6500> keys "*1*"
"key1"
- 给键“key2”设置过期时间,并查看剩余的逗留时间及过期效果
127.0.0.1:6500> keys *
"key2"
"key1"
"str-key"
127.0.0.1:6500> ttl key2
(integer) -1
127.0.0.1:6500> expire key2 30
(integer) 1
127.0.0.1:6500> ttl key2
(integer) 26
127.0.0.1:6500> ttl key2
(integer) 15
127.0.0.1:6500> get key2
"who are you?"
127.0.0.1:6500> ttl key2
(integer) 3
127.0.0.1:6500> ttl key2
(integer) -2
127.0.0.1:6500> get key2
(nil)
127.0.0.1:6500> keys *
"key1"
"str-key"
127.0.0.1:6500>
可以看到key2在过期时间到了之后就被移除了,也就查不到了,并且ttl key2返回的是-2(表示的是不存在,也就是过期了被删除了),如果返回的是-1那么表示的是没有设置过期时间
- 移除过期时间:persist key1
127.0.0.1:6500> keys *
"key1"
"str-key"
127.0.0.1:6500> ttl key1
(integer) -1
127.0.0.1:6500> expire key1 60
(integer) 1
127.0.0.1:6500> ttl key1
(integer) 53
127.0.0.1:6500> persist key1
(integer) 1
127.0.0.1:6500> ttl key1
(integer) -1
127.0.0.1:6500> keys *
"key1"
"str-key"
可以看到,移除了设置的过期时间后ttl key1返回的是-1,表示没有设置过期时间
- 删除键:del str-key key1
127.0.0.1:6500> keys *
1) "key1"
2) "str-key"
127.0.0.1:6500> del str-key key1
(integer) 2
127.0.0.1:6500> keys *
(empty list or set)
- 清空当前数据库所有的键(flushdb)和获取当前数据库键的数目
127.0.0.1:6500> mset name xiaoming age 20
OK
127.0.0.1:6500> keys *
1) "age"
2) "name"
127.0.0.1:6500> dbsize
(integer) 2
127.0.0.1:6500> flushdb
OK
127.0.0.1:6500> dbsize
(integer) 0
127.0.0.1:6500> keys *
(empty list or set)
- 清空所有数据库的键
127.0.0.1:6500> mset name xiaoming age 20
OK
127.0.0.1:6500> keys *
1) "age"
2) "name"
127.0.0.1:6500> select 1
OK
127.0.0.1:6500[1]> mset name liubei age 42
OK
127.0.0.1:6500[1]> keys *
1) "age"
2) "name"
127.0.0.1:6500[1]> flushall
OK
127.0.0.1:6500[1]> keys *
(empty list or set)
127.0.0.1:6500[1]> select 0
OK
127.0.0.1:6500> keys *
(empty list or set)
127.0.0.1:6500> dbsize
(integer) 0
可以看到当执行完flushall之后所有数据库的键都清空了
-
显示服务器信息:info
-
显示所有连接到这个server的客户端:client list
127.0.0.1:6500> client list
id=3 addr=127.0.0.1:38380 fd=7 name= age=888 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client
字符串操作
- 设置和获取字符串:set blog_title "this is a amazing girl!"和get blog_title
127.0.0.1:6500> set blog_title "this is a amazing girl!"
OK
127.0.0.1:6500> get blog_title
"this is a amazing girl!"
其实这里的设置是有则覆盖,没有就新建。
- 根据起始索引获取子字符串:getrange blog_title 2 3
127.0.0.1:6500> getrange blog_title 2 3
"is"
- 给字符串设置新值并返回之前的值:
127.0.0.1:6500> getset blog_title "haha this is a new title!"
"this is a amazing girl!"
127.0.0.1:6500> get blog_title
"haha this is a new title!"
- 新设置字符串键,并批量获取这些键:mget blog_user blog_title
127.0.0.1:6500> keys *
"blog_title"
127.0.0.1:6500> set blog_user "jackletter"
OK
127.0.0.1:6500> keys *
"blog_user"
"blog_title"
127.0.0.1:6500> mget blog_user blog_title
"jackletter"
"haha this is a new title!"
- 设置字符串的过期时间和值:setex blog_user 60 xiaoming
127.0.0.1:6500> setex blog_user 60 xiaoming
OK
127.0.0.1:6500> ttl blog_user
(integer) 51
127.0.0.1:6500> get blog_user
"xiaoming"
127.0.0.1:6500> persist blog_user
(integer) 1
127.0.0.1:6500> ttl blog_user
(integer) -1
127.0.0.1:6500> get blog_user
"xiaoming"
- 只有当字符串键不存在时才设置值:setnx blog_user nouser
127.0.0.1:6500> get blog_user
"xiaoming"
127.0.0.1:6500> setnx blog_user nouser
(integer) 0
127.0.0.1:6500> get blog_user
"xiaoming"
可以看到当blog_user 存在值的时候是没有设置进去的,这区别于set key value
- 返回字符串的长度:strlen blog_user
127.0.0.1:6500> get blog_user
"xiaoming"
127.0.0.1:6500> strlen blog_user
(integer) 8
- 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始(SETRANGE key offset value):setrange blog_user 4 new
127.0.0.1:6500> get blog_user
"xiaoming"
127.0.0.1:6500> setrange blog_user 4 new
(integer) 8
127.0.0.1:6500> get blog_user
"xiaonewg"
- 同时设置一个或多个 key-value 对:mset blog_time 2019-08-14 blog_theme redis-talking
127.0.0.1:6500> keys *
"blog_user"
"blog_title"
127.0.0.1:6500> mset blog_time 2019-08-14 blog_theme redis-talking
OK
127.0.0.1:6500> keys *
"blog_theme"
"blog_time"
"blog_user"
"blog_title"
- 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在:msetnx blog_time 2018-08-14 blog_theme redis-talking
127.0.0.1:6500> msetnx blog_time 2018-08-14 blog_theme redis-talking
(integer) 0
127.0.0.1:6500> get blog_time
"2019-08-14"
可以看到 blog_time的值并没有改变
- 字符串的递增和递减:incr testint和incrby testint 4、decr testint和decrby testint 4、incrbyfloat
testint 0.23
127.0.0.1:6500> set testint 5
OK
127.0.0.1:6500> get testint
"5"
127.0.0.1:6500> incr testint
(integer) 6
127.0.0.1:6500> get testint
"6"
127.0.0.1:6500> incrby testint 4
(integer) 10
127.0.0.1:6500> get testint
"10"
127.0.0.1:6500> decr testint
(integer) 9
127.0.0.1:6500> get testint
"9"
127.0.0.1:6500> decrby testint 4
(integer) 5
127.0.0.1:6500> get testint
"5"
127.0.0.1:6500> incrbyfloat testint 0.23
"5.23"
127.0.0.1:6500> get testint
"5.23"
- 字符串的追加:append blog_user " lalala"
127.0.0.1:6500> get blog_user
"xiaonewg"
127.0.0.1:6500> append blog_user " lalala"
(integer) 15
127.0.0.1:6500> get blog_user
"xiaonewg lalala"
127.0.0.1:6500> keys *
"blog_user"
"blog_time"
"blog_theme"
"blog_title"
"testint"
127.0.0.1:6500> append testnew "append new"
(integer) 10
127.0.0.1:6500> get testnew
"append new"
这里可以看出,append其实是有则追加末尾,否则新增
哈希操作
概念说明:
对于每一个以hash结果存储的都称之为一个哈希表,它里面的每个键值对都称之为域
- 存储、获取、批量存储与获取哈希表中的域
127.0.0.1:6500> hset user name xiaoming
(integer) 1
127.0.0.1:6500> hset user age 20
(integer) 1
127.0.0.1:6500> hset user addr tianminglu
(integer) 1
127.0.0.1:6500> hget user name
"xiaoming"
127.0.0.1:6500> hget user age
"20"
127.0.0.1:6500> hmget user name age addr
"xiaoming"
"20"
"tianminglu"
127.0.0.1:6500> hmset user name liubei addr taohuayuan
OK
127.0.0.1:6500> hmget user name age addr
"liubei"
"20"
"taohuayuan"
- 获取哈希表中的所有域:>hgetall
127.0.0.1:6500> hgetall user
"name"
"liubei"
"age"
"20"
"addr"
"taohuayuan"
- 获取哈希表中所有存储的域名:hkeys user
127.0.0.1:6500> hkeys user
"name"
"age"
"addr"
- 判断哈希表中是否存储了某个域:hexists key field
127.0.0.1:6500> hkeys user
"name"
"age"
"addr"
127.0.0.1:6500> hexists user name
(integer) 1
127.0.0.1:6500> hexists user no
(integer) 0
- 返回哈希表中域的数量:hlen user
127.0.0.1:6500> hkeys user
"name"
"age"
"addr"
127.0.0.1:6500> hlen user
(integer) 3
- 返回哈希表 user中所有域的值:hvals user
127.0.0.1:6500> hvals user
"liubei"
"20"
"taohuayuan"
- 删除哈希表 中的一个或多个指定域,不存在的域将被忽略:hdel user name addr no
127.0.0.1:6500> hkeys user
"name"
"age"
"addr"
127.0.0.1:6500> hdel user name addr no
(integer) 2
127.0.0.1:6500> hkeys user
"age"
- 将哈希表中的域 field 的值设置为 value ,当且仅当域 field 不存在:
127.0.0.1:6500> hkeys user
"age"
127.0.0.1:6500> hvals user
"20"
127.0.0.1:6500> hsetnx user age 18
(integer) 0
127.0.0.1:6500> hvals user
"20"
由此可看到,当age存在时并没有进行覆盖
列表操作
说明:
列表是链状结构的,操作时可以从左边(头)或右边操作(尾),以左边操作为主。每次push和pop数据就像是将数据压入和弹出一样。
- 从左边压入数据:127.0.0.1:6500
127.0.0.1:6500> lpush list a b c d
(integer) 4
127.0.0.1:6500> lrange list 0 4
"d"
"c"
"b"
"a"
- 从右边压入数据:127.0.0.1:6500>
127.0.0.1:6500> rpush list 1 2 3
(integer) 7
127.0.0.1:6500> lrange list 0 6
"d"
"c"
"b"
"a"
"1"
"2"
"3"
- 从左右两侧分别弹出数据
127.0.0.1:6500> lpop list
"d"
127.0.0.1:6500> rpop list
"3"
127.0.0.1:6500> lrange list 0 4
"c"
"b"
"a"
"1"
"2"
压入和弹出操作说明
-
压入和弹出都是操作的时候就指明了从哪边(左还是右或头还是尾),不像js中数组的push和pop都-是从尾部操作的(从头部操作用的是shift:弹出,unshift:压入)
-
lrange命令是从左到右显示列表中的值(显示全部数据:lrange list 0 -1)
操作的图解:
- 获取列表的存储数量:llen list
127.0.0.1:6500> llen list
(integer) 5
- 根据索引值获取列表中的元素:lindex list -1
说明: 索引为正数表示从左边开始,为负数表示从右边开始
127.0.0.1:6500> lrange list 0 10
"c"
"b"
"a"
"1"
"2"
127.0.0.1:6500> llen list
(integer) 5
127.0.0.1:6500> lindex list 0
"c"
127.0.0.1:6500> lindex list -1
"2"
- 插入数据:lLINSERT key BEFORE|AFTER pivot value
将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
127.0.0.1:6500> lrange list 0 -1
"c"
"b"
"a"
"1"
"2"
127.0.0.1:6500> linsert list before a other
(integer) 6
127.0.0.1:6500> lrange list 0 -1
"c"
"b"
"other"
"a"
"1"
"2"
127.0.0.1:6500> linsert list after other op
(integer) 7
127.0.0.1:6500> lrange list 0 -1
"c"
"b"
"other"
"op"
"a"
"1"
"2"
- 更改list指定索引的值:lset list 3 new
127.0.0.1:6500> lrange list 0 -1
"c"
"b"
"other"
"op"
"a"
"1"
"2"
127.0.0.1:6500> lset list 3 new
OK
127.0.0.1:6500> lrange list 0 -1
"c"
"b"
"other"
"new"
"a"
"1"
"2"
- 只保留列表中指定其实索引的值,其他的删除:ltrim list 2 -2
127.0.0.1:6500> lrange list 0 -1
"c"
"b"
"other"
"new"
"a"
"1"
"2"
127.0.0.1:6500> ltrim list 2 -2
OK
127.0.0.1:6500> lrange list 0 -1
"other"
"new"
"a"
"1"
- 根据值移除列表中的元素(两种模式:移除几个或全部移除)
127.0.0.1:6500> lpush list a a a a
(integer) 4
127.0.0.1:6500> lrange list 0 -1
"a"
"a"
"a"
"a"
127.0.0.1:6500> lrem list 0 a
(integer) 4
127.0.0.1:6500> lrange list 0 -1
(empty list or set)
127.0.0.1:6500> lpush list a a a a
(integer) 4
127.0.0.1:6500> lrange list 0 -1
"a"
"a"
"a"
"a"
127.0.0.1:6500> lrem list 2 a
(integer) 2
127.0.0.1:6500> lrange list 0 -1
"a"
"a"
- 如果要移除全部匹配的就是 lrem list 0 a
- 如果要移除几个匹配的就是lrem list 2
- 当这个列表存在时才压入数据:lpushx list2 a或rpushx list2 c
127.0.0.1:6500> lpushx list2 a
(integer) 0
127.0.0.1:6500> keys *
(empty list or set)
127.0.0.1:6500> rpushx list2 c
(integer) 0
127.0.0.1:6500> keys *
(empty list or set)
- 将一个列表中的尾部数据移动到另一个列表的头部并返回这个值:
127.0.0.1:6500> keys *
(empty list or set)
127.0.0.1:6500> lpush list1 1 2 3 4
(integer) 4
127.0.0.1:6500> rpoplpush list1 list2
"1"
127.0.0.1:6500> keys *
"list2"
"list1"
127.0.0.1:6500> lrange list1 0 -1
"4"
"3"
"2"
127.0.0.1:6500> lrange list2 0 -1
"1"
- 原列表和目的列表可以是相同的,这样就可以给列表“旋转”了
- 列表的这种操作常用在消息队列上
-
阻塞弹出值:blpop list 60或brpop list1 list2 0
说明: 对于空列表进行阻塞,标题上显示的是60秒的等待时间,如果无线等待就是“0”,也可以同时等待多个列表直到弹出第一个
首先发起阻塞弹出命令:
可以看到窗口已经被阻塞了
在另一个窗口进行数据压入:
最后观察阻塞窗口的效果:
可以看到阻塞的窗口已经完成了数据的弹出
-
阻塞的命令还有“brpop”、“brpoplpush”,类似“blpop”
集合(set)操作
注意: 集合的特点是不重复、无序
- 向集合中添加数据sadd set liubei guanyu zhangfei;显示集合数据smembers set;显示集合元素数量scard set
127.0.0.1:6500> keys *
(empty list or set)
127.0.0.1:6500> sadd set liubei guanyu zhangfei
(integer) 3
127.0.0.1:6500> scard set
(integer) 3
127.0.0.1:6500> smembers set
"guanyu"
"liubei"
"zhangfei"
127.0.0.1:6500> sadd set liubei
(integer) 0
127.0.0.1:6500> smembers set
"guanyu"
"liubei"
"zhangfei"
- 判断集合中是否存在某个元素:sismember set liubei
127.0.0.1:6500> smembers set
"guanyu"
"liubei"
"zhangfei"
127.0.0.1:6500> sismember set liubei
(integer) 1
127.0.0.1:6500> sismember set xiaoming
(integer) 0
- 求集合交集:sinter set set2;求交集并以覆盖的方式存储到另外一个集合:sinterstore set3 set
注意: set3已经被交集覆盖了,即使交集的结果为空也会覆盖(相当于删除了)
set2
127.0.0.1:6500> smembers set
"guanyu"
"liubei"
"zhangfei"
127.0.0.1:6500> smembers set2
"huangzhong"
"liubei"
"zhuge"
127.0.0.1:6500> smembers set3
"xiaoming"
127.0.0.1:6500> smembers inter
(empty list or set)
127.0.0.1:6500> sinter set set2
"liubei"
127.0.0.1:6500> sinterstore set3 set set2
(integer) 1
127.0.0.1:6500> smembers set3
"liubei"
- 求差集(第一个集合减去后面的集合):sdiff set set2 set3;求差集并且存储:sdiffstore set4 set
set2 set3
127.0.0.1:6500> smembers set
"c"
"b"
"a"
127.0.0.1:6500> smembers set2
"1"
"a"
127.0.0.1:6500> smembers set3
"2"
"b"
127.0.0.1:6500> smembers set4
(empty list or set)
127.0.0.1:6500> sdiff set set2 set3
"c"
127.0.0.1:6500> sdiffstore set4 set set2 set3
(integer) 1
127.0.0.1:6500> smembers set4
"c"
注意:这个差集存储也是覆盖型的
- 求并集:sunion set set2;求并集并存储:sunionstore set3 set set2
127.0.0.1:6500> smembers set
"1"
"2"
127.0.0.1:6500> smembers set2
"b"
"a"
127.0.0.1:6500> smembers set3
(empty list or set)
127.0.0.1:6500> sunion set set2
"1"
"a"
"b"
"2"
127.0.0.1:6500> sunionstore set3 set set2
(integer) 4
127.0.0.1:6500> smembers set3
"1"
"a"
"b"
"2"
注意:这个并集的存储也是覆盖型的
- 移除集合中的元素:srem set 1
127.0.0.1:6500> smembers set
"1"
"2"
127.0.0.1:6500> srem set 1
(integer) 1
127.0.0.1:6500> smembers set
"2"
- 移动集合1中的元素到集合2中:smove set set2 1
127.0.0.1:6500> smembers set
"1"
"2"
127.0.0.1:6500> smembers set2
"b"
"a"
127.0.0.1:6500> smove set set2 1
(integer) 1
127.0.0.1:6500> smembers set
"2"
127.0.0.1:6500> smembers set2
"1"
"b"
"a"
有序集合
说明:
有序集合的权重又称之为score,它可以是整数的也可以是浮点型的
- 添加数据:zadd sortset 1.2 liubei 3.5 zhangfei 2.1 guanyu;查看数据:zrange sortset 0 -1 widthscores;获取集合存储数据数量:zcard sortset
127.0.0.1:6500> zadd sortset 1.2 liubei 3.5 zhangfei 2.1 guanyu
(integer) 3
127.0.0.1:6500> zrange sortset 0 -1 withscores
"liubei"
"1.2"
"guanyu"
"2.1000000000000001"
"zhangfei"
"3.5"
127.0.0.1:6500> zrange sortset 0 -1
"liubei"
"guanyu"
"zhangfei"
127.0.0.1:6500> zcard sortset
(integer) 3
- 统计score在某一区间内的元素数量:zcount sortset 2 3.5
127.0.0.1:6500> zrange sortset 0 -1 withscores
"liubei"
"1.2"
"guanyu"
"2.1000000000000001"
"zhangfei"
"3.5"
127.0.0.1:6500> zcount sortset 2 3.5
(integer) 2
- 返回有序集中,成员的分数值:zscore sortset liubei
127.0.0.1:6500> zrange sortset 0 -1 withscores
"liubei"
"1.2"
"guanyu"
"2.1000000000000001"
"zhangfei"
"3.5"
127.0.0.1:6500> zscore sortset liubei
"1.2"
- 返回有序集合中指定成员的索引:zrank sortset guanyu
127.0.0.1:6500> zrange sortset 0 -1 withscores
"liubei"
"1.2"
"guanyu"
"2.1000000000000001"
"zhangfei"
"3.5"
127.0.0.1:6500> zrank sortset guanyu
(integer) 1
- 移除有序集合中的一个或多个成员:zrem sortset guanyu zhangfei
127.0.0.1:6500> zrange sortset 0 -1 withscores
"liubei"
"1.2"
"guanyu"
"2.1000000000000001"
"zhangfei"
"3.5"
127.0.0.1:6500> zrem sortset guanyu zhangfei
(integer) 2
127.0.0.1:6500> zrange sortset 0 -1 withscores
"liubei"
"1.2"
- 有序集合中对指定成员的分数加上增量 increment:zincrby sortset 2 liubei
127.0.0.1:6500> zrange sortset 0 -1 withscores
"liubei"
"1.2"
127.0.0.1:6500> zincrby sortset 2 liubei
"3.2000000000000002"
127.0.0.1:6500> zrange sortset 0 -1 withscores
"liubei"
"3.2000000000000002"
- 计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination:zinterstore sortset4 2 sortset sortset2
127.0.0.1:6500> zrange sortset 0 -1 withscores
"a"
"1"
"b"
"2"
127.0.0.1:6500> zrange sortset2 0 -1 withscores
"b"
"1"
"c"
"2"
127.0.0.1:6500> zrange sortset3 0 -1 withscores
(empty list or set)
127.0.0.1:6500> zinterstore sortset3 2 sortset sortset2
(integer) 1
127.0.0.1:6500> zrange sortset3 0 -1 withscores
"b"
"3"
127.0.0.1:6500> zadd sortset4 4 hu
(integer) 1
127.0.0.1:6500> zrange sortset4 0 -1
"hu"
127.0.0.1:6500> zinterstore sortset4 2 sortset sortset2
(integer) 1
127.0.0.1:6500> zrange sortset4 0 -1 withscores
"b"
"3"
注意:这个求交集的时候必须指定交集运算的集合数量,还有交集的时候是把score相加的,当然对于目标集合是覆盖型的
- 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列:zrangebyscore sortset (1 4 withscores
127.0.0.1:6500> zrange sortset 0 -1 withscores
"a"
"1"
"c"
"2"
"b"
"4"
"d"
"4"
127.0.0.1:6500> zrangebyscore sortset (1 4 withscores
"c"
"2"
"b"
"4"
"d"
"4"
127.0.0.1:6500> zrangebyscore sortset -inf +inf withscores
"a"
"1"
"c"
"2"
"b"
"4"
"d"
"4"
score的区间:上面写法的意思(1 4是score>1并且score<=4的时候,-inf +inf表示的是全部的分数
- 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列:
zrank sortset b
127.0.0.1:6500> zrange sortset 0 -1 withscores
"a"
"1"
"c"
"2"
"b"
"4"
"d"
"4"
127.0.0.1:6500> zrank sortset b
(integer) 2
- 其他的命令还有求并集的“ZUNIONSTORE”、根据排名删除的“ZREMRANGEBYRANK”、根据权重删除的“ZREMRANGEBYSCORE” 这里不再试验
参考博客:https://blog.csdn.net/u010476739/article/details/99490167