设为首页 收藏本站
查看: 1068|回复: 0

[经验分享] Redis(三)、支持数据类型及常用操作命令

[复制链接]

尚未签到

发表于 2018-11-2 13:35:28 | 显示全部楼层 |阅读模式
  Redis支持的数据结构及命令
第1章 支持数据结构类型
  你也许已经知道Redis并不是简单的key-value存储,实际上他是一个数据结构服务器,支持不同类型的值。也就是说,你不必仅仅把字符串当作键所指向的值。下列这些数据类型都可作为值类型:
  数据类型
  说明
  Strings(字符串)
  二进制安全的字符串
  Lists(列表)
  按插入顺序排序的字符串元素的集合。他们基本上就是链表(linked lists
  Sets(集合)
  不重复且无序的字符串元素的集合。
  Sorted sets(有序集合)
  类似Sets,但是每个字符串元素都关联到一个叫score浮动数值(floating number value)。里面的元素总是通过score进行着排序,所以不同的是,它是可以检索的一系列元素。(例如你可能会问:给我前面10个或者后面10个元素)。
  Hashes(散列)
  由field和关联的value组成的map。field和value都是字符串的
  bitmaps
  通过特殊的命令,你可以将   String 值当作一系列 bits 处理:可以设置和清除单独的 bits,数出所有设为 1 的 bits 的数量,找到最前的被设为 1 或 0 的 bit,等等。
  hyperloglog
  估计一个 set 中元素数量的概率性的数据结构。
  geospatial(地理空间)
第2章 Redis常用命令
  Redis命令十分丰富,包括的命令组有Cluster、Connection、Geo、Hashes、HyperLogLog、Keys、Lists、Pub/Sub、Scripting、Server、Sets、Sorted Sets、Strings、Transactions一共14个redis命令组两百多个redis命令。
2.1 针对Key的命令
  命令
  命令说明
  DEL
  删除给定的一个或多个 key
  DUMP
  序列化给定key,并返回被序列化的值
  EXISTS
  检查给定的key是否存在
  EXPIRE
  给key设置生存时间
  EXPIREAT
  同EXPIRE类似,不过接受的时间参数是UNIX的时间戳
  KEYS
  查询符合给定模式的key
  MIGRATE
  传输key到目标实例
  MOVE
  将当前数据库的key移动到给定的数据库db中
  OBJECT
  命令允许从内部察看给定 key 的 Redis 对象
  PRESIST
  移除给定key的生存时间,结合EXPIRE使用
  PEXPIRE
  同 EXPIRE 类似,但是它以毫秒为单位设置 key 的生存时间
  PEXPIREAT
  同EXPIREAT类似,但是它以毫秒为单位设置 key 的生存时间
  PTTL
  同TTL类似,但是它以毫秒为单位返回key的剩余生存时间
  RANDOMKEY
  从当前数据库中随机返回(不删除)一个 key 。
  RENAME
  将 key 改名为 newkey 。
  RENAMENX
  当且仅当 newkey 不存在时,将 key 改名为 newkey 。
  RESTORE
  反序列化给定的序列化值,并将它和给定的 key 关联。
  SORT
  返回或保存给定列表、集合、有序集合 key 中经过排序的元素。
  TTL
  以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
  TYPE
  返回 key 所储存的值的类型。
  SCAN
  增量迭代
2.1.1 DEL
  删除给定的一个或多个 key ,不存在的 key 会被忽略。
  q  删除单个key
10.0.0.16:6379> SET name liutao  
OK
  
10.0.0.16:6379> DEL name
  
(integer) 1
  q  删除一个不存在的key
10.0.0.16:6379> EXISTS hehe  
(integer) 0
  
10.0.0.16:6379> DEL hehe    # SET name "redis"  
OK
  
10.0.0.16:6379> SET type "key-value store"
  
OK
  
10.0.0.16:6379> SET website "redis.com"
  
OK
  
10.0.0.16:6379> DEL name type website
  
(integer) 3
2.1.2 EXISTS
  检查给定 key 是否存在。若 key 存在,返回 1 ,否则返回 0 。
10.0.0.16:6379> SET db "redis"  
OK
  
10.0.0.16:6379> EXISTS db
  
(integer) 1
  
10.0.0.16:6379> DEL db
  
(integer) 1
  
10.0.0.16:6379> EXISTS db
  
(integer) 0
2.1.3 EXPIRE
  EXPIRE key seconds
  为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。在 Redis 中,带有生存时间的 key 被称为『易失的』(volatile)。使用 PERSIST 命令可以在不删除 key 的情况下,移除 key 的生存时间,让 key 重新成为一个『持久的』(persistent) key 。
10.0.0.16:6379> SET cache_page "www.google.com"  
OK
  
10.0.0.16:6379> EXPIRE cache_page 30
  
(integer) 1
  
10.0.0.16:6379> TTL cache_page
  
(integer) 26
  
10.0.0.16:6379> EXPIRE cache_page 3000
  
(integer) 1
  
10.0.0.16:6379> TTL cache_page
  
(integer) 2999
  
10.0.0.16:6379> PERSIST cache_page
  
(integer) 1
  
10.0.0.16:6379> TTL cache_page
  
(integer) -1
2.1.4 KEYS
  KEYS pattern,查询符合给定模式pattern的key。
  KEYS * :匹配数据库中所有的key;
  KEYS h?llo :匹配 hello , hallo 和 hxllo 等。
  KEYS h*llo :匹配 hllo 和 heeeeello 等。
  KEYS h[ae]llo :匹配 hello 和 hallo ,但不匹配 hillo 。
  注:KEYS 的速度非常快,但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据集中查找特定的 key ,你最好还是用 Redis 的集合结构(set)来代替。
10.0.0.16:6379> MSET one 1 two 2 three 3 four 4  
OK
  
10.0.0.16:6379> KEYS *o*
  
1) "four"
  
