redis基础命令

redis

一 、基本命令

1. ping(心跳命令)

  • 键入ping命令,若看到PONG响应,则说明客户端与Redis的连接时正常的。

2. get/set(读写键值命令)

  • set key value 会将指定 key-value写入到DB。get key则会读取指定key的value值。

3、select(切换数据库)

  • redis默认有 16 个数据库。这个在 Redis Desktop Manager(RDM)图形客户端中可以直 观地看到。默认使用的是 0 号 DB,可以通过 select db 索引来切换 DB。如图,切换到1号DB:

4、dbsize(查看key数量)

  • dbsize 命令可以查看当前数据库中 key 的数量。

5、flushdb(删除当前库中所有数据)

  • 清除当前DB中所有数据不影响其他DB

6、flushall(删除所有DB中的数据)

二、Key相关操作命令

1、keys

格式:KEYS pattern

功能:查找所有符合给定模式 pattern 的 key,pattern 为正则表达式。

查看数据库中所有的键 :key *

说明:KEYS 的速度非常快,但在一个大的数据库中使用它可能会阻塞当前服务器的服务。所以生产环境中一般不使用该命令,而使用 scan 命令代替。

2、exists

格式:EXISTS key

功能:检查给定 key 是否存在。

说明:若 key 存在,返回 1 ,否则返回 0

3、del

格式:DEL key [key …]

功能:删除给定的一个或多个 key 。不存在的 key 会被忽略。

说明:返回被删除 key 的数量。

4、ttl/pttl

格式:TTL key

功能:TTL, time to live,返回给定 key 的剩余生存时间。

说明:其返回值存在三种可能:

​ 1/当 key 不存在时,返回 -2 。

​ 2/当 key 存在但没有设置剩余生存时间时,返回 -1 。

​ 3/否则,返回 key 的剩余生存时间。ttl 命令返回的时间单位为秒,而 pttl 命令返回的时间单位为毫秒。

5、rename

格式:RENAME key newkey

功能:将 key 改名为 newkey。

说明:当 key 和 newkey 相同,或者 key 不存在时,返回一个错误。当 newkey 已经存在时, RENAME 命令将覆盖旧值。改名成功时提示 OK ,失败时候返回一个错误。

6、move

格式:MOVE key db

功能:将当前数据库的 key 移动到给定的数据库 db 当中。

说明:如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定 key ,或者 key 不存在于当前数据库,那么 MOVE 没有任何效果。移动成功返回 1 ,失败则返回 0

7、type

格式:TYPE key

功能:返回 key 所储存的值的类型。

说明:返回值有以下六种

​ none (key 不存在)

​ string (字符串)

​ list (列表)set (集合)

​ zset (有序集)hash (哈希表)

8、expire/pexpire

格式:EXPIRE key seconds

功能:为给定 key 设置生存时间。当 key 过期时(生存时间为 0),它会被自动删除。 expire 的时间单位为秒,pexpire 的时间单位为毫秒。在 Redis 中,带有生存时间的 key被称为“易失”(volatile)。

说明:生存时间设置成功返回 1。若 key 不存在时返回 0 。rename 操作不会改变 key的生存时间。

9、persist

格式:PERSIST key

功能:去除给定 key 的生存时间,将这个 key 从“易失的”转换成“持久的”。

说明:当生存时间移除成功时,返回 1;若 key 不存在或 key 没有设置生存时间,则返回 0

10、randomkey

格式:RANDOMKEY

功能:从当前数据库中随机返回(不删除)一个 key。

说明:当数据库不为空时,返回一个 key。当数据库为空时,返回 nil。

字符串(strings)

1、set

格式:SET key value [EX seconds | PX milliseconds] [NX|XX]

功能:SET 除了可以直接将 key 的值设为 value 外,还可以指定一些参数。

EX seconds:为当前 key 设置过期时间,单位秒。等价于 SETEX 命令。

PX milliseconds:为当前 key 设置过期时间,单位毫秒。等价于 PSETEX 命令。

NX:指定的 key 不存在才会设置成功,用于添加指定的 key。等价于 SETNX 命令。

XX:指定的 key 必须存在才会设置成功,用于更新指定key 的value。

说明:如果value 字符串中带有空格,则该字符串需要使用双引号或单引号引起来,否则会认为 set 命令的参数数量不正确,报错。

2、setex/psetex

格式:SETEX/PSETEX key seconds value

功能:set expire,其不仅为 key 指定了value,还为其设置了生存时间。setex 的单位为秒,psetex 的单位为毫秒。

说明:如果 key 已经存在, 则覆写旧值。该命令类似于以下两个命令,不同之处是, SETEX 是一个原子性操作,关联值和设置生存时间两个动作会在同一时间内完成,该命令在 Redis 用作缓存时,非常实用。

