redis_basis

2021-03-01

Redis

Redis 数据结构

一、Redis基础知识

  1. redis 启动客户端与服务器命令

    1
    2
    3
    redis-server [服务器配置文件] : 服务器命令 [启动特定端口的服务器,默认端口为 6379]

    redis-cli [-p 端口号]: 客户端命令 [启动一个特定端口的客户端,默认端口为 6379]
    • 一个redis.windows.conf配置就是一个redis服务器。需要启动多个服务器时,只需要修改一下这个配置文件redis.windows.conf的名称,更改端口号,再用redis-server就可以启动。

      1. 复制配置文件 redis.windows.conf 并改名

      2. 在新配置中更改端口号

      3. 使用启动命令启动服务端

        1. 启动默认服务器

        2. 启动修改后端口服务器

      4. 使用启动命令启动客户端

        1. 启动默认客户端

        2. 启动修改端口后客户端

  2. redis 和 memcached 独特之处

    • redis 可以持久化保存数据到硬盘;memcached 只可以做缓存
    • redis 相比于 memcached,支持数据类型更多
  3. redis 优点

    1. 读写速度快: redis 数据存放在内存内,数据结构类似于 HashMap, HashMap 的优势就是查找和操作时间复杂度都是O(1)
    2. 支持丰富的数据类型: string, hash, list, set, sorted
    3. 支持简单的事务: watch
    4. 丰富的特性: 可以用于缓存,消息队列,按 key 设置过期时间,到期后自动删除
    5. 支持数据持久化: 支持AOF和RDB 两种持久化方式,从而进行数据的恢复操作,可以有效防止数据丢失
    6. 支持主从复制实现数据备份: 主机会自动将数据同步到从机
  4. Redis 目录下的重要文件意义

    • redis-benchmark :性能测试工具
    • redis-check-aof: 日志文件检测工具 (可以检测并修复由于各种突发原因造成的日志损坏, eg:断电)
    • redis-check-dump: 快照文件检测工具 (可以检测并修复由于各种突发原因造成的快照损坏, eg:断电)
    • redis-cli: redis 客户端
    • redis-server: redis 服务器
    • redis.windows.conf: redis 配置文件 在启动 redis 时 一个配置文件相当于一个服务器数据库
  5. redis基础命令

    • keys * : 返回所有键 (key)
    • keys na*: 返回所有以 na 开头的键
    • exists name: 判断 name 键 是否存在
    • del name: 删除 name 键
    • expire key_name 10: 设置 key_name 键的过期时间为 10s 后 (自动删除)
      • 通过这种有效期可以做到自动删除,其实有效期到了,也不是立马删除的,删除的时机是有配置文件决定的
    • ttl key_name: 查看 key_name 键的过期时间,-1 表示已过期 或永不过期
    • move name 1: 将键名为 name 的键转移到 1 的数据库
    • select 1: 进入到 1 的数据库中,默认为在 0 数据库
    • persist name: 移除 name 键的过期时间
    • flushdb: 删除所有的数据,清除当前所在库的所有数据
    • flushall: 清空所有数据

二、redis 数据类型