2) "two"
  
3) "one"
  
10.0.0.16:6379> KEYS t??
  
1) "two"
  
10.0.0.16:6379> KEYS t????
  
1) "three"
  
10.0.0.16:6379> KEYS t[w]*
  
1) "two"
  
10.0.0.16:6379> KEYS *
  
1) "three"
  
2) "four"
  
3) "two"
  
4) "one"
  
5) "greeting"
  
6) "cache_page"
2.1.5 MIGRATE
  MIGRATE host port key destination-db timeout [COPY] [REPLACE]
  将 key 原子性地从当前实例传送到目标实例的指定数据库上,一旦传送成功, key 保证会出现在目标实例上,而当前实例上的 key 会被删除。这个命令是一个原子操作,它在执行的时候会阻塞进行迁移的两个实例,直到以下任意结果发生:迁移成功,迁移失败,等待超时。
  命令的内部实现是这样的:它在当前实例对给定 key 执行 DUMP 命令 ,将它序列化,然后传送到目标实例,目标实例再使用 RESTORE对数据进行反序列化,并将反序列化所得的数据添加到数据库中;当前实例就像目标实例的客户端那样,只要看到 RESTORE 命令返回 OK ,它就会调用 DEL 删除自己数据库上的 key 。
  timeout 参数以毫秒为格式,指定当前实例和目标实例进行沟通的最大间隔时间。这说明操作并不一定要在 timeout 毫秒内完成,只是说数据传送的时间不能超过这个 timeout 数。
  MIGRATE 命令需要在给定的时间规定内完成 IO 操作。如果在传送数据时发生 IO 错误,或者达到了超时时间,那么命令会停止执行,并返回一个特殊的错误: IOERR 。当 IOERR 出现时,有以下两种可能:
  1)key 可能存在于两个实例
  2)key 可能只存在于当前实例
  唯一不可能发生的情况就是丢失 key ,因此,如果一个客户端执行 MIGRATE 命令,并且不幸遇上 IOERR 错误,那么这个客户端唯一要做的就是检查自己数据库上的 key 是否已经被正确地删除。如果有其他错误发生,那么 MIGRATE 保证 key 只会出现在当前实例中。(当然,目标实例的给定数据库上可能有和 key 同名的键,不过这和 MIGRATE 命令没有关系)。
  可选项:
  COPY :不移除源实例上的 key 。
  REPLACE :替换目标实例上已存在的 key 。
  在10.0.0.16上操作:
10.0.0.16:6379> flushdb  
OK
  
10.0.0.16:6379> keys *
  
(empty list or set)
  
10.0.0.16:6379> clear
  
10.0.0.16:6379> SET greeting "Hellp from 10.0.0.16 6379 instance"
  
OK
  
10.0.0.16:6379> MIGRATE 10.0.0.11 6379 greeting 0 1000
  
OK
  
10.0.0.16:6379> EXISTS greeting
  
(integer) 0
  在10.0.0.11上操作:
10.0.0.11:6379> keys *  
1) "greeting"
  
10.0.0.11:6379> get greeting
  
"Hellp from 10.0.0.16 6379 instance"
2.1.6 TYPE
  返回key所存储的值的类型
  返回值:
  none(key不存在)
  string (字符串)
  list (列表)
  set (集合)
  zset (有序集)
  hash (哈希表)
10.0.0.16:6379> SET weather "sunny"  
OK
  
10.0.0.16:6379> TYPE weather
  
string
  
10.0.0.16:6379> LPUSH book_list "programming in scala"
  
(integer) 1
  
10.0.0.16:6379> TYPE book_list
  
list
  
10.0.0.16:6379> SADD pat "dog"
  
(integer) 1
  
10.0.0.16:6379> TYPE pat
  
set
2.2 针对String
  命令
  命令说明
  APPEND
  将 value 追加到 key 原来的值的末尾
  STRLEN
  返回 key 所储存的字符串值的长度
  INCR
  将 key 中储存的数字值增一
  INCRBY
  将 key 所储存的值加上增量 increment
  DECR
  将 key 中储存的数字值减一
  DECRBY
  将 key 所储存的值减去减量 decrement
  GET
  返回 key 所关联的字符串值
  GETRANGE
  返回 key 中字符串值的子字符串
  MGET
  返回所有(一个或多个)给定 key 的值
  MSET
  同时设置一个或多个 key-value 对。
2.2.1 APPEND
  如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。
  如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。
10.0.0.16:6379> EXISTS myphone  
(integer) 0
  
10.0.0.16:6379> APPEND myphone "nokia"
  
(integer) 5
  
10.0.0.16:6379> APPEND myphone "- 1110"
  
(integer) 11
  
10.0.0.16:6379> GET myphone
  
"nokia- 1110"
2.2.2 DECR
  DECR key
  将 key 中储存的数字值减一。
  如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。
  如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
  本操作的值限制在 64 位(bit)有符号数字表示之内。
10.0.0.16:6379> SET failure_times 10  
OK
  
10.0.0.16:6379> DECR failure_times
  
(integer) 9
  
10.0.0.16:6379> DECR failure_times
  
(integer) 8
  
10.0.0.16:6379> EXISTS count
  
(integer) 0
  
10.0.0.16:6379> DECR count
  
(integer) -1
  
10.0.0.16:6379> set company YOUR_CODE_SUCKS.LIC
  
OK
  
10.0.0.16:6379> DECR company
  
(error) ERR value is not an integer or out of range
2.2.3 DECRBY
  DECR key decrement
  将 key 中储存的数字值减去减量decrement。
  如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECRBY操作。
  如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
  本操作的值限制在 64 位(bit)有符号数字表示之内。
10.0.0.16:6379> SET count 100  
OK
  
10.0.0.16:6379> DECRBY count 20
  
(integer) 80
  
10.0.0.16:6379> EXISTS pages
  
(integer) 0
  
10.0.0.16:6379> DECRBY pages 10
  
(integer) -10
2.2.4 GET
  GET key
  返回 key 所关联的字符串值。
  如果 key 不存在那么返回特殊值 nil 。
  假如 key 储存的值不是字符串类型,返回一个错误,因为 GET 只能用于处理字符串值。
10.0.0.16:6379> GET db  
(nil)
  
10.0.0.16:6379> SET db redis
  