SET key value

EXPIRE key seconds # 设置生存时间

3、setnx

格式:SETNX key value

功能:SET if Not eXists,将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key

已经存在,则 SETNX 不做任何动作。成功,返回 1,否则,返回 0。

说明:该命令等价于 set key value nx

4、append

格式:APPEND key value

功能:如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。

说明:追加 value 之后, key 中字符串的长度改变。

5、incr/decr

格式:INCR key 或 DECR key

功能:increment,自动递增。将 key 中存储的数字值增一。decrement,自动递减。将 key 中存储的数字值减一。

说明:如果 key 不存在,那么 key 的值会先被初始化为 0,然后再执行增一/减一操作。如果值不能表示为数字,那么返回一个错误提示。如果执行正确,则返回增一/减一后的值。

6、getrange

格式:GETRANGE key start end

功能:返回 key 中字符串值的子字符串,字符串的截取范围由 start 和 end 两个偏移量决定,包括 start 和 end 在内。

说明:end 必须要比 start 大。支持负数偏移量,表示从字符串最后开始计数,-1 表示最后一个字符,-2 表示倒数第二个,以此类推。

7、setrange

格式:SETRANGE key offset value

功能:用 value 参数替换给定 key 所储存的字符串值 str,从偏移量 offset 开始。

说明:当 offset 值大于 str 长度时,中间使用零字节\x00 填充,即 0000 0000 字节填充;对于不存在的 key 当作空串处理。

8、strlen(获取字符串长度)

格式:STRLEN key

功能:返回 key 所储存的字符串值的长度。

说明:当 key 储存的不是字符串值时,返回一个错误;当 key 不存在时,返回 0

字符串范围

set key1 "hello,world!"
OK
get key1
"hello,world!"
getrange key1 0 3		## 截取字符串[0, 3]
"hell"
getrange key1 0 -1		## 获取全部的字符串,和 get key一样 -1代表尾部
"hello,world!"

替换

set key2 abcdefg
OK
get key2
"abcdefg"
setrange key2 1 xx
(integer) 7
get key2
"axxdefg"

setex(set with expire):设置过期时间

setnx(set if not exist):不存在再设置(在分布式锁中会经常使用)

127.0.0.1:6379> setex key3 30 "hello"		## 设置 30 秒后过期
OK
127.0.0.1:6379> ttl key3					## 剩余过期时间
(integer) 25
127.0.0.1:6379> setnx mykey "redis"			## mykey 不存在时设置成功
(integer) 1
127.0.0.1:6379> keys *
1) "key2"
2) "key1"
3) "views"
4) "mykey"
127.0.0.1:6379> setnx mykey "mongoDB"		## mykey 存在时设置失败
(integer) 0
127.0.0.1:6379> get mykey					## mykey 值不变
"redis"
127.0.0.1:6379> 

9、mset/msetnx

格式:MSET/MSETNX key value [key value …]

功能:同时设置一个或多个 key-value 对。

说明:如果某个给定 key 已经存在,那么 MSET 会用新值覆盖原来的旧值,如果这不 是你所希望的效果,请考虑使用 MSETNX 命令:它只会在所有给定 key 都不存在的情 况下进行设置操作。MSET/MSETNX 是一个原子性(atomic)操作,所有给定 key 都会在同 一时间内被设置,某些给定 key 被更新而另一些给定 key 没有改变的情况不可能发生。该命令永不失败。

10、mget

格式:MGET key [key …]

功能:返回所有(一个或多个)给定 key 的值。

说明:如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。因此,该命令永不失败。

msetmget

127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3		## 同时设置多个值
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k3"
3) "k2"
127.0.0.1:6379> mget k1 k2 k3			## 同时获取多个值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 v1 k4 v4       ## msetnx 是一个原子性的操作,要么一起成功,要么都失败
(integer) 0
127.0.0.1:6379> get k4
(nil)
127.0.0.1:6379>

11、getset

格式:GETSET key value

功能:将给定 key 的值设为 value ,并返回 key 的旧值。

说明:当 key 存在但不是字符串类型时,返回一个错误;当 key 不存在时,返回 nil 。

getset:先 get 再 set

127.0.0.1:6379> getset db redis		## 如果不存在值,则返回 nil
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb		## 如果存在值,获取原来的值,并设置新的值
"redis"
127.0.0.1:6379> get db
"mongodb"
127.0.0.1:6379> 

列表(list)

1、LPUSH

LPUSH key element
  • 将⼀个或多个元素添加到列表key的表头(左侧),多个值则从左⾄右依次插⼊表头;

  • 如果列表key不存在,则创建⼀个然后执⾏LPUSH插⼊操作;

  • 如果列表key存在但不是列表类型,则返回错误。执行成功时返回列表长度

