zoukankan      html  css  js  c++  java
  • Redis服务之常用数据类型

      上一篇博客我们聊了下redis的主从复制、aof持久化、集群、慢日志相关配置指令的说明,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13416534.html;今天我们来了解下redis常用数据类型的相关操作和说明;

      Redis作为数据存储系统,它支持常用的数据类型有字符串(string)、列表(list)、关联数组(hash)、集合(set)、有序集合(sorted_set)、发布订阅(pubsub)等;

      字符串相关常用操作

      在redis命令行使用help命令可以查看指令的帮助信息,如果是查看某一组命令的用法可以可以使用help @组名;例如查看字符串相关命令操作帮助,可以使用help @string;如下所示

    127.0.0.1:6379> help @string
    
      APPEND key value
      summary: Append a value to a key
      since: 2.0.0
    
      BITCOUNT key [start end]
      summary: Count set bits in a string
      since: 2.6.0
    
      BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]
      summary: Perform arbitrary bitfield integer operations on strings
      since: 3.2.0
    
      BITOP operation destkey key [key ...]
      summary: Perform bitwise operations between strings
      since: 2.6.0
    
      BITPOS key bit [start] [end]
      summary: Find first bit set or clear in a string
      since: 2.8.7
    
      DECR key
      summary: Decrement the integer value of a key by one
      since: 1.0.0
    
      DECRBY key decrement
      summary: Decrement the integer value of a key by the given number
      since: 1.0.0
    
      GET key
      summary: Get the value of a key
      since: 1.0.0
    
      GETBIT key offset
      summary: Returns the bit value at offset in the string value stored at key
      since: 2.2.0
    
      GETRANGE key start end
      summary: Get a substring of the string stored at a key
      since: 2.4.0
    
      GETSET key value
      summary: Set the string value of a key and return its old value
      since: 1.0.0
    
      INCR key
      summary: Increment the integer value of a key by one
      since: 1.0.0
    
      INCRBY key increment
      summary: Increment the integer value of a key by the given amount
      since: 1.0.0
    
      INCRBYFLOAT key increment
      summary: Increment the float value of a key by the given amount
      since: 2.6.0
    
      MGET key [key ...]
      summary: Get the values of all the given keys
      since: 1.0.0
    
      MSET key value [key value ...]
      summary: Set multiple keys to multiple values
      since: 1.0.1
    
      MSETNX key value [key value ...]
      summary: Set multiple keys to multiple values, only if none of the keys exist
      since: 1.0.1
    
      PSETEX key milliseconds value
      summary: Set the value and expiration in milliseconds of a key
      since: 2.6.0
    
      SET key value [EX seconds] [PX milliseconds] [NX|XX]
      summary: Set the string value of a key
      since: 1.0.0
    
      SETBIT key offset value
      summary: Sets or clears the bit at offset in the string value stored at key
      since: 2.2.0
    
      SETEX key seconds value
      summary: Set the value and expiration of a key
      since: 2.0.0
    
      SETNX key value
      summary: Set the value of a key, only if the key does not exist
      since: 1.0.0
    
      SETRANGE key offset value
      summary: Overwrite part of a string at key starting at the specified offset
      since: 2.2.0
    
      STRLEN key
      summary: Get the length of the value stored in a key
      since: 2.2.0
    
    127.0.0.1:6379> 
    

      提示:查看组里的某一个命令的用法可以使用help 指令

    127.0.0.1:6379> help STRLEN
    
      STRLEN key
      summary: Get the length of the value stored in a key
      since: 2.2.0
      group: string
    
    127.0.0.1:6379> help MGET
    
      MGET key [key ...]
      summary: Get the values of all the given keys
      since: 1.0.0
      group: string
    
    127.0.0.1:6379> help SET
    
      SET key value [EX seconds] [PX milliseconds] [NX|XX]
      summary: Set the string value of a key
      since: 1.0.0
      group: string
    
    127.0.0.1:6379> 
    

      字符串是所有编程语言中最常见的和最常用的数据类型,而且也是 redis 最基本的数据类型之一,而且 redis 中所有的 key 的类型都是字符串。对于string类型的数据常用的方法有SET、GET、MSET、MGET、SETEX、SETNX、INCR、DECR、INCRBY、DECRBY、INCRBYFLOAT、APPEND、STRLEN、;

      SET:添加一对键值数据数据库;GET:获取指定键对应的值;

    127.0.0.1:6379> KEYS *
    (empty list or set)
    127.0.0.1:6379> set k1 v1
    OK
    127.0.0.1:6379> get k1
    "v1"
    127.0.0.1:6379> 
    

      提示:keys * 表示查看当前数据库中的所有键列表;

      MSET:添加多个键值数据到当前数据库:MGET:获取指定多个键对应的值;

    127.0.0.1:6379> MSET k2 v2 k3 v3 k4 v4
    OK
    127.0.0.1:6379> KEYS *
    1) "k3"
    2) "k2"
    3) "k1"
    4) "k4"
    127.0.0.1:6379> MGET k1 k2 k3 k4
    1) "v1"
    2) "v2"
    3) "v3"
    4) "v4"
    127.0.0.1:6379> 
    

      SETEX:添加一个有过期时长的键值数据到当前数据库;SETNX:添加一个键值数据,只在当添加到键不存在当前数据库时才添加;

    127.0.0.1:6379> SETEX k5 5 v5
    OK
    127.0.0.1:6379> GET k5
    "v5"
    127.0.0.1:6379> GET k5
    (nil)
    127.0.0.1:6379> SET k5 v5 ex 5
    OK
    127.0.0.1:6379> GET k5
    "v5"
    127.0.0.1:6379> GET k5
    (nil)
    127.0.0.1:6379> SETNX k1 v8
    (integer) 0
    127.0.0.1:6379> SETNX k5 v5
    (integer) 1
    127.0.0.1:6379> GET k5
    "v5"
    127.0.0.1:6379>
    

      提示:给某一个key指定过期时长,可以使用setex或者使用set 用ex指定过期时长也是可以的;setnx是当前数据库中没有指定的key就创建,有就不创建;

      INCR:对值是整数型的key做自增(+1);DECR:对值是整数型的key做自减(-1);

    127.0.0.1:6379> SET age 0
    OK
    127.0.0.1:6379> GET age
    "0"
    127.0.0.1:6379> INCR age
    (integer) 1
    127.0.0.1:6379> INCR age
    (integer) 2
    127.0.0.1:6379> INCR age
    (integer) 3
    127.0.0.1:6379> GET age
    "3"
    127.0.0.1:6379> DECR age
    (integer) 2
    127.0.0.1:6379> DECR age
    (integer) 1
    127.0.0.1:6379> GET age
    "1"
    127.0.0.1:6379> 
    

      INCRBY:对值是整数型的key做指定步长的自增;DECRBY:对值是整数型的key做指定步长的自减;

    127.0.0.1:6379> GET age
    "1"
    127.0.0.1:6379> INCRBY age 5
    (integer) 6
    127.0.0.1:6379> INCRBY age 3
    (integer) 9
    127.0.0.1:6379> INCRBY age 2
    (integer) 11
    127.0.0.1:6379> GET age
    "11"
    127.0.0.1:6379> DECRBY age 5
    (integer) 6
    127.0.0.1:6379> DECRBY age 3
    (integer) 3
    127.0.0.1:6379> DECRBY age 2
    (integer) 1
    127.0.0.1:6379> GET age
    "1"
    127.0.0.1:6379> 
    

      INCRBYFLOAT:对值是整数型的key做指定步长为浮点数的自增;

    127.0.0.1:6379> GET age
    "1"
    127.0.0.1:6379> INCRBYFLOAT age 0.5
    "1.5"
    127.0.0.1:6379> INCRBYFLOAT age 2.32
    "3.82"
    127.0.0.1:6379> INCRBYFLOAT age 12.25
    "16.07"
    127.0.0.1:6379> GET age
    "16.07"
    127.0.0.1:6379> 
    

      APPEND:追加一个字符串到指定key的值里面;STRLEN:查看指定key的值的字符串长度;

    127.0.0.1:6379> GET k1
    "v1"
    127.0.0.1:6379> APPEND k1 abcd
    (integer) 6
    127.0.0.1:6379> GET k1
    "v1abcd"
    127.0.0.1:6379> STRLEN k1
    (integer) 6
    127.0.0.1:6379> STRLEN k2
    (integer) 2
    127.0.0.1:6379> APPEND kk aaaa
    (integer) 4
    127.0.0.1:6379> get kk
    "aaaa"
    127.0.0.1:6379> 
    

      提示:append如果当前数据指定key不存在则创建,并把指定的字符串当作值赋给指定的key,存在则在对应key的值后面追加指定的字符串;

      列表相关常用操作

      列表是一个双向可读写的管道,其头部是左侧尾部是右侧,一个列表最多可以包含 2^32-1 个元素即4294967295 个元素。对于list类型的数据常用操作有LPUSH、RPUSH、LPOP、RPOP、LPUSHX、RPUSHX、LRANGE、LINDEX、LSET、LLEN;

      LPUSH:从左侧压入一个或多个元素到指定列表,如果指定列表不存在,则创建;RPUSH:从右侧压入一个多个元素到指定列表,如果指定列表不存在,则创建;

    127.0.0.1:6379> LPUSH L1 a1 a2 a3 a4 a5
    (integer) 5
    127.0.0.1:6379> TYPE L1
    list
    127.0.0.1:6379> RPUSH L2 b1 b2 b3 b4 b5
    (integer) 5
    127.0.0.1:6379> TYPE L2
    list
    127.0.0.1:6379> LPUSH L2 aa bb 
    (integer) 7
    127.0.0.1:6379> RPUSH L1 aa bb
    (integer) 7
    127.0.0.1:6379> 
    

      提示:对于列表来说压入一个或多个元素到列表,它默认是从左侧的第一个元素顺序往列表压入元素;LPUSH是从列表的左侧进入列表,RPUSH是从列表的右侧进入列表;如下图所示

      提示:L1=[a5,a4,a3,a2,a1,aa,bb]    L2=[bb,aa,b1,b2,b3,b4,b5]

      LPOP:从列表左侧弹出一个元素(取走或者删除);RPOP:从列表右侧弹出一个元素(取走或删除);

    127.0.0.1:6379> KEYS *
    1) "k5"
    2) "k3"
    3) "k2"
    4) "kk"
    5) "age"
    6) "L1"
    7) "k4"
    8) "L2"
    9) "k1"
    127.0.0.1:6379> LPOP L1
    "a5"
    127.0.0.1:6379> LPOP L1
    "a4"
    127.0.0.1:6379> LPOP L1
    "a3"
    127.0.0.1:6379> LPOP L1
    "a2"
    127.0.0.1:6379> LPOP L1
    "a1"
    127.0.0.1:6379> LPOP L1
    "aa"
    127.0.0.1:6379> LPOP L1
    "bb"
    127.0.0.1:6379> LPOP L1
    (nil)
    127.0.0.1:6379> KEYS L1
    (empty list or set)
    127.0.0.1:6379> RPOP L2
    "b5"
    127.0.0.1:6379> RPOP L2
    "b4"
    127.0.0.1:6379> RPOP L2
    "b3"
    127.0.0.1:6379> RPOP L2
    "b2"
    127.0.0.1:6379> RPOP L2
    "b1"
    127.0.0.1:6379> RPOP L2
    "aa"
    127.0.0.1:6379> RPOP L2
    "bb"
    127.0.0.1:6379> RPOP L2
    (nil)
    127.0.0.1:6379> KEYS L2
    (empty list or set)
    127.0.0.1:6379> 
    

      LPUSHX:仅当列表存在时,在列表左侧压入一个元素到列表;RPUSHX:仅当列表存在时,在列表右侧压入一个元素到列表(追加一个元素到列表);

    127.0.0.1:6379> KEYS *
    1) "k5"
    2) "k3"
    3) "k2"
    4) "kk"
    5) "age"
    6) "k4"
    7) "k1"
    127.0.0.1:6379> LPUSHX L1 aa
    (integer) 0
    127.0.0.1:6379> KEYS L1
    (empty list or set)
    127.0.0.1:6379> LPUSH L1 a1 a2 a3
    (integer) 3
    127.0.0.1:6379> LPUSHX L1 aa
    (integer) 4
    127.0.0.1:6379> RPUSHX L1 bb
    (integer) 5
    127.0.0.1:6379> LPOP L1 
    "aa"
    127.0.0.1:6379> RPOP L1
    "bb"
    127.0.0.1:6379> 
    

      提示:LPUSHX和RPUSHX都是压入一个元素到列表,前提是列表存在;

      LRANGE:从列表中获取指定范围的元素(切片);LINDEX:获取指定列表的指定下标的元素;

    127.0.0.1:6379> KEYS *
    1) "k5"
    2) "k3"
    3) "k2"
    4) "kk"
    5) "age"
    6) "L1"
    7) "k4"
    8) "L2"
    9) "k1"
    127.0.0.1:6379> LLEN L1
    (integer) 3
    127.0.0.1:6379> LPUSH L1 1 2 3 4 5 6 
    (integer) 9
    127.0.0.1:6379> LRANGE L1 0 8
    1) "6"
    2) "5"
    3) "4"
    4) "3"
    5) "2"
    6) "1"
    7) "a3"
    8) "a2"
    9) "a1"
    127.0.0.1:6379> LRANGE L1 4 7
    1) "2"
    2) "1"
    3) "a3"
    4) "a2"
    127.0.0.1:6379> LINDEX L1 5
    "1"
    127.0.0.1:6379> LINDEX L1 8
    "a1"
    127.0.0.1:6379> LINDEX L1 0
    "6"
    127.0.0.1:6379> 
    

      提示:列表的索引(下标)是从0开始到元素个数减一结束;

      LSET:在列表指定位置插入一个元素,替换原有位置的元素;LLEN:查看列表长度(元素个数)

    127.0.0.1:6379> LLEN L1
    (integer) 9
    127.0.0.1:6379> LSET L1 10 aaa
    (error) ERR index out of range
    127.0.0.1:6379> LINDEX L1 8
    "a1"
    127.0.0.1:6379> LSET L1 8 bb
    OK
    127.0.0.1:6379> LINDEX L1 8
    "bb"
    127.0.0.1:6379> 
    

      提示:lset指定下标是先有列表的下标范围内,不能超出已有列表下标的范围;

      集合常用操作

      Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。对于set类型的数据常用操作有SADD、SMEMBERS、SPOP、SREM、SRANDMEMBER、SINTER、SUNION、SDIFF

      SADD:添加一个或多个元素到一个集合,如果该集合不存在,则创建;SMEMBERS:查看指定集合中的所有元素

    127.0.0.1:6379> KEYS *
    1) "k5"
    2) "k3"
    3) "k2"
    4) "kk"
    5) "age"
    6) "L1"
    7) "k4"
    8) "L2"
    9) "k1"
    127.0.0.1:6379> SADD s1 a b c d
    (integer) 4
    127.0.0.1:6379> SADD s1 1 2 3 4
    (integer) 4
    127.0.0.1:6379> SADD s1 a 
    (integer) 0
    127.0.0.1:6379> SADD s1 aa
    (integer) 1
    127.0.0.1:6379> SMEMBERS s1
    1) "3"
    2) "2"
    3) "b"
    4) "c"
    5) "4"
    6) "a"
    7) "1"
    8) "d"
    9) "aa"
    127.0.0.1:6379> KEYS *
     1) "k5"
     2) "k3"
     3) "k2"
     4) "s1"
     5) "kk"
     6) "age"
     7) "L1"
     8) "k4"
     9) "L2"
    10) "k1"
    127.0.0.1:6379> 
    

      提示:集合中成员是唯一的,所以在集合中已有的成员,再次添加相同的成员会添加不成功的,正因为集合的这种特性,它可以用来去除重复的元素;

      SPOP:从指定集合中随机弹出(删除)一个或多个元素;SREM:从指定集合中删除一个或多个指定的元素;

    127.0.0.1:6379> SMEMBERS s1
    1) "3"
    2) "2"
    3) "b"
    4) "c"
    5) "4"
    6) "a"
    7) "1"
    8) "d"
    9) "aa"
    127.0.0.1:6379> SPOP s1 
    "a"
    127.0.0.1:6379> SPOP s1 
    "aa"
    127.0.0.1:6379> SMEMBERS s1
    1) "d"
    2) "b"
    3) "1"
    4) "2"
    5) "3"
    6) "c"
    7) "4"
    127.0.0.1:6379> SPOP s1 2
    1) "1"
    2) "b"
    127.0.0.1:6379> SMEMBERS s1
    1) "d"
    2) "2"
    3) "3"
    4) "c"
    5) "4"
    127.0.0.1:6379> SREM s1 d 2
    (integer) 2
    127.0.0.1:6379> SMEMBERS s1
    1) "3"
    2) "c"
    3) "4"
    127.0.0.1:6379> 
    

      SRANDMEMBER:从指定集合中随机获取一个或多个元素;

    127.0.0.1:6379> SMEMBERS s1
    1) "3"
    2) "c"
    3) "4"
    127.0.0.1:6379> SADD s1 aa bb dd cc
    (integer) 4
    127.0.0.1:6379> SRANDMEMBER s1
    "bb"
    127.0.0.1:6379> SRANDMEMBER s1
    "c"
    127.0.0.1:6379> SMEMBERS s1
    1) "bb"
    2) "dd"
    3) "cc"
    4) "aa"
    5) "3"
    6) "c"
    7) "4"
    127.0.0.1:6379> SRANDMEMBER s1 3
    1) "3"
    2) "bb"
    3) "dd"
    127.0.0.1:6379> SRANDMEMBER s1 3
    1) "cc"
    2) "bb"
    3) "dd"
    127.0.0.1:6379> SRANDMEMBER s1 3
    1) "3"
    2) "c"
    3) "dd"
    127.0.0.1:6379> 
    

      SINTER:求交集,已属于 A 且属于 B 的元素称为 A 与 B 的交(集);

    127.0.0.1:6379> SMEMBERS s1
    1) "bb"
    2) "dd"
    3) "cc"
    4) "aa"
    5) "3"
    6) "c"
    7) "4"
    127.0.0.1:6379> SMEMBERS s2
    1) "cc"
    2) "aa"
    3) "2"
    4) "b"
    5) "c"
    6) "bb"
    7) "a"
    8) "1"
    9) "3"
    127.0.0.1:6379> SINTER s1 s2
    1) "bb"
    2) "cc"
    3) "aa"
    4) "3"
    5) "c"
    127.0.0.1:6379> SINTER s2 s1
    1) "bb"
    2) "cc"
    3) "aa"
    4) "3"
    5) "c"
    127.0.0.1:6379> 
    

      SUNION:求并集,已属于 A 或属于 B 的元素为称为 A 与 B 的并(集);

    127.0.0.1:6379> SMEMBERS s1
    1) "bb"
    2) "dd"
    3) "cc"
    4) "aa"
    5) "3"
    6) "c"
    7) "4"
    127.0.0.1:6379> SMEMBERS s2
    1) "bb"
    2) "b"
    3) "1"
    4) "aa"
    5) "cc"
    6) "2"
    7) "3"
    8) "c"
    9) "a"
    127.0.0.1:6379> SUNION s1 s2
     1) "bb"
     2) "b"
     3) "1"
     4) "dd"
     5) "aa"
     6) "cc"
     7) "2"
     8) "3"
     9) "c"
    10) "4"
    11) "a"
    127.0.0.1:6379> SUNION s2 s1
     1) "b"
     2) "bb"
     3) "1"
     4) "dd"
     5) "cc"
     6) "aa"
     7) "2"
     8) "3"
     9) "c"
    10) "4"
    11) "a"
    127.0.0.1:6379>
    

      SDIFF:求差集,已属于 A 而不属于 B 的元素称为 A 与 B 的差(集);

    127.0.0.1:6379> SMEMBERS s1
    1) "bb"
    2) "dd"
    3) "cc"
    4) "aa"
    5) "3"
    6) "c"
    7) "4"
    127.0.0.1:6379> SMEMBERS s2
    1) "bb"
    2) "b"
    3) "1"
    4) "aa"
    5) "cc"
    6) "2"
    7) "3"
    8) "c"
    9) "a"
    127.0.0.1:6379> SDIFF s1 s2
    1) "4"
    2) "dd"
    127.0.0.1:6379> SDIFF s2 s1
    1) "a"
    2) "2"
    3) "1"
    4) "b"
    127.0.0.1:6379> 
    

      提示:差集和顺序有关,sdiff s1 s2表示s1有的元素,s2没有的元素,追踪结果一定是属于s1;sdiff s2 s1表示,s2有的元素s1没有的元素,最终结果一定是属于s2;如果得到的结果是空表示两个集合相等;

      有序集合常用操作

      Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个 double(双精度浮点型)类型的分数,redis 正是通过分数来为集合中的成员进行从小到大的排序,有序集合的成员是唯一的,但分数(score)却可以重复,集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1), 集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储 40 多亿个成员)。对于sorted set类型的数据常用操作有ZADD、ZCARD、ZCOUNT、ZRANK、ZRANGE;

      ZADD:向有序集合中添加一个或多个成员,如果已经存在,则更新其分数;ZCARD:获取指定集合成员个数;

    127.0.0.1:6379> ZADD z1 10 aa 20 bb 30 cc
    (integer) 3
    127.0.0.1:6379> ZADD z1 50 aa
    (integer) 0
    127.0.0.1:6379> ZCARD z1
    (integer) 3
    127.0.0.1:6379>
    

      ZCOUNT:统计给定分数范围在有序集合中成员个数;ZRANK:查看指定成员在有序集合中的索引;

    127.0.0.1:6379> ZCOUNT z1 1 15
    (integer) 0
    127.0.0.1:6379> ZCOUNT z1 10 20
    (integer) 1
    127.0.0.1:6379> ZCOUNT z1 10 50
    (integer) 3
    127.0.0.1:6379> ZRANK z1 aa
    (integer) 2
    127.0.0.1:6379> ZRANK z1 bb
    (integer) 0
    127.0.0.1:6379> ZRANK z1 cc
    (integer) 1
    127.0.0.1:6379> 
    

      ZRANGE:获取指定索引范围内的所有成员;

    127.0.0.1:6379> ZRANGE z1 0 2
    1) "bb"
    2) "cc"
    3) "aa"
    127.0.0.1:6379> ZRANGE z1 1 2
    1) "cc"
    2) "aa"
    127.0.0.1:6379> ZADD z1 1 aa 5 bb 10 dd 7 xx
    (integer) 2
    127.0.0.1:6379> ZRANGE z1 0 4
    1) "aa"
    2) "bb"
    3) "xx"
    4) "dd"
    5) "cc"
    127.0.0.1:6379> ZRANGE z1 2 4
    1) "xx"
    2) "dd"
    3) "cc"
    127.0.0.1:6379> 
    

      提示:分数越大,排名(索引)越靠后;

      哈希常用操作

      hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象,Redis 中每个 hash 可以存储2^32 - 1个键值对(40 多亿)。对于hash类型的数据常用操作有HSET、HMSET、HGET、HMGET、HKEYS、HVALS、HDEL、HGETALL

      HSET:设置一个hash key和值;HMSET:设置多个hash key和值;

    127.0.0.1:6379> HSET h1 name tom
    (integer) 1
    127.0.0.1:6379> HSET h1 age 18
    (integer) 1
    127.0.0.1:6379> HMSET h2 name jerry age 22 gender M
    OK
    127.0.0.1:6379> 
    

      HGET:获取一个hash key的值;HMGET:获取多个hash key的值;

    127.0.0.1:6379> HGET h1 name
    "tom"
    127.0.0.1:6379> HGET h1 age
    "18"
    127.0.0.1:6379> HMGET h1 name age gender
    1) "tom"
    2) "18"
    3) (nil)
    127.0.0.1:6379> HMGET h2 name age gender
    1) "jerry"
    2) "22"
    3) "M"
    127.0.0.1:6379> 
    

      HKEYS:获取指定hash key的所有key ;HVALS:获取指定hash key的所有key的值;

    127.0.0.1:6379> HKEYS h1
    1) "name"
    2) "age"
    127.0.0.1:6379> HKEYS h2
    1) "name"
    2) "age"
    3) "gender"
    127.0.0.1:6379> HVALS h1
    1) "tom"
    2) "18"
    127.0.0.1:6379> HVALS h2
    1) "jerry"
    2) "22"
    3) "M"
    127.0.0.1:6379> 
    

      HDEL:删除一个或多个hash key;HGETALL:获取指定hash key 的所有key和value;

    127.0.0.1:6379> HGETALL h1
    1) "name"
    2) "tom"
    3) "age"
    4) "18"
    127.0.0.1:6379> HGETALL h2
    1) "name"
    2) "jerry"
    3) "age"
    4) "22"
    5) "gender"
    6) "M"
    127.0.0.1:6379> HDEL h1 name 
    (integer) 1
    127.0.0.1:6379> HDEL h2 gender age
    (integer) 2
    127.0.0.1:6379> HGETALL h1
    1) "age"
    2) "18"
    127.0.0.1:6379> HGETALL h2
    1) "name"
    2) "jerry"
    127.0.0.1:6379> 
    

      消息队列常用操作

      消息队列主要分为两种,分别是生产者消费者模式和发布者订阅者模式,这两种模式 Redis 都支持;在生产者消费者(Producer/Consumer)模式下,上层应用接收到的外部请求后开始处理其当前步骤的操作,在执行完成后将已经完成的操作发送至指定的频道(channel)当中,并由其下层的应用监听该频道并继续下一步的操作,如果其处理完成后没有下一步的操作就直接返回数据给外部请求,如果还有下一步的操作就再将任务发布到另外一个频道,由另外一个消费者继续监听和处理。生产者消费者模式下,多个消费者同时监听一个队列,但是一个消息只能被最先抢到消息的消费者消费,即消息任务是一次性读取和处理,此模式在分布式业务架构中非常常用,比较常用的软件还有RabbitMQ、Kafka、RocketMQ、ActiveMQ 等;

      队列当中的 消息由不同的生产者写入也会有不同的消费者取出进行消费处理,但是一个消息一定是只能被取出一次也就是被消费一次。

      示例:使用本地连接模拟生产者往队列里写入消息,使用远程连接模拟消费者,消费队列中的消息;

    127.0.0.1:6379> LPUSH channel1 msg1
    (integer) 1
    127.0.0.1:6379> LPUSH channel1 msg2
    (integer) 2
    127.0.0.1:6379> LPUSH channel1 msg3
    (integer) 3
    127.0.0.1:6379> LRANGE channel1 0 -1
    1) "msg3"
    2) "msg2"
    3) "msg1"
    127.0.0.1:6379> 
    

      提示:以上在channel1这个消息队列中写入了3条信息;

      使用远程连接来模拟消费者到指定队列消费消息

    192.168.0.41:6379> RPOP channel1
    "msg1"
    192.168.0.41:6379> RPOP channel1
    "msg2"
    192.168.0.41:6379> RPOP channel1
    "msg3"
    192.168.0.41:6379> RPOP channel1
    (nil)
    192.168.0.41:6379> LRANGE channel1 0 -1
    (empty array)
    192.168.0.41:6379> 
    

      提示:可以看到消息队列里的消息消费完以后,就空了;

      发布者订阅模式

      在发布者订阅者模式下,发布者将消息发布到指定的 channel 里面,凡是监听该 channel 的消费者都会收到同样的一份消息,这种模式类似于是收音机模式,即凡是收听某个频道的听众都会收到主持人发布的相同的消息内容。此模式常用语群聊天、群通知、群公告等场景;

      示例:订阅者监听频道

      提示:订阅者可以同时监听多个频道;

      发布者发布

      订阅者验证消息

      提示:以上订阅者只订阅了一个频道,如果定义多个频道可以在后面添加频道名称即可;也可以使用PSUBSCRIBE 加模式匹配监听多个频道;取消订阅使用UNSUBSCRIBE 加要取消订阅的频道名称即可;也可以使用PUNSUBSCRIBE 加模式匹配 来取消匹配到的频道;

  • 相关阅读:
    15. DML, DDL, LOGON 触发器
    5. 跟踪标记 (Trace Flag) 834, 845 对内存页行为的影响
    4. 跟踪标记 (Trace Flag) 610 对索引组织表(IOT)最小化日志
    14. 类似正则表达式的字符处理问题
    01. SELECT显示和PRINT打印超长的字符
    3. 跟踪标记 (Trace Flag) 1204, 1222 抓取死锁信息
    2. 跟踪标记 (Trace Flag) 3604, 3605 输出DBCC命令结果
    1. 跟踪标记 (Trace Flag) 1117, 1118 文件增长及空间分配方式
    0. 跟踪标记 (Trace Flag) 简介
    SpringBoot + Redis + Shiro 实现权限管理(转)
  • 原文地址:https://www.cnblogs.com/qiuhom-1874/p/13419690.html
Copyright © 2011-2022 走看看