美文网首页
redis key类型命令

redis key类型命令

作者: 饱饱想要灵感 | 来源:发表于2023-02-01 11:33 被阅读0次

    key过期总结

    1. 使用del可以删除定时的key
    2. set会删除key的过期设置
    3. getset可以返回并设置值,并删除过期设置
    4. 使用rename修改key名称,但key的过期设置不会删除

    get

    语法:get key

    查看key的值

    keys

    语法:keys pattern

    用来匹配和查看指定的key, pattern为查询条件, 可使用正则匹配

    例子:

    h?llo       匹配 hello, hallo 和 hxllo
    h*llo       匹配 hllo 和 heeeello
    h[ae]llo    匹配 hello 和 hallo, 不匹配如 hillo
    h[^e]llo    匹配 hallo, hbllo, ... 不匹配如 hello
    h[a-e]llo   匹配 hallo 和 hbllo, [a-e]说明是a~e这个范围 ,如hcllo也可以匹配
    # 若想匹配如转义字符的如下,就需要使用 \ 转义你想匹配的特殊字符。
    set na\me baobao
    keys na[\\]me
    

    del

    语法:del key [key ...]

    删除指定的key

    例子:del name age address

    unlink

    语法:unlink key [key ...]

    unlink和删除del命令很像,也是存在key删除,不存在则忽略;删除几个键值,则返回删除的个数
    del和unlink区别:
    del:它是线程阻塞的,当执行del命令是,del在没执行完时,其它后续的命令是无法进入的(要安全就使用del)
    unlink:它不是线程阻塞的,当执行unlink命令时,它会将要删除的键移交给另外线程,然后将当前要删除的键与数据库空间断开连接, 后续则由其它线程异步删除这些键(要效率快就使用unlink)

    例子:unlink name1 name2 name3

    exists

    语法:exists key [key ...]

    返回要查询的key是否存在,存在则返回1,如果设置四个key都存在则会返回4;返回0则代表没有; exists后面不管携带单个还是多个, 甚至重复,都是存在一个就累加1

    例子:

    exists name -- 查看是否存在name的key
    exists name name  -- 重复写两次name ,如果name存在则返回2
    exists name address -- 查看当前是否存在name和address键
    

    type

    语法:type key

    返回当前指定的key的类型。可返回的类型是: string,list,set,zset,hash和stream

    rename

    语法:rename key newkey

    修改key名称,存在原来则覆盖,不存在则抛错;如果修改key1为key2,key2存在,则key1覆盖key2的值

    例子:name name1

    renamenx

    语法:renamenx key newkey

    修改key名称存在则覆盖,不存在则抛错;如果修改key1为key2,key2存在,则key1修改不成功

    randomkey

    语法:randomkey

    随机返回一个key名称

    copy

    语法:copy source destination [db destination-db] [replace]

    拷贝当前某一个key的值,存放到新的key中(可以跨库拷贝)返回 1 成功 0 失败

    例子:

    copy name1 name2  -- 把 name1 的值 拷贝到 name2 里
    copy name1 name2 db 5 -- 把 name1 的值拷贝到第6号数据库name2里
    copy name1 name2 replace -- 把 name1 的值拷贝到name2里,存在则强行覆盖
    

    expire

    语法:expire key seconds [nx|xx|gt|lt]

    为一个存在的key设置过期时间 秒

    pexpire

    语法:pexpire key milliseconds [nx|xx|gt|lt]

    为一个存在的key设置过期时间 毫秒

    expireat

    语法:expireat key timestamp [nx|xx|gt|lt]

    为一个存在的key设置过期时间 格式是uinx时间戳并精确到秒

    pexpireat

    语法:pexpireat key milliseconds-timestamp [nx|xx|gt|lt]

    为一个存在的key设置过期时间 格式是uinx时间戳并精确到毫秒

    例子:

    # 先设置一个key,并指定过期时间 秒/毫秒/时间戳秒/时间戳毫秒 ;返回 1 成功 0 失败
    expire name 300 -- 把name键设置300秒过期
    pexpire name 3000 -- 把name键设置3000毫秒过期(3秒)
    expireat name 1633190400 -- 把name键设置为2021-10-2 00:00:00到期(精确秒)
    pexpireat name 1633190400000 -- 把name键设置为2021-10-2 00:00:00到期(精确毫秒)
    

    persist

    语法:persist key

    清除当前有定时时间的键值,设置永不过期(和普通键值一样),关闭后并不会删除已有的键值

    例子:persist name -- 关闭存在定时的键值

    ttl

    语法:ttl key

    查看当前有定时key的剩余时间,返回秒

    没过期返回剩余时间, 过期了返回-2, 没设置过期时间的key返回-1

    pttl

    语法:pttl key

    查看当前有定时key的剩余时间,返回毫秒

    没过期返回剩余时间, 过期了返回-2, 没设置过期时间的key返回-1

    例子:

    ttl name
    pttl name
    

    move

    语法:move key db

    把指定的键值移动到选定的数据库db当中。如果key在目标数据库中已存在,或者key在源数据库中不存,则key不会被移动。

    例子:move name 2 --把name移动到数据库2

    touch

    语法:touch key [key ...]

    修改指定key的最后访问时间。忽略不存在的 key。(我的理解是这个键被设置/更新成功,并且被放到数据库则是成功,会返回1)

    例子: touch name1 name2 name3 -- 返回被设置成功的键个数

    scan

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

    用于迭代当前数据库中的数据库键
    cursor:游标(告诉迭代器从哪开始迭代)
    [match pattern]:过滤筛选条件
    [count count]:迭代的个数

    需要注意的是count的使用:

    • COUNT 参数的默认值为 10 。
    • 在迭代一个足够大的、由哈希表实现的数据库、集合键、哈希键或者有序集合键时, 如果用户没有使用 MATCH 选项, 那么命令返回的元素数量通常和 COUNT 选项指定的一样, 或者比 COUNT 选项指定的数量稍多一些。
    • 在迭代一个编码为整数集合(intset,一个只由整数值构成的小集合)、 或者编码为压缩列表(ziplist,由不同值构成的一个小哈希或者一个小有序集合)时, 增量式迭代命令通常会无视 COUNT 选项指定的值, 在第一次迭代就将数据集包含的所有元素都返回给用户。

    例子:

    127.0.0.1:6379> keys *
    1) "name8"
    2) "name3"
    3) "name5"
    4) "name1"
    5) "name2"
    6) "name9"
    7) "name7"
    8) "name4"
    9) "name6"
    127.0.0.1:6379> scan 0 match name* count 2
    -- 迭代开始,从游标0开始(开头),筛选带 name* 并且查2个
    -- 执行后,会返回两个键,并且还返回游标现在指向的位置 2 ,那我们下次迭代就可以从 2 开始继续
    1) "2"
    2) 1) "name8"
       2) "name7"
    127.0.0.1:6379> scan 2 match name* count 2
     -- 设置游标从 2 开始 并查询 2 个键
    1) "5"
    2) 1) "name3"
       2) "name2"
       3) "name9"
    

    migrate

    语法:migrate host port key|"" destination-db timeout [copy] [replace] [auth password] [auth2 username password] [keys key [key ...]]

    将key原子性的从当前实例库传送到目标实例的指定数据库上,一旦迁移成功,key会在目标实例上,而当前实例上的key会被删除(默认删除)
    host:设置迁移的IP地址
    port:设置迁移的端口号
    key|"":如果要迁移单个key则可以在这设置key,如果是多个key则在这里只需要设置 "" 在后面设置更多的key
    destination-db:迁移到目标Redis服务器的哪个实例数据库
    timeout:超时时间
    [copy]:设置此属性代表复制迁移,不删除源实例中的key。
    [replace]:强行替换,如果目标数据库存在则更新值,不存在则添加;如果不设置replace则代表对方数据库存在迁移的key则不成功
    [auth password]:请求对方数据库的密码
    [auth2 username password]:请求对方数据库的用户名和密码
    [keys key [key ...]]:如果前面没设置 key为"",则在后面可以设置多个key迁移,如keys aaa bbb ccc

    例子:

    set name zhangsan
    -- 设置一个普通的键值
    migrate 127.0.0.1 6380 name 1 2000
    -- 把name键值迁移到指定IP和端口的Redis服务器上,并且放在2号实例数据库上,超时时间2秒(超时关闭)
    migrate 127.0.0.1 6380 name 0 2000 copy
    -- 和上面一个命令一样,但是不同的是上一个命令成功则删除原始键值,而当前命令加上copy则只是复制到对方数据库
    migrate 127.0.0.1 6380 name 0 2000 copy replace
    -- 加上replace则代表目地数据库存在此键则会强行更新,不存在则添加
    migrate 127.0.0.1 6380 name 0 2000 copy replace auth 1234
    -- 加上密码验证
    migrate 127.0.0.1 6380 "" 0 2000 copy replace auth 1234 name age address
    -- 一次性迁移多个keys
    

    sort

    语法:sort key [by pattern] [limit offset count] [get pattern [get pattern ...]] [asc|desc] [alpha] [store destination]

    sort是用来对list,set或sorted中元素排序;默认是按照数值排序的;并且按照两个元素的双精度浮点数类型值进行比较
    key:排序的key
    [by pattern]:通过引用外部key来排序
    [limit offset count]:分页,limit 2,3 从0开始偏移到第2条数据,并查询3条数据
    [get pattern [get pattern ...]]:获取外部key的值
    [asc|desc]:排序的规则
    [alpha]:当排序的集合中存在字符串则需要使用此属性,按照字典顺序排序;因为默认按照两个元素的双精度浮点数类型值进行比较
    [store destination]:把处理好的结果存放到指定的key容器中

    例子:

    -- 创建两个集合:(后面会说list集合命令)
    lpush listNumber 8.4 13 14 10.5 4 19.6 10 14 5.2 10 3 2.5 7 4.7 10 11.2 8 2.2 15.7 20.9
    lpush listString  remini Momen Pledg Memo Tende Biode Revie silen Romanti AusL Simpl Promis Romanti Bautifu smil Initiall sunse lemo firs Chaffere
    -- 查看添加的命令:
    lrange listNumber 0 -1
    lrange listString 0 -1
    
    -- 基本使用:
    sort listNumber         -- 默认排序是按照双精度浮点数类型从小到大升序
    sort listNumber desc    -- 按照从降序排列
    sort listString alpha   -- 如果排序中包含字符串类型则必须使用 alpha 修饰;则会使用字节排序
    sort listString limit 2 5 alpha     -- 排序并分页,分页从0开始数到2,再从2的位置往后数5个元素
    sort listString  alpha limit 2 5 store newliststring    -- 排序分页,并把排序好的数据存放到另外一个集合中
    
    -- by属性的使用(通过外部key排序):
    lpush mylist 20 15 18
    set n_20 b
    set n_15 a
    set n_18 c
    sort mylist by n_* alpha
    1) "15"
    3) "20"
    5) "18"
    -- 如果使用了by属性,那么sort就会先取出mylist的全部值,也就是20,15,18,
    -- 然后再去跟by里设置的pattern进行组合(n_*,里面的*必须要和mylist的值有个一一对应关系,要不无法组合);
    -- 所以就变为了n_20,n_15,n_18 ,再按照这些拼装出的键里面的值进行排序(默认升序,从小到大);
    -- 这些键排完序规则为
    -- n_15 a
    -- n_20 b
    -- n_18 c
    -- 对应好之后,程序就会按照键后面的权重值来排序,所以最终排序a,b,c起作用,那么反过来推算
    -- n_15代表mylist的15,n_20代表mylist的20,n_18代表mylist的18,
    -- 所以15对应排序的权重a;20对应排序的权重b;18对应排序的权重c;
    
    -- 练习:现在有zhangsan(salary=5200),lisi(salary=3000),wangwu(salary=4500),
    -- mazi(salary=3200)四人,但是他们想比较谁的工资高,该如何设计排序
    lpush names zhangsan lisi wangwu mazi
    set name_zhangsan 5200
    set name_lisi 3000
    set name_wangwu 4500
    set name_mazi 3200
    sort names by name_* desc
    
    -- get是使用则是先加载出mylist,并且再拼装到n_*(一一对应)然后会直接输出那个键的权重(根据mylist里面排序)
    -- get属性使用(获取外部key):
    lpush mylist 20 15 18
    set n_20 b
    set n_15 a
    set n_18 c
    
    -- 1:获取外部key
    127.0.0.1:6379> sort mylist get n_*
    1) "a"
    2) "c"
    3) "b"
    
    -- 2:获取外部key并获取当前结合的集合值
    127.0.0.1:6379> sort mylist get n_* get #
    1) "a"
    2) "15"
    3) "c"
    4) "18"
    5) "b"
    6) "20"
    
    -- 3:如果有多个get也是可以的,会依次匹对返回
    127.0.0.1:6379> sort mylist get n_* get # get nn_* get #
    

    相关文章

      网友评论

          本文标题:redis key类型命令

          本文链接:https://www.haomeiwen.com/subject/ocdihdtx.html