一次性添加多个元素

LPUSH key v1 v2 v3 ......

2、RPUSH

RPUSH key element
  • 将⼀个或多个元素添加到列表key的表头(右侧),多个值则从右⾄左依次插⼊表头;

  • 如果列表key不存在,则创建⼀个然后执⾏LPUSH插⼊操作;

  • 如果列表key存在但不是列表类型,则返回错误。

3、LRANGE

格式:LRANGE key start stop

功能:返回列表 key 中指定区间[start, stop]内的元素,即包含两个端点。

说明:List 的下标从 0 开始,即以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。超出范围的下标值不会引起错误。如果 start 下标比列表的最大下标 还要大,那么 LRANGE 返回一个空列表。如果 stop 下标比最大下标还要大,Redis 将 stop 的值设置为最大下标。

返回列表key中,位于start和stop之间的元素(包括start和stop)。

LRANGE key start stop

4、LPOP

LPOP key count
  • 将⼀个或count个元素从列表头⽅向移除并将其返回;count默认值是1(加count报错)

  • 如果列表key不存在,则返回nil。

5、RPOP

RPOP key count
  • 将⼀个或count个元素从列表尾⽅向移除并将其返回;(加count报错)

  • 如果列表key不存在,则返回nil。

6、blpop/brpop

格式:BLPOP key [key …] timeout 或 BRPOP key [key …] timeout

功能:BLPOP/BRPOP 是列表的阻塞式(blocking)弹出命令。它们是 LPOP/RPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP/BRPOP 命令阻塞,直到等待 timeout 超时或发现可弹出元素为止。当给定多个 key 参数时,按参数 key的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。timeout 为阻塞时长,单位为秒,其值若为 0,则表示只要没有可弹出元素,则一直阻塞。

说明:假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。

7、LTRIM

格式:LTRIM key start stop

功能:对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。

说明:下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。当 key 不是列表类型时,返回一个错误。如果 start 下标比列表的最大下标 end ( LLEN list 减去 1 )还要大,或者 start > stop , LTRIM 返回一个空列表,因为 LTRIM 已经将整个列表清空。如果 stop 下标比 end 下标还要大,Redis 将 stop 的值设置为 end 。

  • 只保留列表key中索引为start和stop之间的元素。

8、Lpushx/Rpushx

格式:LPUSHX key value 或 RPUSHX key value

功能:将值 value 插入到列表 key 的表头/表尾,当且仅当 key 存在并且是一个列表。

说明:当 key 不存在时,命令什么也不做,返回0。若执行成功,则输出表的长度。

9、Lindex 索引

格式:LINDEX key index

功能:返回列表 key 中,下标为 index 的元素。列表从 0 开始计数。

说明:如果 index 参数的值不在列表的区间范围内(out of range),返回 nil 。
  • 通过下标获取list中的某一个值(从0开始)

10、Llen长度

格式:LLEN key

功能:返回列表 key 的长度。

说明:如果 key 不存在,则 key 被解释为一个空列表,返回 0 。如果 key 不是列表类型,返回一个错误。

11、rpoplpush

格式:RPOPLPUSH source destination

功能:命令 RPOPLPUSH 在一个原子时间内,执行以下两个动作:

将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。
将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。如果 source 不存在,值 nil 被返回,并且不执行其他动作。如果 source 和 destination 相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列 表的旋转(rotation)操作。

12、brpoplpush

格式:BRPOPLPUSH source destination timeout

功能:BRPOPLPUSH 是 RPOPLPUSH 的阻塞版本,当给定列表 source 不为空时, BRPOPLPUSH 的表现和 RPOPLPUSH 一样。当列表 source 为空时, BRPOPLPUSH 命令将阻塞连接,直到等待超时,或有另一个客户端对 source 执行 LPUSH 或 RPUSH 命令为止。timeout 为阻塞时长,单位为秒,其值若为 0,则表示只要没有可弹出元素,则一直阻塞。

说明:假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。反之,返回一个含有两个元素的列表,第一个元素是被弹出元素的值,第二个元素是等待时长。

13、Lrem 移除指定值

格式:LREM key count value

功能:根据参数 count 的值,移除列表中与参数 value 相等的元素。count 的值可以是以下几种:

count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
count = 0 : 移除表中所有与 value 相等的值。
说明:返回被移除元素的数量。当 key 不存在时, LREM 命令返回 0 ,因为不存在的 key 被视作空表(empty list)。
127.0.0.1:6379> lrange list 0 -1
1) "hjk"
2) "world"
3) "world"
127.0.0.1:6379> lrem list 1 world		## 移除list集合中指定个数的value,精确匹配
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "hjk"
2) "world"
127.0.0.1:6379> lpush list hjk
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "hjk"
2) "hjk"
3) "world"
127.0.0.1:6379> lrem list 2 hjk
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "world"
127.0.0.1:6379> 

