Key(键)

 Del     语法:DEL  Key [key ...]     删除给定的一个或者多个key  不存在的key会被忽略。

 返回值: 被删粗key的数量# 删除单个 key


redis> SET name huangz
OK redis> DEL name
(integer) 1 # 删除一个不存在的 key redis> EXISTS phone
(integer) 0 redis> DEL phone # 失败,没有 key 被删除
(integer) 0 # 同时删除多个 key redis> SET name "redis"
OK redis> SET type "key-value store"
OK redis> SET website "redis.com"
OK redis> DEL name type website
(integer) 3 DUMP 用于序列化给定key 并返回被序列化的值 redis>dump key_name
redis>set greeting "hello,dumping world!"
redis>dump greeting
"\x00\x15hello, dumping world!\x06\x00E\xa0Z\x82\xd8r\xc1\xde"
redis>dump not-exists-key
(nil) Exists 检查给定key是否存在
时间复杂度O(1)
返回值 若key存在 返回1,否则返回0.
redis>set db "redis"
ok
redis>exists db
(integer) 1
redis>del db
redis>exists db
(integer) 0
EXPIRE   EXPIRE key seconds
为给定key 设置生存时间,当key过期时(生存时间为0 )它会被自动删除。
生存时间可以通过使用 DEL 命令来删除整个 key 来移除,或者被 SET 和 GETSET 命令覆写(overwrite),
这意味着,如果一个命令只是修改(alter)一个带生存时间的 key 的值而不是用一个新的 key 值来代替(replace)它的话,那么生存时间不会被改变。 rename 命令 改名后的key的生存时间和改名前一样。
persist命令 可以在不删除key 情况下 移除key的生存时间,让key重新成为一个持久的key 过期时间精确度 redis2.4版本中 过期时间延迟在1秒内 ---即使key已经过期,但它还是可能在过期一秒之内被访问到。延迟被降低到1毫秒
时间复杂度  O(1)
返回值 设置成功返回1,key不存在或者不能为key设置生存时间时(比如在低于2.13版本的reids中更新key的时间)返回0 redis>set cache_page "www.google.com"
ok
redis> expire cache_page 30 #设置过期时间为30秒
(integer)1
redis>TTL cache_page #查看剩余生存时间
(integer) 23
redis>expire cache_page 3000 #更新过期时间
(integer)1
reids>TTL cache_page
(integer) 2996 EXPIREAT key timestamp expireat的作用和expire 类似 都是用于key 设置生存时间
不同于Expireat 命令接受的时间参数是UNIX 时间戳 时间复杂度 O(1)
返回值 如果生存时间设置成功 返回1
如果key不存在或者没办法设置生存时间 返回0 redis> set cache www.google.com
ok
redis>expirreat cache 1355292000 #这个key将在2012.12.12过期
(interger)1
redis>TTL cache
(interger) 45081860 KEYS
keys pattern 查找所有符合给定模式pattern的key
keys * 匹配数据库中所有key
keys h?llo 匹配hello,hallo 和hxllo等
keys h*llo 匹配hllo 和 heeeello等
keys h[ae]llo 匹配hello 和hallo ,但是不匹配hillo
特殊符号用\隔开 keys 的速度非常快 但在一个大的数据库中使用它仍然可能造成性能问题。如果你需要从一个数据库集中查找特定的key 你最好还是用redis的集合结构set来代替
时间复杂度 O(N)
返回值:符合给定模式的key列表

MIGRATE MIGRATE HOST PORT key destination-db timeout [copy] [replace]
将key 从原子性地当前实例传送到目标实例的指定数据库,一旦传送成功 key保证会出现在目标实例上,而当前实例上的key会被删除
实例:
先启用两个redis实例,一个使用默认的6379端口,一个使用7777端口
用客户端连接6379端口的实例,设置一个键,然后将它迁移到7777端口的实例上:
redis 127.0.0.1:6379>set greeting "Hello from 6379 instance"
ok
redis 127.0.0.1:6379>MIGRATE 127.0.0.1 7777 GREETING 0 1000
OK
redis 127.0.0.1:6379>exists greeting
(integer)0
使用另一个客户端,查看7777端口上的实例:
redis 127.0.0.1:7777>get greeting
Hello from 6379 instance
MOVE  move key db 
将当前数据库的key移动到给定的数据库db当中
如果当前数据库(源数据库)呵呵给定数据库有相同名字的给定key,或者key不存在于当前数据库,那么move没有任何效果
因此,也可以利用这一特性,将move当作锁原语
返回值 移动成功返回1 失败返回0

# key 存在于当前数据库

redis> SELECT 0 # redis默认使用数据库 0,为了清晰起见,这里再显式指定一次。
OK

redis> SET song "secret base - Zone"
OK

redis> MOVE song 1 # 将 song 移动到数据库 1
(integer) 1

redis> EXISTS song # song 已经被移走
(integer) 0

redis> SELECT 1 # 使用数据库 1
OK

redis:1> EXISTS song # 证实 song 被移到了数据库 1 (注意命令提示符变成了"redis:1",表明正在使用数据库 1)
(integer) 1

# 当 key 不存在的时候

redis:1> EXISTS fake_key
(integer) 0

redis:1> MOVE fake_key 0 # 试图从数据库 1 移动一个不存在的 key 到数据库 0,失败
(integer) 0

redis:1> select 0 # 使用数据库0
OK

redis> EXISTS fake_key # 证实 fake_key 不存在
(integer) 0

# 当源数据库和目标数据库有相同的 key 时

redis> SELECT 0 # 使用数据库0
OK
redis> SET favorite_fruit "banana"
OK