OK
  
10.0.0.16:6379> GET db
  
"redis"
  
10.0.0.16:6379> DEL db
  
(integer) 1
  
10.0.0.16:6379> LPUSH db redis mongdb mysql
  
(integer) 3
  
10.0.0.16:6379> GET db
  
(error) WRONGTYPE Operation against a key holding the wrong kind of value
2.2.5 GETRANGE
  GETRANGE key start end
  返回 key 中字符串值的子字符串,字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)。
  负数偏移量表示从字符串最后开始计数, -1 表示最后一个字符, -2 表示倒数第二个,以此类推。
  GETRANGE 通过保证子字符串的值域(range)不超过实际字符串的值域来处理超出范围的值域请求。
10.0.0.16:6379> SET greeting "hello, my friend"  
OK
  
10.0.0.16:6379> GETRANGE greeting 0 4
  
"hello"
  
10.0.0.16:6379> GETRANGE greeting -1 -5         # GETRANGE greeting -5 -1
  
"riend"
  
10.0.0.16:6379> GETRANGE greeting 0 -1
  
"hello, my friend"
2.2.6 INCR
  INCR key
  将 key 中储存的数字值增一。
  如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
  如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
  本操作的值限制在 64 位(bit)有符号数字表示之内。
10.0.0.16:6379> SET page_view 20  
OK
  
10.0.0.16:6379> INCR page_view
  
(integer) 21
  
10.0.0.16:6379> INCR page_view
  
(integer) 22
  
10.0.0.16:6379> GET page_view
  
"22"
2.2.7 INCRBY
  INCRBY key increment
  将 key 所储存的值加上增量 increment 。
  如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCRBY 命令。
  如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
  本操作的值限制在 64 位(bit)有符号数字表示之内。
10.0.0.16:6379> SET rank 50  
OK
  
10.0.0.16:6379> INCRBY rank 20
  
(integer) 70
  
10.0.0.16:6379> GET rank
  
"70"
  
10.0.0.16:6379> EXISTS counter
  
(integer) 0
  
10.0.0.16:6379> INCRBY counter 20
  
(integer) 20
  
10.0.0.16:6379> GET counter
  
"20"
  
10.0.0.16:6379> SET book "long long ago..."
  
OK
  
10.0.0.16:6379> INCRBY book 20
  
(error) ERR value is not an integer or out of range
2.2.8 MGET
  MGET key [key ...]
  返回所有(一个或多个)给定 key 的值。
  如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。因此,该命令永不失败。
10.0.0.16:6379> SET redis redis.com  
OK
  
10.0.0.16:6379> SET mongodb mongodb.org
  
OK
  
10.0.0.16:6379> MGET redis mongodb
  
1) "redis.com"
  
2) "mongodb.org"
  
10.0.0.16:6379> MGET redis mongodb mysql
  
1) "redis.com"
  
2) "mongodb.org"
  
3) (nil)
2.2.9 MSET
  MSET key value [key value ...]
  同时设置一个或多个 key-value 对。
  如果某个给定 key 已经存在,那么 MSET 会用新值覆盖原来的旧值,如果这不是你所希望的效果,请考虑使用 MSETNX 命令:它只会在所有给定 key 都不存在的情况下进行设置操作。
  MSET 是一个原子性(atomic)操作,所有给定 key 都会在同一时间内被设置,某些给定 key 被更新而另一些给定 key 没有改变的情况,不可能发生。
10.0.0.16:6379> MSET date "2012.3.30" time "11:00 a.m." weather "sunny"  
OK
  
10.0.0.16:6379> MGET date time weather
  
1) "2012.3.30"
  
2) "11:00 a.m."
  
3) "sunny"
  
10.0.0.16:6379> SET google "google.hk"
  
OK
  
10.0.0.16:6379> MSET google "google.com"
  
OK
  
10.0.0.16:6379> GET google
  
"google.com"
2.2.10 STRING
  STRLEN key
  返回 key 所储存的字符串值的长度。
  当 key 储存的不是字符串值时,返回一个错误。