1. String 字符串
  • 十二种方法

    1. set 方法: 设置 key 对应的值为 string 类型的 value,如果 key 已经存在,则覆盖 key 对应的 value 值.(在 redis 中 key 只能有一个)

      1
      2
      127.0.0.1:6379[1]> set name liuliu
      OK
    2. get 方法: 根据 key 获取 value 值

      1
      2
      127.0.0.1:6379[1]> get name
      "liuliu"
    3. setnx 方法: 设置一个不存在的字符串,返回 0 表示设置失败,已存在;返回 1 标识设置新值成功(nx: not exist)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      127.0.0.1:6379[1]> setnx name angel
      (integer) 0
      127.0.0.1:6379[1]> setnx age 23
      (integer) 1
      127.0.0.1:6379[1]> keys *
      1) "name"
      2) "age"
      127.0.0.1:6379[1]> get name
      "liuliu"
      127.0.0.1:6379[1]> get age
      "23"
    4. setex: 设置字符串,同时设置有效期。(ex – expire 有效期)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      127.0.0.1:6379[1]> setex color 20 red
      OK
      立即查看 keys
      127.0.0.1:6379[1]> keys *
      1) "color"
      2) "name"
      3) "age"
      127.0.0.1:6379[1]> get color
      "red"
      20s 后查看 keys
      127.0.0.1:6379[1]> keys *
      1) "name"
      2) "age"
      127.0.0.1:6379[1]> get color
      (nil)
    5. setrange: 替换字符串: etrange key offset value

      1
      2
      3
      4
      5
      6
      127.0.0.1:6379[1]> get name
      "liuliu"
      127.0.0.1:6379[1]> setrange name 3 fei
      (integer) 6
      127.0.0.1:6379[1]> get name
      "liufei"
    6. mset: 一次设置多个 key-value, 返回 ok 表示设置成功,返回 0 表示全部失败。如果存在则替换.(m – multi) mset key value [key value ...]

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      127.0.0.1:6379[1]> mset name1 lisi name2 zhangsan
      OK
      127.0.0.1:6379[1]> keys *
      1) "name1"
      2) "name"
      3) "name2"
      4) "age"
      127.0.0.1:6379[1]> get name1
      "lisi"
      127.0.0.1:6379[1]> get name2
      "zhangsan"
    7. msetnx: 一次设置多个不存在的 key-value,返回 1 表示全部设置成功,返回 0 表示全部失败msetnx key value [key value ...]

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      设置已存在的 keys 返回 0
      127.0.0.1:6379[1]> msetnx name1 wangwu name3 xiaoer
      (integer) 0
      127.0.0.1:6379[1]> keys *
      1) "name1"
      2) "name"
      3) "name2"
      4) "age"
      设置不存在的 keys
      127.0.0.1:6379[1]> msetnx name3 wangwu name4 xiaoer
      (integer) 1
      127.0.0.1:6379[1]> keys *
      1) "name1"
      2) "name3"
      3) "age"
      4) "name2"
      5) "name4"
      6) "name"
    8. getset: 获取原值,并设置新值getset key value

      1
      2
      3
      4
      5
      6
      127.0.0.1:6379[1]> get age
      "23"
      127.0.0.1:6379[1]> getset age 110
      "23"
      127.0.0.1:6379[1]> get age
      "110"
    9. getrange: 获取 key 对应 value 指定范围内的的字符串getrange key start end

      1
      2
      3
      4
      127.0.0.1:6379[1]> get name1
      "lisi"
      127.0.0.1:6379[1]> getrange name1 1 3
      "isi"
    10. mget: 一次获取多个 key 对应的 value 值,不存在则返回 nil mget key [key ...]

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      127.0.0.1:6379[1]> keys *
      1) "name1"
      2) "name3"
      3) "age"
      4) "name2"
      5) "name4"
      6) "name"
      7) "gae"
      127.0.0.1:6379[1]> mget name name1 name2 name3 name4 name5 name6
      1) "liufei"
      2) "lisi"
      3) "zhangsan"
      4) "wangwu"
      5) "xiaoer"
      6) (nil)
      7) (nil)
    11. incr: 对 key 对应的 value 做加一操作,并返回新值 incr key

      1
      2
      3
      4
      5
      6
      127.0.0.1:6379[1]> get age
      "110"
      127.0.0.1:6379[1]> incr age
      (integer) 111
      127.0.0.1:6379[1]> get age
      "111"
    12. incrby: 与 incr 类似,加指定值,key不存在的时候会创建 key, 并认为 该 key 原 value=0 incrby key increment

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      127.0.0.1:6379[1]> get age
      "111"
      127.0.0.1:6379[1]> incrby age 50
      (integer) 161
      127.0.0.1:6379[1]> get age
      "161"
      127.0.0.1:6379[1]> keys *
      1) "name1"
      2) "name3"
      3) "age"
      4) "name2"
      5) "name4"
      6) "name"
      7) "gae"
      127.0.0.1:6379[1]> incrby length 180
      (integer) 180
      127.0.0.1:6379[1]> get length
      "180"
    13. decr:对 key 对应的 value 做 减一操作 decr key

      1
      2
      3
      4
      5
      6
      127.0.0.1:6379[1]> get age
      "161"
      127.0.0.1:6379[1]> decr age
      (integer) 160
      127.0.0.1:6379[1]> get age
      "160"
    14. decrby: 对 key 对应的 value 减去指定的值 decrby key decrement

      1
      2
      3
      4
      5
      6
      127.0.0.1:6379[1]> get age
      "160"
      127.0.0.1:6379[1]> decrby age 100
      (integer) 60
      127.0.0.1:6379[1]> get age
      "60"
    15. append: 对 key 对应的 value 字符串追加,返回新字符串的长度 append key value

      1
      2
      3
      4
      5
      6
      127.0.0.1:6379[1]> get name3
      "wangwu"
      127.0.0.1:6379[1]> append name3 test
      (integer) 10
      127.0.0.1:6379[1]> get name3
      "wangwutest"
    16. strlen: 获取 key 对应 value 的长度strlen key

      1
      2
      3
      4
      127.0.0.1:6379[1]> strlen name1
      (integer) 4
      127.0.0.1:6379[1]> get name1
      "lisi"