redis> SELECT 1 # 使用数据库1
OK
redis:1> SET favorite_fruit "apple"
OK

redis:1> SELECT 0 # 使用数据库0,并试图将 favorite_fruit 移动到数据库 1
OK

redis> MOVE favorite_fruit 1 # 因为两个数据库有相同的 key,MOVE 失败
(integer) 0

redis> GET favorite_fruit # 数据库 0 的 favorite_fruit 没变
"banana"

redis> SELECT 1
OK

redis:1> GET favorite_fruit # 数据库 1 的 favorite_fruit 也是
"apple"

OBJECT   OBJECT SUBCOMMAND [ARGUMENTS [arguments]]

object命令允许从内部察看给定key的redis对象

object命令有多个子命令

object refcount <key> 返回给定key 引用所存储的值次数。此命令用于排错

object encoding <key> 返回给定key锁存储的值 所使用的内部表示

object IDLETIME <KEY> 返回给定key 自存储依赖的空闲时间(idle,没有被读取也没有被写入),一秒为单位。

对象可以以多种方式编码:
字符串可以被编码为 raw (一般字符串)或 int (为了节约内存,Redis 会将字符串表示的 64 位有符号整数编码为整数来进行储存)。
列表可以被编码为 ziplist 或 linkedlist 。 ziplist 是为节约大小较小的列表空间而作的特殊表示。
集合可以被编码为 intset 或者 hashtable 。 intset 是只储存数字的小集合的特殊表示。
哈希表可以编码为 zipmap 或者 hashtable 。 zipmap 是小哈希表的特殊表示。
有序集合可以被编码为 ziplist 或者 skiplist 格式。 ziplist 用于表示小的有序集合,而 skiplist 则用于表示任何大小的有序集合。

REFCOUNT 和 IDLETIME 返回数字。
ENCODING 返回相应的编码类型

redis> SET game "COD" # 设置一个字符串
OK

redis> OBJECT REFCOUNT game # 只有一个引用
(integer) 1

redis> OBJECT IDLETIME game # 等待一阵。。。然后查看空闲时间
(integer) 90

redis> GET game # 提取game, 让它处于活跃(active)状态
"COD"

redis> OBJECT IDLETIME game # 不再处于空闲状态
(integer) 0

redis> OBJECT ENCODING game # 字符串的编码方式
"raw"

redis> SET big-number 23102930128301091820391092019203810281029831092 # 非常长的数字会被编码为字符串
OK

redis> OBJECT ENCODING big-number
"raw"

redis> SET small-number 12345 # 而短的数字则会被编码为整数
OK

redis> OBJECT ENCODING small-number
"int"

persist   persist key 移除给定key的生存时间,将这个key 从易失的 带生存时间key 转换成持久的 一个不带生存时间、永不过期的key

返回值: 当生存时间移除成功时,返回1;

    如果key不存在或者key 没有设置生存时间  返回0;

redis>set mykey "hello"

ok

redis>expire mykey 10 # 为key 设置生存时间

integer 1

redis>TTL mykey

integer 10

redis>persist  mykey # 移除key的生存时间

integer 1

redis>TTL mykey

integer -1

PEXPIREAT KEY milliseconds-timestamp

返回值 :如果生存时间设置成功,返回1.

    当key不存在或者没办法设置生存时间时,返回0

redis> SET mykey "Hello"
OK

redis> PEXPIREAT mykey 1555555555005
(integer) 1

redis> TTL mykey # TTL 返回秒
(integer) 223157079

redis> PTTL mykey # PTTL 返回毫秒
(integer) 223157079318

scan

语法:scan cursor [Match pattern] [count count]

scan 命令及其相关sscan命令 hscan命令和zscan命令都用于增量迭代

scan 命令用于迭代当前数据库中的数据库键

sscan 命令用于迭代集合键中的元素

Hscan 命令用于迭代哈希键中的键值对

zscan 命令用于迭代有序集合中的元素(包括元素成员和元素分值)。

scan命令的基本用法

SCAN 命令是一个基于游标的迭代器(cursor based iterator): SCAN 命令每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。

当 SCAN 命令的游标参数被设置为 0 时, 服务器将开始一次新的迭代, 而当服务器向用户返回值为 0 的游标时, 表示迭代已结束。

scan 命令的迭代过程示例:

redis 127.0.0.1:6379> scan 0
1) "17"
2) 1) "key:12"
2) "key:8"
3) "key:4"
4) "key:14"
5) "key:16"
6) "key:17"
7) "key:15"
8) "key:10"
9) "key:3"
10) "key:7"
11) "key:1"

redis 127.0.0.1:6379> scan 17
1) "0"
2) 1) "key:5"
2) "key:18"
3) "key:0"
4) "key:2"
5) "key:19"
6) "key:13"
7) "key:6"
8) "key:9"
9) "key:11"

在上面这个例子中, 第一次迭代使用 0 作为游标, 表示开始一次新的迭代。

第二次迭代使用的是第一次迭代时返回的游标, 也即是命令回复第一个元素的值 —— 17 。

从上面的示例可以看到, SCAN 命令的回复是一个包含两个元素的数组, 第一个数组元素是用于进行下一次迭代的新游标, 而第二个数组元素则是一个数组, 这个数组中包含了所有被迭代的元素。

在第二次调用 SCAN 命令时, 命令返回了游标 0 , 这表示迭代已经结束, 整个数据集(collection)已经被完整遍历过了。

以 0 作为游标开始一次新的迭代, 一直调用 SCAN 命令, 直到命令返回游标 0 , 我们称这个过程为一次完整遍历(full iteration)

05-28 22:47