Redis 简单使用
一、简介:
-
Redis是一个开源的、高性能的、C语言开发、遵守BSD协议,键值对(key-value)存储数据的NoSql数据库
。 -
Redis支持数据的持久化,可以将内存中的数据保存再磁盘中,重启的时候可以再次加载进行使用
。 -
Redis不仅支持key-value类型的数据,同时还提供str、list、set、zset、hash等数据结构存储
。 -
Redis支持数据的备份,master-slave模式的数据备份
。
二、优势:
- 性能极高:Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 原子性:Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富数据类型:Redis支持二进制Strings、Lists、Hashes、Sets 及 Ordered Sets 数据类型操作。
- 丰富的特性:Redis还支持 publish/subscribe, 通知,key 过期等等特性。
三、特性:
- 速度快:
- 因为数据存储再内存中,而且Redis使用C语言开发。
- 持久化:
- Redis所有数据保持再内存中,对数据的更新将异步地保存到磁盘上,防止断电或宕机数据的丢失。
- 多种数据结构:
- 衍生的数据结构:
BitMaps:位图
HyperLogLog:超小内存实现唯一值计数
GEO:地理信息定位
- 支持多种编辑语言:
- Python、Java、Ruby、Php、Node.js等
- 功能丰富:
- 发布订阅
- Lua脚本
- 事务
- pipeline
- 简单:
- 再版本3.0之前,总共有23000行代码,3.0后出现集群分布式代码总行数50000行左右。
- 不依赖于外部库
- 单线程模型(开发较容易)
- 主从复制:
- 主服务器负责写,从服务器负责读,从服务器会备份主服务器中的数据,当主宕机后,从服务器会变成主服务器。
- 高可用、分布式:
- 高可用:Redis-Sentinel(v2.8)支持高可用。
- 分布式:Redis-Cluster(v3.0)支持分布式。
四、Redis典型应用场景:
- 缓存系统:如图所示
- 计数器:论坛的点赞数、转发数、评论数等。
- 消息队列系统:如图所示
- 排行榜功能:使用集合数据类型,进行一些数据的排序。
- 社交网络:一些粉丝的数量、关注数量、是否互相关注等。
- 实时系统:垃圾邮件处理系统、布隆过滤器等,使用Redis位图的功能来实现。
五、Redis安装及启动:
1.Linux的安装Redis:
wget http://download.redis.io/releases/redis-3.0.7.tar.gz
tar -xzf redis-3.0.7.tar.gz
ln -s redis-3.0.7 redis // 进行软连接
cd redis // 进入目录
make && make install // 进行编译跟安装
2.redis可执行文件说明:
redis-server:Redis服务器
redis-cli:Redis命令行客户端
redis-benchmark:对Redis做一些基准测试,可以说是性能测试
redis-check-aof:AOF文件修复工具
redis-check-dump:RDB文件检查工具
redis-sentinel:Sentinel服务器(2.8以后),支持高可用
3.三种启动方法:
- 最简启动:
redis-server
- 动态参数启动:
redis-server --port 6379
- 配置文件启动(推荐):
redis-server configPath
- 查看启动验证:
ps -ef | grep redis # 查看进程的方式进行验证
netstat -antpl | grep redis # 查看端口是否是监听的状态
redis-cli -h -ip -p port ping # 使用客户端去ping 是否返回PONG(代表成功)
4.Redis客户端连接:
➜ ~ redis-cli -h 192.168.1.10 -p 6379 # -h 后面指定IP地址 -p 后面指定端口
192.168.1.10:6379> ping # 返回PONG 说明成功
PONG
192.168.1.10:6379> set hello word # 设置键值对, key为hello value为word
OK
192.168.1.10:6379> get hello # 通过获取key 返回value值
"word"
192.168.1.10:6379>
5.Redis客户端返回值:
- 状态回复:
192.168.1.10:6379> ping # ping 返回PONG 说明连接成功
PONG
- 错误回复:
192.168.1.10:6379> get hello word # error 错误回复, 会提示你错误的信息
(error) ERR wrong number of arguments for 'get' command
- 整数回复:
192.168.1.10:6379>incr hello # 回复的1,代表一个整数
(integer)1
- 字符串回复:
192.168.1.10:6379> get hello # 通过key 获取value 返回word
"word"
- 多行字符串回复:
192.168.1.10:6379> mget hello hi # hello是key hi也是key 获取多个Key所对应的value
1) "word" # 是hello所对应的value
2) "fe_cow" # 是hi所对应的value
6.Redis常用配置:
- daemonize:是否是守护进程(no|yes)
- port:Redis对外端口号(
默认端口6379
)
- 为什么Redis默认端口是6379呢?
- 因为6379是手机按键上MERZ对应的号码,MERZ取自意大利歌女Alessia Merz的名字。
- logfile:Redis系统日志
- dir:Redis工作目录
- 查看所有配置文件:
192.168.1.10:6379> config get * # 可以看到总共有多少个配置文件
六、Redis通用命令:
1.遍历所有key:
- 命令:
keys *
192.168.1.10:6379> set python good # 首先添加数据 key: python value:good
OK
192.168.1.10:6379> set java spring # 添加数据 key:java value:spring
OK
192.168.1.10:6379> set php best # 添加数据 key:php value: best
OK
192.168.1.10:6379> keys * # 遍历所有的Key命令
1) "java"
2) "php"
3) "python"
2.遍历所有的key指定参数:
- 命令:
keys [pattern]
192.168.1.10:6379> keys p* # 遍历所有以p开头的key
1) "php"
2) "python"
192.168.1.10:6379> keys ph? # 遍历所有是ph开头的key, ?代表后面匹配一位
1) "php"
192.168.1.10:6379> keys p[a-z]* # 遍历所有key第一位是p开头,第二位是a到字母的区间, *代表通配符
1) "php"
2) "python"
3.计算key总数:
- 命令:
dbsize
192.168.1.10:6379> dbsize # 计算Key的总数
(integer) 3
4.检查key是否存在:
- 命令:
exists key
192.168.1.10:6379> exists python # 返回1说明key存在
(integer) 1
192.168.1.10:6379> exists c++ # 返回0说明key不存在
(integer) 0
5.删除指定的key-value:
- 命令:
del key
192.168.1.10:6379> set c++ hello # 设置一个key:c++ value:hello
OK
192.168.1.10:6379> get c++ # 获取key相对应的value
"hello"
192.168.1.10:6379> del c++ # 删除key
(integer) 1
192.168.1.10:6379> get c++ # 获取key相对应的value (nil) 表示不存在
(nil)
192.168.1.10:6379> keys * # 查看所有的key,发现key名为c++ 也被删除了
1) "java"
2) "php"
3) "python"
6.设置key的过期时间:
- 命令:
expire key seconds
192.168.1.10:6379> expire python 30 # 给key名为python设置过期时间为30秒
(integer) 1
7.查看key剩余的过期时间:
- 命令:
ttl key
192.168.1.10:6379> ttl python # 查看key剩余的过期时间, 下面提示还有23秒
(integer) 23
192.168.1.10:6379> ttl python # 如果提示-2,说明过期时间已经到了,key已经不存在了
(integer) -2
8.去掉key的过期时间:
- 命令:
persist key
192.168.1.10:6379> set python good # 设置key:python value: good
OK
192.168.1.10:6379> expire python 30 # 设置key: python过期时间为30秒
(integer) 1
192.168.1.10:6379> ttl python # 查看key:python剩余过期时间
(integer) 26
192.168.1.10:6379> persist python # 取消设置key:python过期时间
(integer) 1
192.168.1.10:6379> ttl python # 查看key:python剩余过期时间, -1表示key存在,并没有设置过期时间
(integer) -1
9.查看key的类型:
- 命令:
type key
192.168.1.10:6379> set my_str type # 字符串的添加
OK
192.168.1.10:6379> type my_str # 返回string是字符串类型
string
192.168.1.10:6379> sadd my_set type # 集合的添加
(integer) 1
192.168.1.10:6379> type my_set # 返回的是set集合类型
set
返回类型有:string(字符串)、hash(哈希)、list(列表)、set(集合)、zet(有序集合)、none(空)。
10.时间复杂度:
命令 | 时间复杂度 |
keys | O(n) |
dbsize | O(1) |
del | O(1) |
exists | O(1) |
expire | O(1) |
ttl | O(1) |
persist | O(1) |
type | O(1) |
七、Redis数据结构和内部编码:
1.字符串(string):
1.1字符串键值结构:
key:value(string、int、bits、json、xml)
注意:value值不可以超过512MB
1.2字符串使用场景:
1.缓存
2.分布式锁
3.计数器
1.3字符串命令:
1.获取key对应的value:get key
127.0.0.1:6379> get python # 获取python[key]对应的 value "good"就是value
"good"
2.设置key-value:set key value
127.0.0.1:6379> set c++ nice # 设置key=c++ value=nice 字符串类型
OK
3.删除key-value:del key
127.0.0.1:6379> del c++ # 删除key名为c++ 的 key-value
(integer) 1
4.key自增1,如果key不存在,自增后get(key)=1:incr key
127.0.0.1:6379> get couter # 首先查看key名为couter的是否存在
(nil)
127.0.0.1:6379> incr couter # 若key名为couter不存在, 那么自动+1
(integer) 1
127.0.0.1:6379> get couter # 查看key名为couter的计数为1
"1"
5.key自减1,如果key不存在,自减后get(key)=-1:decr key
127.0.0.1:6379> decr couter # 首先key名为couter的已经存在, 上面的操作couter计数是1, 所以删除1
(integer) 0 # 结果目前为0
6.key自增k,如果key不存在,自增后get(key) =k:incrby key k
127.0.0.1:6379> incrby couter 100 # 指定添加数量, 给key名为couter 添加计数100
(integer) 100
127.0.0.1:6379> get couter # 查看当前key名为couter的计数是多少
"100"
7.key自减k,如果key不存在,自减后get(key)=-k:decrby key k
127.0.0.1:6379> get couter # 查看当前的key名为couter的计数, 结果是100
"100"
127.0.0.1:6379> decrby couter 99 # 减去key名为couter 指定的数量99, 100-99=1
(integer) 1
8.不管key是否存在,都设置:set key value
127.0.0.1:6379> exists c++ # 首先看c++这个key 是否存在 0表示不存在
(integer) 0
127.0.0.1:6379> set c++ good # 无论key是否存在, 都进行设置key名是c++ value名是good
OK
9.key不存在,才设置:setnx key value
127.0.0.1:6379> setnx c++ bad # key不存在 才设置, 返回0说明设置失败了, 因为key名是c++已经存在
(integer) 0
10.key存在,才设置:set key value xx
127.0.0.1:6379> set c++ bad xx # key名为c++的已经存在, 将key 对应的value 进行了更新
OK
127.0.0.1:6379> get c++ # 可以看到key名为c++ 对应的value good 更改成了bad
"bad"
set key value xx:相当于是update()操作,如果key存在,将key对应的value进行更新,若key不存在,那么就更新失败。
11.批量设置key-value:mset key1 value1 key2 value2 ke3 value3
127.0.0.1:6379> mset java good python best php nice # 批量创建key-value
OK
12.批量获取Key,原子操作:mget key1 key2 key3
127.0.0.1:6379> mget java python php # 批量获取key 对应的value
1) "good"
2) "best"
3) "nice"
13.设置新的value并返回旧的value:getset key newvalue
127.0.0.1:6379> set python best # 给key名为python的设置value值为best
OK
127.0.0.1:6379> getset python good # 给Key名为Python的设置新的value为good,但是会返回旧的值
"best"
14.将value追加到旧的value:append key value
127.0.0.1:6379> append python nice # 往key名为python的追加value值为nice,如果key不存在,则创建
(integer) 8 # 往回的是字节长度
127.0.0.1:6379> get python
"goodnice"
15.返回字符串的长度(注意中文):strlen key
127.0.0.1:6379> strlen python # 返回的是key名为Python所对应值的字节长度
(integer) 8
16.增加key对应的值(浮点数):incrbyfloat key 6.6
127.0.0.1:6379> incr counter # 设置key名为counter 自增数为1
(integer) 1
127.0.0.1:6379> incrbyfloat counter 6.6 # 设置key名为counter 自增浮点数6.6
"7.6" # 6.6 + 1 = 7.6
17.获取字符串指定下标所有值:getrange key start end
127.0.0.1:6379> set c++ good # 设置key名为c++ value值为good
OK
127.0.0.1:6379> getrange c++ 0 2 # 获取key名为c++ 值good 下标是0-2对应的字母: goo
"goo"
18.设置指定下标所有对应值:setrange key index value
127.0.0.1:6379> setrange c++ 3 l # 将key名为c++ 下标为3的替换成字母l
(integer) 4
127.0.0.1:6379> get c++ # 查看c++的所对应的value值:gool
"gool"
1.4字符串时间复杂度:
命令 | 含义 | 复杂度 |
set key value | 设置key-value | O(1) |
get key | 获取key-value | O(1) |
del key | 删除key-value | O(1) |
setnx setxx | 根据key是否存在设置key-value | O(1) |
incr decr | 计数 | O(1) |
mget mset | 批量操作key-value(可以减少网络时间) | O(n) |
2.哈希(hash):
2.1哈希结构:
key—field—value
2.2哈希命令:
1.设置hash key对应field的value:hset key field value
127.0.0.1:6379> hset user age 23 # 设置key名为user field名为age value值为23
(integer) 1
2.获取hash key对应field的value:hget key field
127.0.0.1:6379> hget user age # 获取key名为user field名为age 所对应的value值
"23"
3.删除hash key对应field的value:hdel key field
127.0.0.1:6379> hdel user age # 删除key名为user field名为age 所对应的value值
(integer) 1
4.判断hash key 是否有field:hexists key field
127.0.0.1:6379> hexists user age # 判断key名为user field名为age 是否存在
(integer) 1 # 0表示不存在 1表示存在
5.获取hash key field 的数量:hlen key
127.0.0.1:6379> hgetall user # 查看所有key名user 下的filed以及value的值
1) "name"
2) "fe_cow"
3) "age"
4) "23"
127.0.0.1:6379> hlen user # 查看key对应 filed 的数量, 指的就是"name" ,"age", 返回结果2
(integer) 2
6.批量设置hash key一批filed value:hmset key field1 value1 field2 value2
127.0.0.1:6379> hmset user age 23 name fe_cow # 批量设置, key名为user field1 age value1 23
OK
127.0.0.1:6379> hlen user # 查看key所对应field的数量: field有age 跟name
(integer) 2
7.批量获取hash key的一批field对应的值:hmget key field1 value1 field2 value2
127.0.0.1:6379> hmget user age name # 批量查看key名为user 所对应的field名为age、name的value
1) "23"
2) "fe_cow"
8.返回hash key对应所有的field和value:hgetall key
127.0.0.1:6379> hgetall user # 获取key 所对应所有的field 跟value值
1) "age"
2) "23"
3) "name"
4) "fe_cow"
# 使用hgetall时小心操作,因为redis是单线程,数据量太大会很慢
9.返回hash key对应所有field的value:hvals key
127.0.0.1:6379> hvals user # 获取key 所对应所有value值
1) "23"
2) "fe_cow"
10.返回hash key对应所有field:hkeys key
127.0.0.1:6379> hkeys user # 获取key 所对应所有的field
1) "age"
2) "name"
11.设置hash key对应field的value(如field已经存在,则失败):hsetnx key field value
127.0.0.1:6379> hsetnx user age 18 # 没有key名为user field名为age 创建成功
(integer) 1
127.0.0.1:6379> hsetnx user age 18 # 若已经存在创建失败
(integer) 0
12.hash key对应的field的value自增intCounter:hincrby key field intCounter
127.0.0.1:6379> hincrby user counter 1 # 设置filed名为counter 计数为1
(integer) 1
127.0.0.1:6379> hvals user # 通过Key 查看所有的value值
1) "18"
2) "1"
13.计数浮点数:hincrbyfloat key field floatCounter
127.0.0.1:6379> hincrbyfloat user counter 6.6 # 设置field名为counter 计数为6.6 是浮点数
"7.6"
127.0.0.1:6379> hvals user # 通过key 查看所有的value值
1) "18"
2) "7.6"
2.3时间复杂度:
命令 | 复杂度 |
hget hset hdel | O(1) |
hexists | O(1) |
hincrby | O(1) |
hgetall hvals hkeys | O(1) |
hmget hmset | O(1) |
3.列表(list):
3.1列表结构、特点:
结构:key—elements
特点:1.有序;2.可以重复;3.左右两边插入弹出
3.2列表命令:
1.从列表右端插入值(1-N个):rpush key value1 value2....valueN
127.0.0.1:6379> rpush python good nice best # 从右边进行插入key名为python value值good nice best
(integer) 3
127.0.0.1:6379> lrange python 0 -1 # 查看所有的key名为python, 列表中包含的元素
1) "good"
2) "nice"
3) "best"
2.从列表左端插入值(1-N个):lpush key value1 value2....valueN
127.0.0.1:6379> lpush python java # 从左边进行插入元素名为java
(integer) 4
127.0.0.1:6379> lrange python 0 -1 # 查看key名为python 列表中所有的元素
1) "java"
2) "good"
3) "nice"
4) "best"
3.在list指定的值前|后插入newValue:linsert key before|after value newValue
# 比如当前列表 user = [a,b,c,d]
# 在key名为user 列表b前添加java, 执行命令:
linsert user before b java
# 输出结果:[a, java, b, c, d]
# 在key名为user 列表b后添加php, 执行命令:
linsert user after b php
# 输出结果:[a, b, php, c, d]
4.从列表左侧弹出一个元素:lpop key
# 当前列表 user = [a,b,c,d]
# 从列表左侧弹出一个item,执行命令:
lpop user
# 输出结果:[b,c,d]
5.从列表右侧弹出一个元素:rpop key
# 当前列表user = [a,b,c,d]
# 从列表右侧弹出一个item,执行命令:
rpop user
# 输出结果:[a,b,c]
6.删除指定的元素:lrem key count value(count负数代表从右边删除,正数代表从左边删除, 等于0代表全删)
# 当前列表user = [a,c,a,c,b,f]
# 把所有等于a的元素全部删掉
lrem user 0 a
# 输出结果:[c,c,b,f]
# 从右边删除等于c的一个元素
lrem user -1 c
# 输出结果:[c,b,f]
# 从左边删除等于b的一个元素
lrem user -1 b
# 输出结果:[c,f]
7.按照索引范围修剪列表:ltrim key start end
# 当前列表user = [a,b,c,d,e,f]
# 若想保留下标索引1-4,执行命令
ltrim user 1 4
# 输出结果:[b,c,d,e]
8.获取列表指定索引范围所有的元素:lrange key start end(包含end)
# 当前列表 user = [a,b,c,d,e,f]
# 查看当前列表前三个元素
lrange user 0 2
# 输出结果:[a,b,c]
# 查看当前列表从1元素到最后一个元素
lrange user 1 -1
# 输出结果:[b,c,d,e,f]
9.获取列表指定索引的元素:lindex key index
# 当前列表 user = [a,b,c,d,e,f]
# 获取user中第一个元素
lindex user 0
# 输出结果:[a]
# 获取user中最后一个元素
lindex user -1
# 输出结果:[f]
10.获取列表长度:llen key
# 当前列表 user = [a,b,c,d,e,f]
# 获取user列表长度
llen user
# 输出结果:6
11.设置列表指定索引新值:lset key index newValue
# 当前列表 user = [a,b,c,d,e,f]
# 将列表中索引位置为2的c,更改成python,执行命令:
lset user 2 python
# 输出结果:[a,b,python,d,e,f]
4.集合(set):
4.1集合结构、特点:
结构:key-values
特点:1.无序 2.无重复 3.集合间操作(交集、并集、差集等)
4.2集合命令:
1.向集合key添加element(如果element已经存在, 添加失败):sadd key element
127.0.0.1:6379> sadd python good nice best # 向集合中添加元素,key名为python 添加good,nice,best
(integer) 3
127.0.0.1:6379> sadd python good java # 在次向集合名为python中添加元素
(integer) 1 # 仅成功添加一条, 而good没有添加进去, 因为good已经存在
127.0.0.1:6379> smembers python # 查看集合名为python, 所有的元素
1) "nice"
2) "best"
3) "good"
4) "java"
2.将集合key中的element移除掉:srem key element
127.0.0.1:6379> srem python java # 移除集合名python中的java元素
(integer) 1
127.0.0.1:6379> smembers python # 查看时,发现java元素已经被移除
1) "nice"
2) "best"
3) "good"
3.获取集合中所有的元素:smembers key(返回结果是无序的)
127.0.0.1:6379> smembers python # 查看集合key名为python,所有的元素信息
1) "nice"
2) "best"
3) "good"
3.计算集合大小:scard key
127.0.0.1:6379> scard python # 查看集合名为key中,元素的个数
(integer) 3
4.判断element是否在集合中:sismember key element
127.0.0.1:6379> smembers python # 查看当前集合中的元素
1) "nice"
2) "best"
3) "good"
127.0.0.1:6379> sismember python java # 查看元素为java是否在Python集合中
(integer) 0 # 0表示不再
127.0.0.1:6379> sismember python good # 查看元素为good 是否在Python集合中
(integer) 1 # 1表示已经存在
5.从集合中随机选出一个元素:srandmember key(不会破坏集合)
127.0.0.1:6379> srandmember python # 随机弹出集合名为python 中的一个元素
"nice"
127.0.0.1:6379> srandmember python
"good"
127.0.0.1:6379> smembers python # 查看所有Python元素,srandmember不会破坏集合中的元素
1) "nice"
2) "best"
3) "good"
6.从集合中随机删除一个元素:spop key(从集合中弹出)
127.0.0.1:6379> spop python # 随机弹出python集合中一个元素
"good"
127.0.0.1:6379> spop python
"best"
127.0.0.1:6379> smembers python # 查看所有python集合元素,仅剩nice,因为以上2步,已经进行了删除
1) "nice"
7.差集:sdiff key1 key2
127.0.0.1:6379> smembers python # 查看python集合所有的元素
1) "nice"
2) "best"
3) "good"
127.0.0.1:6379> smembers java # 查看java集合所有的元素
1) "nice"
2) "bad"
3) "good"
127.0.0.1:6379> sdiff python java # python 差集 java
1) "best"
127.0.0.1:6379> sdiff java python # java 差集python
1) "bad"
8.交集:sinter key1 key2
127.0.0.1:6379> smembers python # 查看python集合所有的元素
1) "nice"
2) "best"
3) "good"
127.0.0.1:6379> smembers java # 查看java集合所有的元素
1) "nice"
2) "bad"
3) "good"
127.0.0.1:6379> sinter python java # python 与 java的交集
1) "nice"
2) "good"
9.并集:sunion key1 key2
127.0.0.1:6379> smembers python # 查看python集合所有的元素
1) "nice"
2) "best"
3) "good"
127.0.0.1:6379> smembers java # 查看java集合所有的元素
1) "nice"
2) "bad"
3) "good"
127.0.0.1:6379> sunion python java # python 与 java的并集
1) "nice"
2) "best"
3) "bad"
4) "good"
5.有序集合(zset):
5.1有序集合结构、特点:
结构:key—score—value
特点:1.不可以重复添加 2.有顺序 3.元素多一个score分值
注意:同一个有序集合中score可以重复,但是value不可以重复
5.2有序集合命令:
1.添加score和element:zadd key score element(可添加多对)
127.0.0.1:6379> zadd python 1 good 50 nice 100 best # 添加有序集合的元素
(integer) 3
127.0.0.1:6379> zrange python 0 -1 withscores # 查看当前有序集合中元素以及分值
1) "good"
2) "1"
3) "nice"
4) "50"
5) "best"
6) "100"
2.删除元素:zrem key element(可以是多个)
127.0.0.1:6379> zrem python good nice # 删除有序集合中的指定的元素
(integer) 2
127.0.0.1:6379> zrange python 0 -1 withscores # 在查看当前有序集合中的元素以及分值
1) "best"
2) "100"
3.返回指定元素的分数:zscore key element
127.0.0.1:6379> zscore python best # 查看key名为python 元素名为best中指定的分数
"100"
4.增加或减少元素的分数:zincrby key increScore element
127.0.0.1:6379> zscore python best # 查看key名为python 元素名为best中指定的分数
"100"
127.0.0.1:6379> zincrby python 99 best # 给best元素所对应的分数进行添加99
"199" # 100 + 99 = 199
5.返回元素的总个数:zcard key
127.0.0.1:6379> zcard python # 查看当前key名为python 所对应element中的个数
(integer) 1
6.查看元素在有序集合中排序的位置:zrank key element
127.0.0.1:6379> zadd python 1 bad 50 good 100 nice # 进行了元素的添加
(integer) 3
127.0.0.1:6379> zrange python 0 -1 withscores # 查看python有序集合中元素以及分数
1) "bad"
2) "1"
3) "good"
4) "50"
5) "nice"
6) "100"
7) "best"
8) "199"
127.0.0.1:6379> zrank python good # 查看good 在有序集合python中排名的位置
(integer) 1 # 排名为1, 可以看到 0是"bad" 1是"good"
7.返回指定索引范围内的升序元素[分值]:zrange key start end [withscores]
127.0.0.1:6379> zrange python 0 -1 withscores # 查看名为python的有序集合, 分数以及所有元素
1) "bad"
2) "1"
3) "good"
4) "50"
5) "nice"
6) "100"
7) "best"
8) "199"
127.0.0.1:6379> zrange python 0 1 withscores # 获取python有序集合, 前2个元素以及分数
1) "bad"
2) "1"
3) "good"
4) "50"
8.返回指定分数范围内的升序元素[分支]:zrangebyscore key minScore maxScore [withscores]
127.0.0.1:6379> zrange python 0 -1 withscores # 查看所有的元素以及分数
1) "bad"
2) "1"
3) "good"
4) "50"
5) "nice"
6) "100"
7) "best"
8) "199"
# 获取python有序集合内, 分数在30-80之间的元素以及分数
127.0.0.1:6379> zrangebyscore python 30 80 withscores
1) "good"
2) "50"
9.返回有序集合内在指定分数范围内的个数:zcount key minScore maxScore
127.0.0.1:6379> zcount python 50 199 # 获取python 有序集合中分数在50-199,元素的个数
(integer) 3
- 删除指定排名内的升序元素:
zremrangebyrank key start end
127.0.0.1:6379> zrange python 0 -1 withscores # 查看当前所有有序集合元素以及分数
1) "bad"
2) "1"
3) "good"
4) "50"
5) "nice"
6) "100"
7) "best"
8) "199"
# 删除python有序集合内,位置是0跟1的元素,把"bad" 跟"good"进行了删除
127.0.0.1:6379> zremrangebyrank python 0 1
(integer) 2
127.0.0.1:6379> zrange python 0 -1 withscores # 再次查看有序集合所有元素
1) "nice"
2) "100"
3) "best"
4) "199"
11.删除指定分值内的升序元素:zremrangebyscore key minScore maxScore
127.0.0.1:6379> zremrangebyscore python 99 101 # 将分数在99-101的元素进行删除, "nice"被删除
(integer) 1
127.0.0.1:6379> zrange python 0 -1 withscores # 查看当前所有有序集合中的元素以分数
1) "best"
2) "199"