iMisty的技术栈

iMisty的技术栈

Redis常用命令操作

978
2020-09-04

redis系统级基础命令

info 查看系统信息
可以使用 info ${关注的信息} 来查看当前redis服务的某一方面的信息

    # Server
    redis_version:3.2.100
    redis_git_sha1:00000000
    redis_git_dirty:0
    redis_build_id:dd26f1f93c5130ee
    redis_mode:standalone
    os:Windows
    arch_bits:64
    multiplexing_api:WinSock_IOCP
    process_id:17004   //进程ID
    run_id:4504fcef813ee822421b3cf38c73aa72a45509b4
    tcp_port:6379
    uptime_in_seconds:1320
    uptime_in_days:0
    hz:10
    lru_clock:12587164
    executable:D:\Program Files\Redis\redis-server.exe
    config_file:D:\Program Files\Redis\redis.windows.conf
    # Clients
    connected_clients:2
    client_longest_output_list:0
    client_biggest_input_buf:0
    blocked_clients:0
    # Memory
    used_memory:711320
    used_memory_human:694.65K
    used_memory_rss:673408
    used_memory_rss_human:657.63K
    used_memory_peak:787128
    used_memory_peak_human:768.68K
    total_system_memory:0
    total_system_memory_human:0B
    used_memory_lua:37888
    used_memory_lua_human:37.00K
    maxmemory:0
    maxmemory_human:0B
    maxmemory_policy:noeviction
    mem_fragmentation_ratio:0.95
    mem_allocator:jemalloc-3.6.0
    # Persistence
    loading:0
    rdb_changes_since_last_save:0
    rdb_bgsave_in_progress:0
    rdb_last_save_time:1556090947
    rdb_last_bgsave_status:ok
    rdb_last_bgsave_time_sec:0
    rdb_current_bgsave_time_sec:-1
    aof_enabled:0
    aof_rewrite_in_progress:0
    aof_rewrite_scheduled:0
    aof_last_rewrite_time_sec:-1
    aof_current_rewrite_time_sec:-1
    aof_last_bgrewrite_status:ok
    aof_last_write_status:ok
    # Stats
    total_connections_received:2
    total_commands_processed:14
    instantaneous_ops_per_sec:0
    total_net_input_bytes:338
    total_net_output_bytes:11756156
    instantaneous_input_kbps:0.00
    instantaneous_output_kbps:0.00
    rejected_connections:0
    sync_full:0
    sync_partial_ok:0
    sync_partial_err:0
    expired_keys:0
    evicted_keys:0
    keyspace_hits:4
    keyspace_misses:2
    pubsub_channels:0
    pubsub_patterns:0
    latest_fork_usec:6335
    migrate_cached_sockets:0
    # Replication
    role:master
    connected_slaves:0
    master_repl_offset:0
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    # CPU
    used_cpu_sys:0.16
    used_cpu_user:0.08
    used_cpu_sys_children:0.00
    used_cpu_user_children:0.00
    # Cluster
    cluster_enabled:0
    # Keyspace 当前redis实例的数据库空间
    db0:keys=2,expires=0,avg_ttl=0  //redis启动默认使用第0个空间

配置文件中databases 16代表有16个数据空间(0-15) ,可以使用 select [dbid] 切换空间;通常可以用于测试环境和生产环境的切换

    127.0.0.1:6379> set a c
    OK
    127.0.0.1:6379> select 1
    OK
    127.0.0.1:6379[1]> get a
    (nil)
  • select [dbid] 切换到指定的数据库

  • flushdb 清除当前数据空间(database),慎用

  • flushall 清除所有的数据空间

  • ping 测试连接是否正常

  • keys * 显示当前数据空间下所有的键

  • dbsize 显示当前数据空间下的键值对个数

  • save redis持久化命令

  • quit 退出client连接

  • monitor日志监控命令

Redis键命令

  • set [key] [value] 设置键值对,返回OK显示设置成功
  • del [key] 删除键值对,

