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 mset原子性 redis set 原子性_python

  • 计数器:论坛的点赞数、转发数、评论数等。
  • 消息队列系统:如图所示

redis mset原子性 redis set 原子性_c++_02

  • 排行榜功能:使用集合数据类型,进行一些数据的排序。
  • 社交网络:一些粉丝的数量、关注数量、是否互相关注等。
  • 实时系统:垃圾邮件处理系统、布隆过滤器等,使用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数据结构和内部编码:

redis mset原子性 redis set 原子性_python_03

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
  1. 删除指定排名内的升序元素: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"