11、

  1. Ltrim 截断(下标从0开始)
127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello2"
3) "hello3"
4) "hello4"
127.0.0.1:6379> ltrim mylist 1 2 ## 通过下标截取指定长度,这个list已经被破坏了,截断之后只剩下截断后的元素
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "hello2"
2) "hello3"
127.0.0.1:6379> 

11、

  1. Rpoplpush

移除列表的最后一个元素,将他移动到新的列表中

127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello2"
3) "hello3"
127.0.0.1:6379> rpoplpush mylist myotherlist		## 移除列表的最后一个元素,将他移动到新的列表中。
"hello3"
127.0.0.1:6379> lrange mylist 0 -1		## 查看原来的列表
1) "hello1"
2) "hello2"
127.0.0.1:6379> lrange myotherlist 0 -1		## 查看目标列表中,确实存在该值
1) "hello3"
127.0.0.1:6379> 

14、Lset(下标从0开始)

格式:LSET key index value

功能:将列表 key 下标为 index 的元素的值设置为 value 。

说明:当 index 参数超出范围,或对一个空列表(key 不存在)进行 LSET 时,返回一个错误。

将列表中指定下标的值替换为另一个值,更新操作

127.0.0.1:6379> exists list		## 判断这个列表是否存在
(integer) 0
127.0.0.1:6379> lset list 0 item		## 如果不存在的话,更新会报错
(error) ERR no such key
127.0.0.1:6379> lpush list value1
(integer) 1
127.0.0.1:6379> lrange list 0 0 
1) "value1"
127.0.0.1:6379> lset list 0 item		## 如果存在,更新当前下标的值
OK
127.0.0.1:6379> lset list 1 other		## 如果不存在的话,更新会报错
(error) ERR index out of range
127.0.0.1:6379> 

15、Linsert

格式:LINSERT key BEFORE|AFTER pivot value

功能:将值 value 插入到列表 key 当中,位于元素 pivot 之前或之后。

说明:当 pivot 元素不存在于列表中时,不执行任何操作,返回-1;当 key 不存在时, key 被视为空列表,不执行任何操作,返回 0;如果 key 不是列表类型,返回一个错误;如果命令执行成功,返回插入操作完成之后,列表的长度。
before

after

将某个具体的value插入到列表中某个元素的前面或者后面

127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello2"
127.0.0.1:6379> linsert mylist before "hello2" hello
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello"
3) "hello2"
127.0.0.1:6379> linsert mylist after "hello2" hello
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello"
3) "hello2"
4) "hello"
127.0.0.1:6379> 

集合(set)

1. SADD

SADD key member
  • 将⼀个或多个元素加⼊到集合key中。已存在于集合中的元素将被忽略。

  • 说明:假如 key 不存在,则创建一个只包含 member 元素作成员的集合。当 key 不是集合类型时,返回一个错误。

2. SMEMBERS

SMEMBERS key
  • 返回集合key中的所有成员。
  • 说明:不存在的 key 被视为空集合。若 key 中包含大量元素,则该命令可能会阻塞 Redis服务。所以生产环境中一般不使用该命令,而使用 sscan 命令代替。

3. SISMEMBER

SISMEMBER key member
  • 判断MEMBER是否是集合key的成员,是返回1,不是或key不存在返回0。

4. SREM

SREM key member
  • 将⼀个或多个元素从集合key中移除。不存在的member元素将被忽略。

  • 返回成功移除的元素的个数

  • 当key不为集合类型时,返回一个错误

5. SCARD

scard key
  • 获取集合中值的个数

  • 当key不存在时,返回0

6. SRANDMEMBER

格式:SRANDMEMBER key [count]

功能:返回集合中的 count 个随机元素。count 默认值为 1。

说明:若 count 为正数,且小于集合长度,那么返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合长度,那么返回整个集合。如果count 为负数,那么返回一个包含 count 绝对值个元素的数组,但数组中的元素可能会出现重复。
srandmember myset  ##随机抽取一个元素


srandmember myset  2##随机抽取2个元素

7. SPOP

spop myset count
  • 随机移除并返回一个或多个元素,count必须为正数,且默认值为1
  • 如果count大于等于集合长度,那么移除并返回整个集合

8. SMOVE

格式:SMOVE source destination member

功能:将 member 元素从 source 集合移动到 destination 集合。