2. Hash 类型
  • Hash 类型介绍

    • Redis hash 是一个 string 类型的 filed 和value 的映射表。相较于对象的每个字段存成单个 string 类型。将一个对象存储在 hash 类型中会占用更少的内存,并且可以更方便存储整个对象
  • 十一种类型

    1. hset:设置 hash filed 为指定值,如果 key 不存在则先创建。key 存在则替换 hset key field value

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      127.0.0.1:6379[1]> keys *
      1) "name1"
      2) "name3"
      3) "name4"
      4) "name2"
      5) "age"
      6) "name"
      7) "gae"
      8) "length"
      设置一个 user: 001 的用户 name 为 liuliu (可以将 user:001看作一个表)
      127.0.0.1:6379[1]> hset user:001 name liuliu
      (integer) 1
      127.0.0.1:6379[1]> keys *
      1) "name1"
      2) "name3"
      3) "name4"
      4) "name2"
      5) "age"
      6) "name"
      7) "user:001"
      8) "gae"
      9) "length"
    2. hget: 获取指定 field 字段的值hget key field

      1
      2
      3
      4
      127.0.0.1:6379[1]> hget user name
      (nil)
      127.0.0.1:6379[1]> hget user:001 name
      "liuliu"
    3. hsetnx: 设置hash filed为指定值,如果key不存在,则先创建。如果key存在返回0表示设置失败hsetnx key field value

      1
      2
      3
      4
      5
      6
      7
      8
      127.0.0.1:6379[1]> hsetnx user:001 name lisi
      (integer) 0
      127.0.0.1:6379[1]> hsetnx user:001 age 19
      (integer) 1
      127.0.0.1:6379[1]> hget user:001 age
      "19"
      127.0.0.1:6379[1]> hget user:001 name
      "liuliu"
    4. hmset: 同时设置 hash 的多个 file hmset key field value [field value ...]

      1
      2
      127.0.0.1:6379[1]> hmset user:002 name wangwu age 19
      OK
    5. hmget: 获取全部指定的 hash filed, 必需指定获取的 key 的名称 hmget key field [field ...]

      1
      2
      3
      127.0.0.1:6379[1]> hmget user:002 name age
      1) "wangwu"
      2) "19"
    6. hincrby: 对 hash filed 加上指定的值 hincrby key field increment

      1
      2
      3
      4
      5
      6
      127.0.0.1:6379[1]> hget user:001 age
      "19"
      127.0.0.1:6379[1]> hincrby user:001 age 10
      (integer) 29
      127.0.0.1:6379[1]> hget user:001 age
      "29"
    7. hexists: 测试制定的 filed 是否存在,返回1表示存在,返回0表示不存在 hexists key field

      1
      2
      3
      4
      5
      6
      127.0.0.1:6379[1]> hexists user:001 name
      (integer) 1
      127.0.0.1:6379[1]> hexists user:001 age
      (integer) 1
      127.0.0.1:6379[1]> hexists user:001 weight
      (integer) 0
    8. hlen: 返回指定 hash 的 filed 的数量 hlen key

      1
      2
      127.0.0.1:6379[1]> hlen user:001
      (integer) 2
    9. hdel: 删除指定 hash 的 field 字段,返回1表示删除成功,0表示删除失败 hdel key field [field ...]

      1
      2
      3
      4
      5
      6
      127.0.0.1:6379> hget user:001 age
      "29"
      127.0.0.1:6379> hdel user:001 age
      (integer) 1
      127.0.0.1:6379> hget user:001 age
      (nil)
    10. hkeys: 返回 hash 的所有 filed hkeys key

      1
      2
      3
      127.0.0.1:6379> hkeys user:002
      1) "name"
      2) "age"
    11. hvals: 返回 hash 的所有 value hvals key

      1
      2
      3
      127.0.0.1:6379> hvals user:002
      1) "wangwu"
      2) "19"