(integer) 1 返回受影响的条数,删除不存在的键返回0

  • keys * 显示所有的键

  • 如果为空显示 (empty list or set)

  • exists [key] 查看键是否存在

  • expire [key] [time] 设置key的有效期;可以用于session的有效期

  • expire a 10 设置a的有效期是10秒

  • ttl [key] 查看key的过期时间

  • (integer) -1返回-1代表key没有过期时间

  • 正数表示剩余的有效时间

  • (integer) -2 返回-2代表key不存在

  • type [key] 查看key的类型,若是做动态数据类型的话,可以根据key的类型决定怎么取值

  • key不存在返回none,存在则返回key的类型

    127.0.0.1:6379> set a b
    OK
    127.0.0.1:6379> type a
    string
    127.0.0.1:6379> hset hash name tom
    (integer) 1
    127.0.0.1:6379> type hash
    hash
    127.0.0.1:6379> type name 
    none
    127.0.0.1:6379> keys *
    1) "a"
    2) "b"
    3) "hash"
  • randomkey 随机返回一个已经存在的key

  • rename [old_key] [new_key] 将key 重命名,不会直接校验是否存在

  • 若是key不存在则直接将key更名

  • 若是key已经存在则清除已存在的key,则直接将存在的key对应的值覆盖掉

    127.0.0.1:6379> keys *
    1) "c"
    2) "a"
    3) "b"
    4) "hash"
    127.0.0.1:6379> rename c d  //key不存在的话,直接将当前的值赋值给新key,然后删除
    OK
    127.0.0.1:6379> keys *
    1) "b"
    2) "a"
    3) "hash"
    4) "d"
    127.0.0.1:6379> get d
    "c"
    127.0.0.1:6379> rename b d //key已经存在的情况下,删除当前key,将key对应的值赋值给更名的key
    OK
    127.0.0.1:6379> get d
    "b"

以 nx 结尾的命令一般比较特殊,会有包含判断的逻辑

  • renamenx [old key] [new key] 将key进行更名,若是新的key不存在
    127.0.0.1:6379> renamenx a b
    (integer) 0
    127.0.0.1:6379> get a
    "a"
    127.0.0.1:6379> renamenx a m
    (integer) 1
    127.0.0.1:6379> get a
    (nil)
    127.0.0.1:6379> get m
    "a"

redis数据结构之字符串结构(String)

  • set [key] [value] 设置键值对,实际就是使用的字符串结构

  • setex [key] [time] [value] ex 是expire的缩写,可以设置有效期

  • setex c 100 c 设置c的值是c,有效期是100秒

  • psetex [key] [time] [value]可以设置有效期 ,时间单位是毫秒 例如:psetex d 10000 d 设置d的值是d,有效期是10秒

  • setrange [key] [index] [appendStr] 提供「变量名称」以及开始位置和目标子串,如果key不存在则创建,字符串不足长度 用不可见字符填充补足长度
  • getrange key start_index end_index 返回某个值的截取的范围,两边都是取闭区间
  • append [key] [appendStr] 追加字符串,返回追加之后的长度 例: append a hello 将 字符串hello追加到key为a的值后面
    127.0.0.1:6379> set name myname
    OK
    127.0.0.1:6379> getrange name  0  2
    "myn"
  • getset key value 先get再set,也就是返回前一个值,在设置新的值

  • set 命令只会返回成功(OK)和失败

  • mset key1 value1 key2 value2 key3 value3 同时设置多个key和value

  • mget key1 key2 key3 同时获取多个value

    //mget 对应mset
    127.0.0.1:6379> mset a a b b c c
    OK
    127.0.0.1:6379> mget a b c
    1) "a"
    2) "b"
    3) "c"
  • setnx key value 类似于set命令,但是会进行逻辑判断,只有当key不存在的时候才会set,不然无法设置值

  • strlen key 查看某个字符串的长度

  • msetnx key1 value1 key2 value2 ... 批量设置值,但是会判断值是否存在,只有不存在才会设置

  • 返回0 代表设置失败(全部失败,有点事务的感觉),有事务的原子性,要么全部成功要么全部失败

  • 返回1 代表设置成功

  • set key init-num 设置一个数字类型的初始值,

  • incr key 让一个数字加1 ,相当于 incrby key 1

  • 若是key存在,那么key对应的值必须是数字,不然会出现错误(error) ERR value is not an integer or out of range

  • 直接执行incr key 若是key不存在,则会创建一个值从1开始的键值对

  • incrby key num 让一个值为数字的key增加固定的值 例 : incrby num 100: 让key为num的值增加100

  • decr key 让一个值为数字的key减少1 ,和incr对应,若是不存在,直接创建从-1开始,若是存在且是数字,直接在原有基础上减一

  • decrby key num 让一个值为数字的key减少固定的值