说明:如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去,返回 1。当 destination 集合已经包含 member 元素时, SMOVE命令只是简单地将 source 集合中的 member 元素删除。当 source 或 destination 不是集合类型时,返回一个错误。
127.0.0.1:6379> smembers myset
1) "kkk"
2) "world"
127.0.0.1:6379> sadd myset2 set2
(integer) 1
127.0.0.1:6379> smove myset myset2 "kkk"			## 将一个特定的值,移动到另一个set集合中
(integer) 1
127.0.0.1:6379> smembers myset
1) "world"
127.0.0.1:6379> smembers myset2
1) "kkk"
2) "set2"
127.0.0.1:6379> 

9. 差集,交集,并集

sdiff/sdiffstore
格式:SDIFF key [key …] 或 SDIFFSTORE destination key [key …]

功能:返回第一个集合与其它集合之间的差集。差集,difference。

说明:这两个命令的不同之处在于,sdiffstore 不仅能够显示差集,还能将差集存储到指定的集合 destination 中。如果 destination 集合已经存在,则将其覆盖。不存在的 key 被视为空集。
sinter/sinterstore
格式:SINTER key [key …] 或 SINTERSTORE destination key [key …]

功能:返回多个集合间的交集。交集,intersection。

说明:这两个命令的不同之处在于,sinterstore 不仅能够显示交集,还能将交集存储到指定的集合 destination 中。如果 destination 集合已经存在,则将其覆盖。不存在的 key被视为空集。
sunion/sunionstore
格式:SUNION key [key …] 或 SUNIONSTORE destination key [key …]

功能:返回多个集合间的并集。并集,union。

说明:这两个命令的不同之处在于,sunionstore 不仅能够显示并集,还能将并集存储到指定的集合 destination 中。如果 destination 集合已经存在,则将其覆盖。不存在的 key被视为空集。
127.0.0.1:6379> smembers key1
1) "b"
2) "a"
3) "c"
127.0.0.1:6379> smembers key2
1) "e"
2) "d"
3) "c"
127.0.0.1:6379> sdiff key1 key2			## 差集
1) "b"
2) "a"
127.0.0.1:6379> sinter key1 key2         ## 交集
1) "c"
127.0.0.1:6379> sunion key1 key2		## 并集
1) "e"
2) "a"
3) "c"
4) "d"
5) "b"

有序集合(SortedSets)

1. ZADD

格式:ZADD key score member [[score member] [score member] …]

功能:将一个或多个 member 元素及其 score 值加入到有序集 key 中的适当位置。

说明:score 值可以是整数值或双精度浮点数。如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。当 key 存在但不是有序集类型时,返回一个错误。如果命令执行成功,则返回被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。若写入的 member 值已经存在,但score 值不同,则新的 score 值将覆盖老 score。
ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member


127.0.0.1:6379> zadd myset 1 one		## 添加一个值
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three	## 添加多个值
(integer) 2
127.0.0.1:6379> zrange myset 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> 

将⼀个或多个member元素及其分数score加⼊到有序集合key中。

2. ZRANGEBYSCORE/ZREVRANGEBYSCORE

格式:ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

功能:返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增/递减次序排列。具有相同 score 值的成员按字典序/逆字典序排列。可选的 LIMIT 参数指定返回结果的数量及区间(就像 SQL 中的 SELECT LIMIT offset, count ),注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程效率可能会较低。可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。

说明:min 和 max 的取值是正负无穷大的。默认情况下,区间的取值使用闭区间 (小于等于或大于等于),也可以通过给参数前增加左括号“(”来使用可选的开区间 (小于或大于)

实现排序

127.0.0.1:6379> zadd salary 2500 xiaohong
(integer) 1
127.0.0.1:6379> zadd salary 5000 xiaoming
(integer) 1
127.0.0.1:6379> zadd salary 500 xaiozhang
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "xaiozhang"
2) "xiaohong"
3) "xiaoming"
127.0.0.1:6379> zrangebyscore salary -inf +inf		## 从小到大显示全部的用户
1) "xaiozhang"
2) "xiaohong"
3) "xiaoming"
127.0.0.1:6379> zrevrange salary 0 -1		## 从大到小进行排序
1) "xiaoming"
2) "xiaohong"
3) "xaiozhang"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores   ## 附带成绩的显示所有用户
1) "xaiozhang"
2) "500"
3) "xiaohong"
4) "2500"
5) "xiaoming"
6) "5000"
127.0.0.1:6379> zrangebyscore salary -inf 2500 withscores			## 显示工资小于 2500 的用户
1) "xaiozhang"
2) "500"
3) "xiaohong"
4) "2500"

3. 附带成绩显示所有用户

127.0.0.1:6379> zrangebyscore salary -inf +inf withscores   ## 附带成绩的显示所有用户
1) "xaiozhang"
2) "500"
3) "xiaohong"
4) "2500"
5) "xiaoming"
6) "5000"