3. List 类型
  • List 类型介绍

    • List 是一个链表结构,主要功能是 pushpop,获取一个范围的所有值等等,操作中 key 理解为链表的名字。
    • Redis 的 list 类型其实就是每个子元素都是 string类型的双向链表.我们可以通过push、pop操作链表的头部或者链表尾部添加元素,这样list既可以作为栈,又可以作为队列。
  • 十二种方法

    1. lpush: 在 key 对应 lisy 的头部添加字符串元素,返回 list 中元素的个数 lpush key value [value ...]

      1
      2
      3
      4
      5
      6
      7
      8
      127.0.0.1:6379> lpush list1 "hello"
      (integer) 1
      127.0.0.1:6379> lpush list1 " " "word"
      (integer) 3
      127.0.0.1:6379> lrange list1 0 -1 (0 -1 第一个到最后一个)
      1) "word"
      2) " "
      3) "hello"
    2. lrange: 获取 list 中的元素 lrange key start[0:第一个] stop[-1:最后一个]

      1
      2
      3
      4
      127.0.0.1:6379> lrange list1 0 -1 (0 -1 第一个到最后一个)
      1) "word"
      2) " "
      3) "hello"
    3. rpush: 在 key 对应的 list 尾部添加元素 rpush key value [value ...]

      1
      2
      3
      4
      5
      6
      7
      8
      127.0.0.1:6379> rpush list1 "abc" "test"
      (integer) 5
      127.0.0.1:6379> lrange list1 0 -1
      1) "word"
      2) " "
      3) "hello"
      4) "abc"
      5) "test"
    4. linsert: 在 key 对应 list 的特定位置前或后添加字符串 linsert key BEFORE|AFTER pivot value

      1
      2
      3
      4
      5
      6
      7
      8
      9
      127.0.0.1:6379> linsert list1 before abc "test0"
      (integer) 6
      127.0.0.1:6379> lrange list1 0 -1
      1) "word"
      2) " "
      3) "hello"
      4) "test0"
      5) "abc"
      6) "test"
    5. lset: 更改 list 中指定下标的元素,返回 ok 则设置成功 lset key index value

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      127.0.0.1:6379> lrange list1 0 -1
      1) "word"
      2) " "
      3) "hello"
      4) "test0"
      5) "abc"
      6) "test"
      127.0.0.1:6379> lset list1 2 "liuliu"
      OK
      127.0.0.1:6379> lrange list1 0 -1
      1) "word"
      2) " "
      3) "liuliu"
      4) "test0"
      5) "abc"
      6) "test"
    6. irem: 从 key 对应list 中删除 n 个和 value 相同的元素 (n<0 从未不删除, n=0 全部删除,n>0从头不删除) lrem key count value

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      127.0.0.1:6379> lpush list2 "one" "two" "three"
      (integer) 3
      127.0.0.1:6379> lrange list2 0 -1
      1) "three"
      2) "two"
      3) "one"
      127.0.0.1:6379> lrem list2 1 one
      (integer) 1
      127.0.0.1:6379> lrange list2 0 -1
      1) "three"
      2) "two"
      127.0.0.1:6379> lrem list2 0 three
      (integer) 1
      127.0.0.1:6379> lrange list2 0 -1
      1) "two"
    7. ltrim: 保留 list 中指定范围的数据,其他的批量删除 ltrim key start stop

      1
      2
      3
      4
      5
      6
      7
      8
      9
      127.0.0.1:6379> lrange list2 0 -1
      1) "three"
      2) "one"
      3) "two"
      127.0.0.1:6379> ltrim list2 1 2
      OK
      127.0.0.1:6379> lrange list2 0 -1
      1) "one"
      2) "two"
    8. lpop: 从 list 的头部删除元素,并返回该元素 lpop key

      1
      2
      3
      4
      5
      6
      7
      127.0.0.1:6379> lrange list2 0 -1
      1) "one"
      2) "two"
      127.0.0.1:6379> lpop list2
      "one"
      127.0.0.1:6379> lrange list2 0 -1
      1) "two"
    9. rpop: 从 list 尾部删除元素,并返回该元素 rpop key

      1
      2
      3
      4
      5
      6
      7
      8
      9
      127.0.0.1:6379> lrange list2 0 -1
      1) "three"
      2) "one"
      3) "two"
      127.0.0.1:6379> rpop list2
      "two"
      127.0.0.1:6379> lrange list2 0 -1
      1) "three"
      2) "one"
    10. rpoplpush: 从第一个 list 的尾部删除元素,并添加到第二个 list 的头部 rpoplpush source destination

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      127.0.0.1:6379> lrange list2 0 -1
      1) "three"
      2) "one"
      127.0.0.1:6379> lrange list1 0 -1
      1) "word"
      2) " "
      3) "liuliu"
      4) "test0"
      5) "abc"
      6) "test"
      127.0.0.1:6379> rpoplpush list1 list2
      "test"
      127.0.0.1:6379> lrange list1 0 -1
      1) "word"
      2) " "
      3) "liuliu"
      4) "test0"
      5) "abc"
      127.0.0.1:6379> lrange list2 0 -1
      1) "test"
      2) "three"
      3) "one"
    11. lindex: 返回名称为 key 的 list 中index 位置的元素 <===> list[index] lindex key index

      1
      2
      3
      4
      5
      6
      127.0.0.1:6379> lrange list2 0 -1
      1) "test"
      2) "three"
      3) "one"
      127.0.0.1:6379> lindex list2 2
      "one"
    12. llen: 返回指定 key 对应的 list 的长度 <===> len(list) llen key

      1
      2
      3
      4
      5
      6
      127.0.0.1:6379> llen list2
      (integer) 3
      127.0.0.1:6379> lrange list2 0 -1
      1) "test"
      2) "three"
      3) "one"
