上一篇博客我们聊了下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 加模式匹配 来取消匹配到的频道;

Redis服务之常用数据类型的更多相关文章

  1. Redis API与常用数据类型简介

    Redis API与常用数据类型简介 一.Redis API For .Net 首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些 ...

  2. NoSQL初探之人人都爱Redis:(2)Redis API与常用数据类型简介

    一.Redis API For .Net 首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些第三方的开源类库.目前最流行的就是Se ...

  3. 【转】NoSQL初探之人人都爱Redis:(2)Redis API与常用数据类型简介

    一.Redis API For .Net 首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些第三方的开源类库.目前最流行的就是Se ...

  4. Redis服务之常用配置(三)

    上一篇博客我们聊了下redis的rdb持久化.安全连接.资源限制相关配置;回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/13394411.html;今天我们来 ...

  5. Redis服务之常用配置(一)

    上一篇博客聊了下redis的简介以及redis的yum安装和源码编译安装需要注意到问题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13378138.html ...

  6. Redis服务之常用配置(二)

    上一篇博客我们聊了下redis的INCLUDE.NETWORK.GENERAL配置段相关配置和说明,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/133831 ...

  7. Mac--管理mysql、redis服务的常用命令

    ##启动MySQL服务 sudo /usr/local/MySQL/support-files/mysql.server start ##停止MySQL服务 sudo /usr/local/mysql ...

  8. Redis五种常用数据类型

    string 字符串常用操作 1.存入字符串键值对  SET key value 2.批量存储字符串键值对  MSET key value [key value ...] 3.获取一个字符串键值  G ...

  9. Redis(三)数据类型

    之前的文章中说了Redis的常见应用场景和特性,在特性章节中也大致说了数据结构契合场景.因为我想在更深入.更全面的学习Redis之前,了解场景和特性,才能在学习时更加全面且理解更透彻: redis的什 ...

随机推荐

  1. 复杂链表的复制(剑指offer-25)

    题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点.(注意,输出结果中请不要返回 ...

  2. MYSQL 之 JDBC(十二): 处理Blob

    LOB,即Large Objects(大对象),是用来存储大量的二进制和文本数据的一种数据类型 LOB分为两种内省:内部LOB和外部LOB 内部LOB将数据以字节流的形式存储在数据库的内部.因而内部L ...

  3. np.nan is an invalid document, expected byte or unicode string.

    ValueError Traceback (most recent call last) <ipython-input-12-1dc462ae8893> in <module> ...

  4. java大数据最全课程学习笔记(1)--Hadoop简介和安装及伪分布式

    Hadoop简介和安装及伪分布式 大数据概念 大数据概论 大数据(Big Data): 指无法在一定时间范围内用常规软件工具进行捕捉,管理和处理的数据集合,是需要新处理模式才能具有更强的决策力,洞察发 ...

  5. mysql子查询习题98

    #1.查询工资最低的员工信息:last name, salary SELECT last_name, salary FROM employees WHERE salary = ( SELECT MIN ...

  6. sql中in和exists的原理及使用场景。

    在我们的工作中可能会遇到这样的情形: 我们需要查询a表里面的数据,但是要以b表作为约束. 举个例子,比如我们需要查询订单表中的数据,但是要以用户表为约束,也就是查询出来的订单的user_id要在用户表 ...

  7. 一篇文章,学会jmeter模拟文件上传、下载操作

    最近很多同学都在问jmeter上传,下载文件的脚本怎么做? 正巧这阵子忙完有时间,就来“折腾”一番,哈哈 现整理出来和大家分享 到底该怎么做? 一.准备工作: 上传接口一个(自行开发解决了) 下载接口 ...

  8. P4017 最大食物链计数(洛谷)

    老师开始帮我们查漏补缺啦!我们的老师这两天给了我们一些我们没怎么学的函数和算法,比如STL的函数和拓扑排序之类的,这个题就是讲拓扑排序的. 先看题板: 题目背景 你知道食物链吗?Delia 生物考试的 ...

  9. 肝了两天IntelliJ IDEA 2020,解锁11种新姿势, 真香!!!

    IDEA2020版本正式发布已经有3个月了,当时由于各方面原因(太懒)也没有去尝试新功能.于是这个周末特意去在另一个电脑上下载了最新版的IDEA,并尝试了一下.总的来说呢,体验上明显的提升. 作为一个 ...

  10. 二分图&网络流初步

    链接 : 最小割&网络流应用 EK太低级了,不用. 那么请看:#6068. 「2017 山东一轮集训 Day4」棋盘,不用EK你试试? dinic模板及部分变形应用见zzz大佬的博客:网络流学 ...