10.0.0.16:6379> SET mykey "Hello World"  
OK
  
10.0.0.16:6379> STRLEN mykey
  
(integer) 11
  
10.0.0.16:6379> STRLEN nonexisting
  
(integer) 0
2.3 针对Hash
  命令
  命令说明
  HDEL
  删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略
  HEXISTS
  查看哈希表 key 中,给定域 field 是否存在
  HGET
  返回哈希表 key 中给定域 field 的值
  HGETALL
  返回哈希表 key 中,所有的域和值。
  HINCRBY
  为哈希表 key 中的域 field 的值加上增量 increment
  HKEYS
  返回哈希表 key 中的所有域
  HMGET
  返回哈希表 key 中,一个或多个给定域的值
  HMSET
  同时将多个 field-value (域-值)对设置到哈希表 key 中
  HSET
  将哈希表 key 中的域 field 的值设为 value
  HSETNX
  将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在
  HVALS
  返回哈希表 key 中所有域的值
2.3.1 HDEL
  HDEL key field [field ...]
  删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
10.0.0.16:6379> HMSET abbr a apple b banana c cat d dog  
OK
  
10.0.0.16:6379> HGETALL abbr
  
1) "a"
  
2) "apple"
  
3) "b"
  
4) "banana"
  
5) "c"
  
6) "cat"
  
7) "d"
  
8) "dog"
  
10.0.0.16:6379> HDEL abbr a
  
(integer) 1
  
10.0.0.16:6379> HDEL abbr not-exists-field
  
(integer) 0
  
10.0.0.16:6379> HDEL abbr b c
  
(integer) 2
  
10.0.0.16:6379> HGETALL abbr
  
1) "d"
  
2) "dog"
2.3.2 HEXISTS
  HEXISTS key field
  查看哈希表 key 中,给定域 field 是否存在。
10.0.0.16:6379> HEXISTS phone myphone  
(integer) 0
  
10.0.0.16:6379> HSET phone myphone nokia-1110
  
(integer) 1
  
10.0.0.16:6379> HEXISTS phone myphone
  
(integer) 1
2.3.3 HGET
  HGET key field
  返回哈希表 key 中给定域 field 的值。
10.0.0.16:6379> HSET site redis redis.com  
(integer) 1
  
10.0.0.16:6379> HGET site redis
  
"redis.com"
  
10.0.0.16:6379> HGET site mysql
  
(nil)
2.3.4 HGETALL
  HGETALL key
  返回哈希表 key 中,所有的域和值。
  在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。
10.0.0.16:6379> HMSET people jacak "Jack Sparrow" gump "Forrest Gump"  
OK
  
10.0.0.16:6379> HGETALL people
  
1) "jacak"
  
2) "Jack Sparrow"
  
3) "gump"
  
4) "Forrest Gump"
2.3.5 HINCRBY
  HINCRBY key field increment
  为哈希表 key 中的域 field 的值加上增量 increment 。
  增量也可以为负数,相当于对给定域进行减法操作。
  如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。
  如果域 field 不存在,那么在执行命令前,域的值被初始化为 0 。
  对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误。
  本操作的值被限制在 64 位(bit)有符号数字表示之内。
# increment 为正数  
redis> HEXISTS counter page_view    # 对空域进行设置
  
(integer) 0
  
redis> HINCRBY counter page_view 200
  
(integer) 200
  
redis> HGET counter page_view
  
"200"
  
# increment 为负数
  
redis> HGET counter page_view
  
"200"
  
redis> HINCRBY counter page_view -50
  
(integer) 150
  
redis> HGET counter page_view
  
"150"
  
# 尝试对字符串值的域执行HINCRBY命令
  
redis> HSET myhash string hello,world       # 设定一个字符串值
  
(integer) 1
  
redis> HGET myhash string
  
"hello,world"
  
redis> HINCRBY myhash string 1              # 命令执行失败,错误。
  
(error) ERR hash value is not an integer
  
redis> HGET myhash string                   # 原值不变
  
"hello,world"
2.3.6 HKEYS
  HKEYS key
  返回哈希表 key 中的所有域。