4. Sets 类型
  • Sets 类型介绍

    • Set 是一个 string 的,不允许重复。Set 是通过 hash table 实现的.添加、删除、查找的复杂度都是 O(1).对集合我们可以取并集、交集、差集
  • 十四种方法

    1. sadd:向 key 对应的 set 集合中添加元素,返回 1 表示添加成功,返回 0 表示失败 sadd key member [member ...]

      1
      2
      3
      4
      5
      127.0.0.1:6379[1]> sadd myset one two
      (integer) 2
      127.0.0.1:6379[1]> smembers myset
      1) "two"
      2) "one"
    2. Smembers: 查看 set 集合中的元素 smembers key

      1
      2
      3
      127.0.0.1:6379[1]> smembers myset
      1) "two"
      2) "one"
    3. srem: 删除 key 对应 set 集合中的指定元素,返回 1 表示删除成功,返回 0 表示删除失败 srem key member [member ...]

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      127.0.0.1:6379[1]> smembers myset
      1) "two"
      2) "one"
      3) "three"
      127.0.0.1:6379[1]> srem myset one
      (integer) 1
      127.0.0.1:6379[1]> smembers myset
      1) "two"
      2) "three"
      127.0.0.1:6379[1]> srem myset five
      (integer) 0
    4. spop: 随机删除 set 中的指定个元素并返回该元素 spop key [count]

      1
      2
      3
      4
      5
      6
      7
      8
      9
      127.0.0.1:6379[1]> smembers myset
      1) "two"
      2) "one"
      3) "three"
      127.0.0.1:6379[1]> spop myset 2
      1) "two"
      2) "three"
      127.0.0.1:6379[1]> smembers myset
      1) "one"
    5. sdiff: 返回给定 set 集合的差集 (以在前的 set 集合为标准) sdiff key [key ...]

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      127.0.0.1:6379[1]> smembers myset
      1) "two"
      2) "one"
      127.0.0.1:6379[1]> smembers myset1
      1) "two"
      2) "three"
      127.0.0.1:6379[1]> sdiff myset myset1
      1) "one"
      127.0.0.1:6379[1]> sdiff myset1 myset
      1) "three"
    6. sdiffstore: 返回所有给定 set 集合的差集,并将差集添加到另外一个集合中 sdiffstore destination key [key ...]

      1
      2
      3
      4
      127.0.0.1:6379[1]> sdiffstore myset3 myset1 myset
      (integer) 1
      127.0.0.1:6379[1]> smembers myset3
      1) "three"
    7. sinter: 返回所有给定集合的交集 sinter key [key ...]

      1
      2
      3
      4
      5
      6
      7
      8
      127.0.0.1:6379[1]> smembers myset
      1) "two"
      2) "one"
      127.0.0.1:6379[1]> smembers myset1
      1) "two"
      2) "three"
      127.0.0.1:6379[1]> sinter myset myset1
      1) "two"
    8. sinterstore: 返回所有给定集合 key 的交集,并将结果存为另一个 key sinterstore destination key [key ...]

      1
      2
      3
      4
      127.0.0.1:6379[1]> sinterstore myset2 myset myset1
      (integer) 1
      127.0.0.1:6379[1]> smembers myset2
      1) "two"
    9. sunion: 返回所有给定集合的并集 sunion key [key ...]

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      127.0.0.1:6379[1]> smembers myset
      1) "two"
      2) "one"
      127.0.0.1:6379[1]> smembers myset1
      1) "two"
      2) "three"
      127.0.0.1:6379[1]> sunion myset myset1
      1) "one"
      2) "two"
      3) "three"
    10. sunionstore: 返回所有给定集合的并集,并将结果存入另一个集合 sunionstore destination key [key ...]

      1
      2
      3
      4
      5
      6
      127.0.0.1:6379[1]> sunionstore myset4 myset myset1
      (integer) 3
      127.0.0.1:6379[1]> smembers myset4
      1) "one"
      2) "two"
      3) "three"
    11. smove: 从第一个集合中移除元素并将该元素添加到另一个集合中 smove source destination member

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      127.0.0.1:6379[1]> smembers myset
      1) "two"
      2) "one"
      127.0.0.1:6379[1]> smembers myset1
      1) "two"
      2) "three"
      127.0.0.1:6379[1]> smove myset myset1 one
      (integer) 1
      127.0.0.1:6379[1]> smembers myset
      1) "two"
      127.0.0.1:6379[1]> smembers myset1
      1) "one"
      2) "two"
      3) "three"
    12. Scard: 返回 set 集合中元素的个数 llen(list) strlen(str) hlen(hash) scard key

      1
      2
      3
      4
      5
      6
      127.0.0.1:6379[1]> smembers myset1
      1) "one"
      2) "two"
      3) "three"
      127.0.0.1:6379[1]> scard myset1
      (integer) 3
    13. sismember: 测试 member 元素是否是名称为 key 的 set 集合; 是的话返回 1 否则为 0 sismember key member

      1
      2
      3
      4
      5
      6
      7
      8
      127.0.0.1:6379[1]> smembers myset1
      1) "one"
      2) "two"
      3) "three"
      127.0.0.1:6379[1]> sismember myset1 one
      (integer) 1
      127.0.0.1:6379[1]> sismember myset1 five
      (integer) 0
    14. srandmember: 随机返回 set 集合中的几个元素 ,但不删除该元素 srandmember key [count]

      1
      2
      3
      4
      5
      6
      127.0.0.1:6379[1]> srandmember myset1 2
      1) "one"
      2) "three"
      127.0.0.1:6379[1]> srandmember myset1 2
      1) "two"
      2) "one"