以上数字操作都会返回操作之后的结果

    127.0.0.1:6379> incr A //若是key不存在,则创建一个key为A值为1的键值对
    (integer) 1
    127.0.0.1:6379> get A
    "1"
    127.0.0.1:6379> set num 1
    OK
    127.0.0.1:6379> incr num
    (integer) 2
    127.0.0.1:6379> incr num
    (integer) 3
    127.0.0.1:6379> get num
    "3"
    127.0.0.1:6379> incrby num 100 //让key为num的值增加100
    (integer) 103
    127.0.0.1:6379> decr num
    (integer) 102
    127.0.0.1:6379> decr f
    (integer) -1
    127.0.0.1:6379> decr f
    (integer) -2
    127.0.0.1:6379> decrby num 10
    (integer) 92

redis数据结构之 哈希(hash)

  • hset hash-name key value 为hash赋值,不存在则创建

  • hexists hash-name key 判断hash中的某个键值是否存在

  • hget hash-name key 获取hash中某个key对应的值,若是不存在返回nil

  • hgetall hash-name 获取hash中的所有的key-value

  • hkeys hash-name 获取hash中所有的key

  • hvals hash-name 获取hash中所有的value

  • hlen hash-name 获取键值对的个数,其实也是key的个数

  • hmget hash-name key1 key2 ... 获取hash中的多个key对应的值

  • hmset hash-name key1 value1 key2 value2... 一次设置多个键值对给hash

  • hdel hash-name key1 key2... 删除指定hash中key-value

  • hsetnx hash-name key value 在指定hash表中如果键不存在,将键值对插入hash集合,,添加成功返回1 失败返回0

计数器 hash结构还可以当成计数器来使用,对于内部的每一个key都可以作为独立的计数器。如果value值不是整数,调用hincrby指令会出错。
hincrby books java 2

    127.0.0.1:6379> select 1
    OK
    127.0.0.1:6379[1]> keys *
    (empty list or set)
    127.0.0.1:6379[1]> hset map name zhang
    (integer) 1
    127.0.0.1:6379[1]> keys *
    1) "map"
    127.0.0.1:6379[1]> type map  //查看key对应的值类型
    hash
    127.0.0.1:6379[1]> hexists map name  //查看hash是否存在,存在返回1,不存在返回0
    (integer) 1
    127.0.0.1:6379[1]> hexists map name1 //不存在则返回0
    (integer) 0
    127.0.0.1:6379[1]> keys *
    1) "map"
    127.0.0.1:6379[1]> hget map name //获取hash集合中key为name的值
    "zhang"
    127.0.0.1:6379[1]> hlen map //获取hash长度
    (integer) 2
    
    127.0.0.1:6379[1]> hmget map name age //获取name和age对应的值
    1) "zhang"
    2) "15"
    127.0.0.1:6379[1]> hmset map email az450024285@qq.com sex boy
    OK
    127.0.0.1:6379[1]> hgetall map
    1) "name"
    2) "zhang"
    3) "age"
    4) "15"
    5) "email"
    6) "az450024285@qq.com"
    7) "sex"
    8) "boy"
    127.0.0.1:6379[1]> hlen map
    (integer) 4
    127.0.0.1:6379[1]> hdel map sex
    (integer) 1
    127.0.0.1:6379[1]> hsetnx map name lisi //判断存在与否,添加hash键值对;
    (integer) 0
    127.0.0.1:6379[1]> hsetnx map addr hubei
    (integer) 1

Redis数据结构之链表(List)

  • 类似于Java的list,允许重复值,队列/堆栈链表可以从表头和表尾追加和移除元素,结合使用rpush/rpop/lpush/lpop四条指令,可以将链表作为队列或堆栈使用,左向右向进行都可以

  • lpush list-name value1 value2 value3... 将元素赋值给list,如果list不存在则创建,注意这里是以队列的方式放入,左边先入右边先出

  • llen list-name 查看集合的长度

  • lrange list-name 0 2 获取集合范围的值,两边都是闭区间,但是这个设定的范围可以比实际的范围区间大

  • lset list-name index value 设置指定索引位置的值, 必须要在list范围内,不然(error) ERR index out of range

  • lindex list-name index 获取指定索引位置的元素

  • lpop list-name 移除列表第一个元素

  • rpop list-name 移除列表最后一个元素

  • linsert books before java ruby 对books执行插入操作,在Java元素前面一个位置插入ruby

  • 删除元素 lrem ireader 1 java 列表的删除操作也不是通过指定下标来确定元素的,你需要指定删除的最大个数以及元素的值