# 哈希表非空  
redis> HMSET website google www.google.com yahoo www.yahoo.com
  
OK
  
redis> HKEYS website
  
1) "google"
  
2) "yahoo"
  

  
# 空哈希表/key不存在
  
redis> EXISTS fake_key
  
(integer) 0
  
redis> HKEYS fake_key
  
(empty list or set)
2.3.7 HMGET
  HMGET key field [field ...]
  返回哈希表 key 中,一个或多个给定域的值。
  如果给定的域不存在于哈希表,那么返回一个 nil 值。
  因为不存在的 key 被当作一个空哈希表来处理,所以对一个不存在的 key 进行 HMGET 操作将返回一个只带有 nil 值的表。
redis> HMSET pet dog "doudou" cat "nounou"    # 一次设置多个域  
OK
  

  
redis> HMGET pet dog cat fake_pet             # 返回值的顺序和传入参数的顺序一样
  
1) "doudou"
  
2) "nounou"
  
3) (nil)                                      # 不存在的域返回nil值
2.3.8 HMSET
  HMSET key field value [field value ...]
  同时将多个 field-value (域-值)对设置到哈希表 key 中。
  此命令会覆盖哈希表中已存在的域。
  如果 key 不存在,一个空哈希表被创建并执行 HMSET 操作。
redis> HMSET website google www.google.com yahoo www.yahoo.com  
OK
  

  
redis> HGET website google
  
"www.google.com"
  

  
redis> HGET website yahoo
  
www.yahoo.com
2.3.9 HSET
  HSET key field value
  将哈希表 key 中的域 field 的值设为 value 。
  如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。
  如果域 field 已经存在于哈希表中,旧值将被覆盖。
redis> HSET website google "www.g.cn"       # 设置一个新域  
(integer) 1
  

  
redis> HSET website google "www.google.com" # 覆盖一个旧域
  
(integer) 0
2.3.10 HVALS
  HVALS key
  返回哈希表 key 中所有域的值。
# 非空哈希表  
redis> HMSET website google www.google.com yahoo www.yahoo.com
  
OK
  
redis> HVALS website
  
1) "www.google.com"
  
2) "www.yahoo.com"
  

  
# 空哈希表/不存在的key
  
redis> EXISTS not_exists
  
(integer) 0
  
redis> HVALS not_exists
  
(empty list or set)
2.4 针对List
  命令
  命令说明
  LINDEX
  返回列表 key 中,下标为 index 的元素
  LINSERT
  将值 value 插入到列表 key 当中,位于值 pivot 之前或之后
  LPOP
  移除并返回列表 key 的头元素
  LPUSH
  将一个或多个值 value 插入到列表 key 的表头
  RPOP
  移除并返回列表 key 的尾元素
  RPUSH
  将一个或多个值 value 插入到列表 key 的表尾(最右边)
2.4.1 LINDEX
  LINDEX key index
  返回列表 key 中,下标为 index 的元素。
  下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
  你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
  如果 key 不是列表类型,返回一个错误。
redis> LPUSH mylist "World"  
(integer) 1
  
redis> LPUSH mylist "Hello"
  
(integer) 2
  
redis> LINDEX mylist 0
  
"Hello"
  
redis> LINDEX mylist -1
  
"World"
  
redis> LINDEX mylist 3        # index不在 mylist 的区间范围内
  
(nil)
2.4.2 LINSERT
  LINSERT key BEFORE|AFTER pivot value
  将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
  当 pivot 不存在于列表 key 时,不执行任何操作。
  当 key 不存在时, key 被视为空列表,不执行任何操作。
  如果 key 不是列表类型,返回一个错误。
redis> RPUSH mylist "Hello"  
(integer) 1
  
redis> RPUSH mylist "World"
  
(integer) 2
  
redis> LINSERT mylist BEFORE "World" "There"
  
(integer) 3
  
redis> LRANGE mylist 0 -1
  
1) "Hello"
  
2) "There"
  
3) "World"
  

  
# 对一个非空列表插入,查找一个不存在的 pivot
  
redis> LINSERT mylist BEFORE "go" "let's"
  