4. zrange/zrevrange

格式:ZRANGE key start stop [WITHSCORES] 或 ZREVRANGE key start stop [WITHSCORES]

功能:返回有序集 key 中,指定区间内的成员。zrange 命令会按 score 值递增排序, zrevrange 命令会按score 递减排序。具有相同 score 值的成员按字典序/逆字典序排列。可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回。

说明:下标参数从 0 开始,即 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。也可以使用负数下标,-1 表示最后一个成员,-2 表示倒数第二个成员,以此类推。超出范围的下标并不会引起错误。例如,当 start 的值比有序集的最大下标还要大,或是 start > stop 时, ZRANGE 命令只是简单地返回一个空列表。再比如 stop 参数的值比有序集的最大下标还要大,那么 Redis 将 stop 当作最大下标来处理。

若 key 中指定范围内包含大量元素,则该命令可能会阻塞 Redis 服务。所以生产环境中如果要查询有序集合中的所有元素,一般不使用该命令,而使用 zscan 命令代替。
ZREVRANGE

从大到小进行排序

127.0.0.1:6379> zrevrange salary 0 -1		## 从大到小进行排序
1) "xiaoming"
2) "xiaohong"
3) "xaiozhang"
ZRANGE
ZRANGE key start stop [BYSCORE|BYLEX] [REV] [LIMIT offset count] [WITHSCORES]

返回有序集合key中指定区间内的成员。(从⼩到⼤排列)

6. ZREM

格式:ZREM key member [member …]

功能:移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。

说明:当 key 存在但不是有序集类型时,返回一个错误。执行成功,则返回被成功移除的成员的数量,不包括被忽略的成员。

移除特定元素

127.0.0.1:6379> zrem salary xiaohong  ## 移除特定元素
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "xaiozhang"
2) "xiaoming"

7. ZCARD

获取有序集合中元素的个数

zcard salary
  • 返回集合的长度
  • 当key不存在时,返回0

8. ZCOUNT

格式:ZCOUNT key min max

功能:返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min或 max )的成员的数量。

获取指定区间元素数量

127.0.0.1:6379> zadd myset 1 hello
(integer) 1
127.0.0.1:6379> zadd myset 2 world 3 !
(integer) 2
127.0.0.1:6379> zcount myset 1 3		## 获取指定区间的人员数量
(integer) 3
127.0.0.1:6379> zcount myset 1 2
(integer) 2

9. ZSCORE

格式:ZSCORE key member

功能:返回有序集 key 中,成员 member 的 score 值。

说明:如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。

返回有序集合key中的成员member的分数值(score)。

格式:ZRANK key member 或 ZREVRANK key member

功能:返回有序集 key 中成员 member 的排名。zrank 命令会按 score 值递增排序,zrevrank 命令会按 score 递减排序。

说明:score 值最小的成员排名为 0 。如果 member 不是有序集 key 的成员,返回 nil 。

10. ZRANK

ZRANK key member

返回有序集合key中成员member的排名。(按照score从⼩到⼤排列)

11. ZREVRANK

ZREVRANK key member

返回有序集合key中成员member的排名。(按照score从⼤到⼩排列)

哈希(Hashes)

1、HSET

格式:HSET key field value

功能:将哈希表 key 中的域 field 的值设为 value 。

说明:如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。如果域 field 已经存在于哈希表中,旧值将被覆盖。如果 field 是哈希表中的一个新建域,并且值设置成功,返回 1 。如果哈希表中域 field 已经存在且旧值已被新值覆盖,返回 0 。

将哈希表key中的域field的值设置为value。

2、HGET

格式:HGET key field

功能:返回哈希表 key 中给定域 field 的值。

说明:当给定域不存在或是给定 key 不存在时,返回 nil 。

返回哈希表key中给定域field的值。

3、HMSET

格式:HMSET key field value [field value …]

功能:同时将多个 field-value (域-值)对设置到哈希表 key 中。

说明:此命令会覆盖哈希表中已存在的域。如果 key 不存在,一个空哈希表被创建并执行 HMSET 操作。如果命令执行成功,返回 OK 。当 key 不是哈希表(hash)类型时,返回一个错误。

4、HMGET

格式:HMGET key field [field …]

功能:按照给出顺序返回哈希表 key 中一个或多个域的值。

说明:如果给定的域不存在于哈希表,那么返回一个 nil 值。因为不存在的 key 被当作一个空哈希表来处理,所以对一个不存在的 key 进行 HMGET 操作将返回一个只带有 nil 值的表。

5、HDEL

格式:HDEL key field [field …]

功能:删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。

说明:返回被成功移除的域的数量,不包括被忽略的域。