在日常使用中链表常常作为异步队列使用

    select 2
    127.0.0.1:6379[2]> lpush list 1 2 3 4 5 6
    (integer) 6
    127.0.0.1:6379[2]> keys *
    1) "list"
    127.0.0.1:6379[2]> type list
    list
    127.0.0.1:6379[2]> llen list
    (integer) 6
    127.0.0.1:6379[2]> lrange list 0 2
    1) "6"
    2) "5"
    3) "4"
    127.0.0.1:6379[2]> lindex list 5
    "1"

redis数据结构之set集合

  • set是无序的集合,可以排除重复

select 3 切换数据空间

  • sadd set-name value1 value2 value3... 添加元素到set,

  • 如果不存在集合则创建

  • 如果存在元素则不会再次添加返回0

  • scard set-name 返回set集合元素的数量

  • smembers set-name 返回集合元素的成员

  • sdiff set1 set2 差集合并,相当于set1-set2,返回set2中没有的元素

  • sinter set1 set2 交集合并 ,返回set1,set2中都有的元素

  • sunion set1 set2 合并两个集合,并且去重

  • srandmember set-name num 返回某个set集合中的一个或者多个随机元素

  • sismember set-name value 判断某个元素是否在集合中,返回1表示在集合中,返回0表示不在集合中

  • srem set-name value1 value2... 移除某个集合中的一个或者多个成员

  • spop set-name 移除一个随机元素 ,并且返回这个元素(被移除的)

  • 适用于高并发的情况,移除并且返回一个元素,例如对订单号的预存,生成不会重复的的订单号,存入,客户端直接取用即可

    127.0.0.1:6379[3]> sadd set a b c d
    (integer) 4
    127.0.0.1:6379[3]> keys *
    1) "set"
    127.0.0.1:6379[3]> type set
    set
    127.0.0.1:6379[3]> sadd set a
    (integer) 0
    127.0.0.1:6379[3]>
    127.0.0.1:6379[3]> scard set
    (integer) 4

redis数据结构之有序集合(sortedset)

  • 具备集合set的特性,添加删除查找的时间复杂度都是O(1),也是通过hash表实现的,但是可以保证有序

  • zadd sortedset-name 100 a 200 b 300 c 添加元素到有序集合中,若是集合不存在则会创建

  • 相当于指定一个优先级,按照这个优先级进行排序,按照分数从小到大进行排序

  • zcard sortedset-name 返回元素个数

  • zscore sortedset-name a返回元素的优先级,也就是元素的分数,不存在的元素返回nilimg

  • zcount sortedset-name score1 score2 返回某一个分数区间的元素个数,分数区间为闭合区间

  • zrank sortedset-name value 返回某一个元素在集合中的索引(也就是排序,位于集合中的第几个元素)

这里注意索引和分数的区别,改变分数会影响排序

  • zincrby sortedset-name add-score-num value 将某个元素的分数提高add-score-num,返回提高后的分数,会影响到元素的索引和排序
- zincrby sortedset 1000 a      将有序集合中的a元素的分数提升1000
- zrank sortedset a             查看a元素当前的索引位置
  • zrange sortedset-name start end 返回某个范围内的所有元素,范围可以比实际的范围大

  • zrange sortedset 0 99 返回sortedset中的前一百个元素 ,两边都是闭区间

  • zrange sortedset-name start end withscores返回某个范围内的全部元素和元素的分数
    img

小确幸

每一丝灵感都值得被记录,每一笔记录都是成长,每一点成长都值得欢呼

博主个人站: www.imisty.cn
CSDN博客: https://blog.csdn.net/lookinthefog
博客园 :https://imist.cnblogs.com/

希望能够认识一些热爱技术的小伙伴,欢迎友链接哟