(integer) -1                                    # 失败
  

  
# 对一个空列表执行 LINSERT 命令
  
redis> EXISTS fake_list
  
(integer) 0
  
redis> LINSERT fake_list BEFORE "nono" "gogogog"
  
(integer) 0                                      # 失败
2.4.3 LPOP
  LPOP key
  移除并返回列表 key 的头元素。
redis> LLEN course  
(integer) 0
  
redis> RPUSH course algorithm001
  
(integer) 1
  
redis> RPUSH course c++101
  
(integer) 2
  
redis> LPOP course  # 移除头元素
  
"algorithm001"
2.4.4 LPUSH
  LPUSH key value [value ...]
  将一个或多个值 value 插入到列表 key 的表头
  如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头: 比如说,对空列表 mylist 执行命令 LPUSH mylist a b c ,列表的值将是 c b a ,这等同于原子性地执行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三个命令。
  如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。
  当 key 存在但不是列表类型时,返回一个错误。
# 加入单个元素  
redis> LPUSH languages python
  
(integer) 1
  

  
# 加入重复元素
  
redis> LPUSH languages python
  
(integer) 2
  
redis> LRANGE languages 0 -1     # 列表允许重复元素
  
1) "python"
  
2) "python"
  

  
# 加入多个元素
  
redis> LPUSH mylist a b c
  
(integer) 3
  
redis> LRANGE mylist 0 -1
  
1) "c"
  
2) "b"
  
3) "a"
2.4.5 RPOP
  RPOP key
  移除并返回列表 key 的尾元素。
redis> RPUSH mylist "one"  
(integer) 1
  
redis> RPUSH mylist "two"
  
(integer) 2
  
redis> RPUSH mylist "three"
  
(integer) 3
  
redis> RPOP mylist           # 返回被弹出的元素
  
"three"
  
redis> LRANGE mylist 0 -1    # 列表剩下的元素
  
1) "one"
  
2) "two"
2.4.6 RPUSH
  RPUSH key value [value ...]
  将一个或多个值 value 插入到列表 key 的表尾(最右边)。
  如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表尾:比如对一个空列表 mylist 执行 RPUSH mylist a b c ,得出的结果列表为 a b c ,等同于执行命令 RPUSH mylist a 、 RPUSH mylist b 、 RPUSH mylist c 。
  如果 key 不存在,一个空列表会被创建并执行 RPUSH 操作。
  当 key 存在但不是列表类型时,返回一个错误。
# 添加单个元素  
redis> RPUSH languages c
  
(integer) 1
  
# 添加重复元素
  
redis> RPUSH languages c
  
(integer) 2
  
redis> LRANGE languages 0 -1 # 列表允许重复元素
  
1) "c"
  
2) "c"
  
# 添加多个元素
  
redis> RPUSH mylist a b c
  
(integer) 3
  
redis> LRANGE mylist 0 -1
  
1) "a"
  
2) "b"
  
3) "c"
2.5 针对SET
  命令
  命令说明
  SADD
  将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略
  SCARD
  返回集合 key 的基数(集合中元素的数量)
  SDIFF
  返回一个集合的全部成员,该集合是所有给定集合之间的差集
  SISMEMBER
  判断 member 元素是否集合 key 的成员
  SMEMBERS
  返回集合 key 中的所有成员
  SMOVE
  将 member 元素从 source 集合移动到 destination 集合
  SREM
  移除集合中的一个或多个 member 元素,不存在的 member 元素会被忽略
  SUNION
  返回一个集合的全部成员,该集合是所有给定集合的并集
2.5.1 SADD
  SADD key member [member ...]
  将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
  假如 key 不存在,则创建一个只包含 member 元素作成员的集合。
  当 key 不是集合类型时,返回一个错误。
# 添加单个元素  
redis> SADD bbs "discuz.net"
  
(integer) 1
  

  
# 添加重复元素
  
redis> SADD bbs "discuz.net"
  
(integer) 0
  

  
# 添加多个元素
  
redis> SADD bbs "tianya.cn" "groups.google.com"
  