删除哈希表key中的⼀个或多个指定域field。

6、HEXISTS

格式:HEXISTS key field

功能:查看哈希表 key 中给定域 field 是否存在。

说明:如果哈希表含有给定域,返回 1 。如果不含有给定域,或 key 不存在,返回 0 。

判断给定域field是否存在于哈希表key中。

7、HKEYS /HVALS

格式:HKEYS key 或 HVALS key

功能:返回哈希表 key 中的所有域/值。

说明:当 key 不存在时,返回一个空表。

返回哈希表key中的所有域。

8、HLEN

格式:HLEN key

功能:返回哈希表 key 中域的数量。

说明:当 key 不存在时,返回 0 。

返回哈希表key中域的数量。

9、hstrlen

格式:HSTRLEN key field

功能:返回哈希表 key 中, 与给定域 field 相关联的值的字符串长度(string length)。

说明:如果给定的键或者域不存在, 那么命令返回 0 。

10、Hgetall

获取全部数据(key,value)

格式:HGETALL key

功能:返回哈希表 key 中所有的域和值。

说明:在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。若 key 不存在,返回空列表。若 key 中包含大量元素,则该命令可能会阻塞 Redis 服务。所以生产环境中一般不使用该命令,而使用 hscan 命令代替。

11、Hsetnx(传入key,value)

格式:HSETNX key field value

功能:将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。

说明:若域 field 已经存在,该操作无效。如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令。

如果不存在则可以设置

12、hincrby/hincrbyfloat

格式:HINCRBY key field increment

功能:为哈希表 key 中的域 field 的值加上增量 increment 。hincrby 命令只能增加整数值,而 hincrbyfloat 可以增加小数值。

说明:增量也可以为负数,相当于对给定域进行减法操作。如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。如果域 field 不存在,那么在执行命令前,域的值被初始化为 0。对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误。

HyperLogLog

一种算法,可用极少的内存统计基数

1. PFADD

PFADD key [element [element ...]]
添加⼀个或者多个元素到HyperLogLog中。若key不存在则创建⼀个。

命令描述

  • 该命令将多个元素添加到key对应的HyperLogLog中
  • 调用命令后,HyperLogLog内部结构可能会更新,用于表示不同元素数量(集合的基数)的估计值
  • 如果添加元素后基数估计值更新了,那么就会返回1,否则返回0
  • 如果key不存在,该命令会创建一个空的HyperLogLog结构
  • 如果命令只提供了key,没有提供element参数,此时如果key已经存在,不会执行任何操作;否则会创建空的HyperLogLog

返回值

整数值:如果估计值被更新,返回1;否则返回0

# 添加元素
127.0.0.1:6379> pfadd hll a b c d e f g
(integer) 1
127.0.0.1:6379> pfcount hll
(integer) 7

# 添加重复元素
127.0.0.1:6379> pfadd hll a
(integer) 0

# 添加新元素
127.0.0.1:6379> pfadd hll h
(integer) 1
127.0.0.1:6379> pfcount hll
(integer) 8

2. PFCOUNT

PFCOUNT key [key ...]

返回⼀个key的近似的基数。

命令描述

  • 当只指定一个key时,返回HyperLogLog的近似基数;如果key不存在,返回0
  • 当指定多个key时,内部通过合并给定的多个HyperLogLog到一个临时的HyperLogLog,以此返回多个HyperLogLog并集的基数

返回值

整数值:集合基数的近似值

# 添加元素
127.0.0.1:6379> pfadd hll a b c d e f g
(integer) 1
127.0.0.1:6379> pfcount hll
(integer) 7

3. PFMERGE

PFMERGE destkey sourcekey [sourcekey ...]

将⼀个或多个sourcekey合并⾄destkey。

命令描述

  • 将多个 sourcekey 对应的 HyperLogLog 合并(merge)到 destkey 对应的HyperLogLog,合并后的 HyperLogLog 的基数接近于所有输入 HyperLogLog 的并集
  • 如果destkey不存在,会创建一个空的HyperLogLog
  • 如果destkey已存在,命令会把destkey与所有的sourcekey一起合并,最终destkey对应的基数也包含了自身的数量

返回值

字符串:“OK”

127.0.0.1:6379> PFADD hll1 foo bar zap a
(integer) 1
127.0.0.1:6379> PFADD hll2 a b c foo
(integer) 1
127.0.0.1:6379> PFADD hll3 d
(integer) 1

# a b c d foo bar zap 
127.0.0.1:6379> PFMERGE hll3 hll1 hll2
OK
127.0.0.1:6379>  PFCOUNT hll3
(integer) 7

