Redis 基础入门

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.时间复杂度:
命令时间复杂度
keysO(n)
dbsizeO(1)
delO(1)
existsO(1)
expireO(1)
ttlO(1)
persistO(1)
typeO(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 指定的数量99100-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-valueO(1)
get key获取key-valueO(1)
del key删除key-valueO(1)
setnx setxx根据key是否存在设置key-valueO(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 hdelO(1)
hexistsO(1)
hincrbyO(1)
hgetall hvals hkeysO(1)
hmget hmsetO(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有序集合内,位置是01的元素,"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"
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值