5. Sorted set (zset) 类型
  • zset 类型介绍

    • Sorted set 是 set 的升级版,在 set 的基础上增加了顺序属性,在添加元素时可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解为有两列的 mysql 表,一列存 value,一列存顺序。操作 key 理解为 zset 的名字
  • 十一种方法 ( rank: 下标索引:从0开始的; score: 分数,序号)

    1. zadd: 向有序集合 set 中添加元素并指定顺序,如果该元素已存在就更新元素顺序 zadd key [NX|XX] [CH] [INCR] score member [score member ...]

      1
      2
      3
      4
      5
      127.0.0.1:6379[1]> zadd myzset 1 one 2 two
      (integer) 2
      127.0.0.1:6379[1]> zrange myzset 0 -1
      1) "one"
      2) "two
    2. zrange: 从 zset 集合中取元素 并 输出元素序号 (WITHSCORES 输出元素序号) zrange key start stop [WITHSCORES]

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      127.0.0.1:6379[1]> zadd myzset 1 one 2 two
      (integer) 2
      127.0.0.1:6379[1]> zrange myzset 0 -1
      1) "one"
      2) "two"
      127.0.0.1:6379[1]> zrange myzset 0 -1 withscores
      1) "one"
      2) "1"
      3) "two"
      4) "2"
    3. zrem: 删除 zset 集合中指定的元素 zrem key member [member ...]

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      127.0.0.1:6379[1]> zrange myzset 0 -1 withscores
      1) "one"
      2) "1"
      3) "two"
      4) "2"
      127.0.0.1:6379[1]> zrem myzset two
      (integer) 1
      127.0.0.1:6379[1]> zrange myzset 0 -1 withscores
      1) "one"
      2) "1"
    4. zrank: 正序方式,获取指定元素的索引下标 zrank key member

      1
      2
      3
      4
      5
      6
      7
      127.0.0.1:6379[1]> zrange myzset 0 -1
      1) "one"
      2) "two"
      127.0.0.1:6379[1]> zrank myzset two
      (integer) 1
      127.0.0.1:6379[1]> zrank myzset one
      (integer) 0
    5. zrevrank: 逆序方式获取指定元素的索引下标, rev–reverse zrevrank key member

      1
      2
      3
      4
      5
      6
      7
      127.0.0.1:6379[1]> zrange myzset 0 -1
      1) "one"
      2) "two"
      127.0.0.1:6379[1]> zrevrank myzset one
      (integer) 1
      127.0.0.1:6379[1]> zrevrank myzset two
      (integer) 0
    6. zincrby: 添加元素及其序号到 zset 中,或改变 zset 中元素的序号 若 zset 中已存在 元素 member,该元素的 score(序号) 增加 incrment(指定值) 否则向该集合中添加该元素,其score(序号) 的值为 increment zincrby key increment member

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      127.0.0.1:6379[1]> zrange myzset 0 -1 withscores
      1) "one"
      2) "1"
      127.0.0.1:6379[1]> zincrby myzset 2 two
      "2"
      127.0.0.1:6379[1]> zrange myzset 0 -1 withscores
      1) "one"
      2) "1"
      3) "two"
      4) "2"
      127.0.0.1:6379[1]> zincrby myzset 2 one
      "3"
      127.0.0.1:6379[1]> zrange myzset 0 -1 withscores
      1) "two"
      2) "2"
      3) "one"
      4) "3"
      可以有相同序号
      127.0.0.1:6379[1]> zincrby myzset 1 two
      "3"
      127.0.0.1:6379[1]> zrange myzset 0 -1 withscores
      1) "one"
      2) "3"
      3) "two"
      4) "3"
    7. zrangebyscore: 从 zset 集合指定范围中根据 score 顺序获取元素,可以限制获取次数 zrangebyscore key min max [WITHSCORES] [LIMIT offset count]

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      127.0.0.1:6379[1]> zadd myzset1 0 name 1 age 2 gender 3 like
      (integer) 4
      127.0.0.1:6379[1]> zrange myzset1 0 -1 withscores
      1) "name"
      2) "0"
      3) "age"
      4) "1"
      5) "gender"
      6) "2"
      7) "like"
      8) "3"
      127.0.0.1:6379[1]> zrangebyscore myzset1 1 3 withscores
      1) "age"
      2) "1"
      3) "gender"
      4) "2"
      5) "like"
      6) "3"
    8. zrevrange: 从 zset 集合中倒序 (score倒序) 获取元素 zrevrange key start stop [WITHSCORES]

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      127.0.0.1:6379[1]> zrange myzset1 0 -1 withscores
      1) "name"
      2) "0"
      3) "age"
      4) "1"
      5) "gender"
      6) "2"
      7) "like"
      8) "3"
      127.0.0.1:6379[1]> zrevrange myzset1 0 -1 withscores
      1) "like"
      2) "3"
      3) "gender"
      4) "2"
      5) "age"
      6) "1"
      7) "name"
      8) "0"
      127.0.0.1:6379[1]> zrevrange myzset1 1 3 withscores
      1) "gender"
      2) "2"
      3) "age"
      4) "1"
      5) "name"
      6) "0"
    9. zcount: 返回集合中 score 在给定区间的数量 zcount key min max

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      127.0.0.1:6379[1]> zadd myzset1 3 follow
      (integer) 1
      127.0.0.1:6379[1]> zrange myzset1 0 -1 withscores
      1) "name"
      2) "0"
      3) "age"
      4) "1"
      5) "gender"
      6) "2"
      7) "follow"
      8) "3"
      9) "like"
      10) "3"
      127.0.0.1:6379[1]> zcount myzset1 2 3
      (integer) 3
    10. zcard: 返回 zset 集合中所有元素个数 zcard key

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      127.0.0.1:6379[1]> zrange myzset1 0 -1 withscores
      1) "name"
      2) "0"
      3) "age"
      4) "1"
      5) "gender"
      6) "2"
      7) "follow"
      8) "3"
      9) "like"
      10) "3"
      127.0.0.1:6379[1]> zcard myzset1
      (integer) 5
    11. zremrangebyrank: 删除集合中排名 (下标) 在给定区间的元素 zremrangebyrank key start stop

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      127.0.0.1:6379[1]> zremrangebyrank myzset1 3 3
      (integer) 1
      127.0.0.1:6379[1]> zrange myzset1 0 -1 withscores
      1) "name"
      2) "0"
      3) "age"
      4) "1"
      5) "gender"
      6) "2"
      7) "like"
      8) "3"
    12. zremrangebyscore: 删除集合中顺序 (score 值排序)在给定区间的元素 zremrangebyscore key min max

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      127.0.0.1:6379[1]> zrange myzset1 0 -1 withscores
      1) "name"
      2) "0"
      3) "age"
      4) "1"
      5) "gender"
      6) "2"
      7) "like"
      8) "3"
      127.0.0.1:6379[1]> zremrangebyscore myzset1 2 3
      (integer) 2
      127.0.0.1:6379[1]> zrange myzset1 0 -1
      1) "name"
      2) "age"