(integer) 2
  
redis> SMEMBERS bbs
  
1) "discuz.net"
  
2) "groups.google.com"
  
3) "tianya.cn"
2.5.2 SCARD
  SCARD key
  返回集合 key 的基数(集合中元素的数量)。
redis> SADD tool pc printer phone  
(integer) 3
  
redis> SCARD tool   # 非空集合
  
(integer) 3
  
redis> DEL tool
  
(integer) 1
  
redis> SCARD tool   # 空集合
  
(integer) 0
2.5.3 SDIFF
  SDIFF key [key ...]
  返回一个集合的全部成员,该集合是所有给定集合之间的差集。
  不存在的 key 被视为空集。
redis> SMEMBERS peter's_movies  
1) "bet man"
  
2) "start war"
  
3) "2012"
  
redis> SMEMBERS joe's_movies
  
1) "hi, lady"
  
2) "Fast Five"
  
3) "2012"
  
redis> SDIFF peter's_movies joe's_movies
  
1) "bet man"
  
2) "start war"
2.5.4 SISMEMBER
  SISMEMBER key member
  判断 member 元素是否集合 key 的成员。
  如果 member 元素是集合的成员,返回 1 。
  如果 member 元素不是集合的成员,或 key 不存在,返回 0 。
redis> SMEMBERS joe's_movies  
1) "hi, lady"
  
2) "Fast Five"
  
3) "2012"
  
redis> SISMEMBER joe's_movies "bet man"
  
(integer) 0
  
redis> SISMEMBER joe's_movies "Fast Five"
  
(integer) 1
2.5.5 SMEMBERS
  SMEMBERS key
  返回集合 key 中的所有成员。
  不存在的 key 被视为空集合。
# key 不存在或集合为空  
redis> EXISTS not_exists_key
  
(integer) 0
  
redis> SMEMBERS not_exists_key
  
(empty list or set)
  

  
# 非空集合
  
redis> SADD language Ruby Python Clojure
  
(integer) 3
  
redis> SMEMBERS language
  
1) "Python"
  
2) "Ruby"
  
3) "Clojure"
2.5.6 SMOVE
  SMOVE source destination member
  将 member 元素从 source 集合移动到 destination 集合。
  SMOVE 是原子性操作。
  如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。
  当 destination 集合已经包含 member 元素时, SMOVE 命令只是简单地将 source 集合中的 member 元素删除。
  当 source 或 destination 不是集合类型时,返回一个错误。
redis> SMEMBERS songs  
1) "Billie Jean"
  
2) "Believe Me"
  
redis> SMEMBERS my_songs
  
(empty list or set)
  
redis> SMOVE songs my_songs "Believe Me"
  
(integer) 1
  
redis> SMEMBERS songs
  
1) "Billie Jean"
  
redis> SMEMBERS my_songs
  
1)  "Believe Me"
2.5.7 SREM
  SREM key member [member ...]
  移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。
  当 key 不是集合类型,返回一个错误。
# 测试数据  
redis> SMEMBERS languages
  
1) "c"
  
2) "lisp"
  
3) "python"
  
4) "ruby"
  
# 移除单个元素
  
redis> SREM languages ruby
  
(integer) 1
  

  
# 移除不存在元素
  
redis> SREM languages non-exists-language
  
(integer) 0
  

  
# 移除多个元素
  
redis> SREM languages lisp python c
  
(integer) 3
  
redis> SMEMBERS languages
  
(empty list or set)
2.5.8 SUNION
  SUNION key [key ...]
  返回一个集合的全部成员,该集合是所有给定集合的并集。
  不存在的 key 被视为空集。
redis> SMEMBERS songs  
1) "Billie Jean"
  

  
redis> SMEMBERS my_songs
  
1) "Believe Me"
  

  
redis> SUNION songs my_songs
  
1) "Billie Jean"
  
2) "Believe Me"
  详细命令列表请查看官方帮助文档:https://redis.io/commands



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-629899-1-1.html 上篇帖子: Redis(二)、数据的持久化 下篇帖子: Redis(四)、Redis数据库主从复制
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表