127.0.0.1:6379> pfadd mykey a b c d e f g h i j	## 创建第一组元素
(integer) 1
127.0.0.1:6379> PFCOUNT mykey					## 统计 mykey 基数
(integer) 10
127.0.0.1:6379> PFADD mykey2 i j z x c v b n m  ## 创建第二组元素
(integer) 1
127.0.0.1:6379> PFCOUNT mykey2					## 统计 mykey2 基数
(integer) 9
127.0.0.1:6379> PFMERGE mykey3 mykey mykey2		## 合并两组 mykey mykey2 => mykey3
OK
127.0.0.1:6379> PFCOUNT mykey3
(integer) 15
127.0.0.1:6379>

位图(Bitmaps)

1. SETBIT

SETBIT key offset value

设置或者清除偏移量为offset的位。

127.0.0.1:6379> setbit sign 0 1		## 周一打卡了
(integer) 0
127.0.0.1:6379> setbit sign 1 0		## 周二未打卡
(integer) 0
127.0.0.1:6379> setbit sign 2 0		## 周三未打卡
(integer) 0
127.0.0.1:6379> setbit sign 3 1		## 周四打卡了
(integer) 0
127.0.0.1:6379> setbit sign 4 1		## 周五打卡了
(integer) 0
127.0.0.1:6379> setbit sign 5 1		## 周六打卡了
(integer) 0
127.0.0.1:6379> setbit sign 6 0		## 周日未打卡
(integer) 0
127.0.0.1:6379> 

查看某一天是否打卡

127.0.0.1:6379> GETBIT sign 3
(integer) 1
127.0.0.1:6379> GETBIT sign 6
(integer) 0
127.0.0.1:6379>

统计:统计打卡的天数

127.0.0.1:6379> BITCOUNT sign
(integer) 4
127.0.0.1:6379>

2. GETBIT

GETBIT key offset

读取偏移量为offset的位的值。

3. BITCOUNT

BITCOUNT key

返回从start到end为⽌的所有设置位(bit为1的位)的数量。

  1. BITPOS
BITPOS key bit

返回第⼀个bit位(0或者1)的位置。

位域(Bitfields)

在 Redis 中,位域(Bitfields)是用于处理二进制数据的一种技术。Redis 提供了 BITFIELD 命令,它允许在字符串类型的值中按位操作,像对待位图(bitmaps)一样,对数据进行高效的操作。通过 BITFIELD 命令,你可以在 Redis 中使用位域存储和操作多个整数值,从而节省空间并实现更高效的数据操作。

bitfield命令的语法

BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] ...
  • key: 目标键名
  • GET type offset:获取指定位置的位值。type 是数据类型,offset 是位域的偏移量(位置)。
  • SET type offset value:设置位域指定位置的值。
  • INCRBY type offset increment:增量修改位域指定位置的值。

支持的类型

BITFIELD 支持多种数据类型,可以根据需要存储不同大小的整数:

  • u1:无符号 1 位整数。
  • u8:无符号 8 位整数。
  • u16:无符号 16 位整数。
  • u32:无符号 32 位整数。
  • u64:无符号 64 位整数。
  • s8:有符号 8 位整数。
  • s16:有符号 16 位整数。
  • s32:有符号 32 位整数。
  • s64:有符号 64 位整数。

操作示例

设置和获取位域中的整数

假设我们要在 Redis 中管理一个 32 位的无符号整数,在偏移量(位置)为 0 处设置一个值,然后再获取它。

# 设置 32 位无符号整数,偏移量为 0,值为 12345
BITFIELD mykey SET u32 0 12345

# 获取偏移量 0 处的 32 位无符号整数
BITFIELD mykey GET u32 0

输出

1) (integer) 12345

增量操作

假设我们有一个计数器,并且想要增加指定位置上的值。

# 在偏移量 0 处的 32 位无符号整数上增加 5
BITFIELD mykey INCRBY u32 0 5

输出

1) (integer) 12350

多次操作

可以在单个命令中同时执行多个操作,进行批量修改

BITFIELD mykey SET u8 0 255 GET u8 0 SET u16 8 32767 INCRBY u32 24 10

这样将进行以下操作

  1. 设置偏移量 0 处的 8 位整数为 255。
  2. 获取偏移量 0 处的 8 位整数值。
  3. 设置偏移量 8 处的 16 位整数为 32767。
  4. 增加偏移量 24 处的 32 位整数值 10。

bitfield命令的优势

  1. 节省空间:由于 Redis 的字符串是字节序列,BITFIELD 操作可以将多个整数值紧凑地存储在单个键值对中。
  2. 高效性:通过位操作,BITFIELD 能高效地处理和更新数据,比单独存储多个整数要节省内存。
  3. 灵活性:支持多种数据类型和复杂的位域操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值