zoukankan      html  css  js  c++  java
  • 02 Redis数据结构基础

    一.客户端命令行参数

    • 1.-x 从标准输入读取一个参数,等价于set k v
    [root@localhost etc]# echo -en 'v1'|redis-cli -a foobared -x set k1
    OK
    [root@localhost etc]# redis-cli -a foobared get k1
    "v1"
    
    • 2.-r 重复执行一个命令指定次数
    [root@localhost etc]# redis-cli -a foobared -r 2 get k1
    "v1"
    "v1"
    
    • 3.-i 命令执行间隔
    [root@localhost etc]# redis-cli -a foobared -r 2 -i 3 get k1
    "v1"
    "v1"
    
    • 4.-rdb 获取指定实例的rdb文件,保存到本地
    [root@localhost etc]# redis-cli -a foobared --rdb /tmp/6379.rdb
    SYNC sent to master, writing 263 bytes to '/tmp/6379.rdb'
    Transfer finished with success.
    [root@localhost etc]# ls -l /tmp/6379.rdb
    -rw-r--r--. 1 root root 263 Jun 14 13:34 /tmp/6379.rdb
    
    • 5.-scan-pattern 用scan命令扫描redis中的key,pattern是匹配模式,相比keys pattern模式好处在于不会长时间阻塞redis而导致其他客户端命令请求被阻塞
    [root@localhost etc]# redis-cli -a foobared --scan --pattern '*1'
    k1
    [root@localhost etc]# redis-cli -a foobared --scan --pattern '*1*'
    k10
    k1
    [root@localhost etc]# redis-cli -a foobared --scan --pattern 'k*' 
    k10
    k2
    k1
    
    • 6.连接参数
    redis-cli -a password -h hostname/IP -p port
    redis-cli -s socketfile
    
    • 7.socket参数默认不开启unixsocket /tmp/redis.sock,且同样需要输入密码
    [root@localhost tmp]# redis-cli -s /tmp/redis.sock
    redis /tmp/redis.sock> 
    redis /tmp/redis.sock> keys k1
    (error) NOAUTH Authentication required.
    redis /tmp/redis.sock> auth foobared
    OK
    redis /tmp/redis.sock> keys *
    1) "k10"
    2) "bit"
    3) "k1"
    4) "k2"
    
    • 8.-stat 获取redis诊断数据
    [root@localhost tmp]# redis-cli -a foobared --stat
    ------- data ------ --------------------- load -------------------- - child -
    keys       mem      clients blocked requests            connections  #        
    308087     28.90M   51      0       308649 (+0)         58          
    432618     37.45M   51      0       433641 (+124992)    58          
    552107     53.65M   51      0       553683 (+120042)    58          
    673106     57.96M   51      0       675476 (+121793)    58          
    797567     66.51M   51      0       800856 (+125380)    58          
    921655     75.03M   51      0       925951 (+125095)    58          
    995100     77.12M   1       0       1000101 (+74150)    58          
    995100     77.12M   1       0       1000102 (+1)        58          
    995100     77.12M   1       0       1000103 (+1)        58          
    995100     77.12M   1       0       1000104 (+1)        58          
    1004507    80.71M   51      0       1009652 (+9548)     108         
    1119911    104.64M  51      0       1126280 (+116628)   108         
    1227279    112.01M  51      0       1234913 (+108633)   108          # 
    
    > `redis-benchmark -a foobared -h 127.0.0.1 -p 6379 -t set -n 1000000 -r 100000000`
    
    • 9.-bigkeys 对redis中的key进行采样,寻找较大的keys,根据采样得出大概的数据统计
    [root@localhost bin]# redis-cli -a foobared --bigkeys
    #
    # Scanning the entire keyspace to find biggest keys as well as
    # average sizes per key type.  You can use -i 0.1 to sleep 0.1 sec
    # per 100 SCAN commands (not usually needed).
    #
    [00.00%] Biggest string found so far 'key:000036007278' with 3 bytes
    [50.49%] Sampled 1000000 keys so far
    [51.97%] Biggest string found so far 'bit' with 1261 bytes
    #
    -------- summary -------
    #
    Sampled 1980449 keys in the keyspace!
    Total key length in bytes is 31687130 (avg len 16.00)
    #
    Biggest string found 'bit' has 1261 bytes
    #
    1980449 strings with 5942603 bytes (100.00% of keys, avg size 3.00)
    0 lists with 0 items (00.00% of keys, avg size 0.00)
    0 sets with 0 members (00.00% of keys, avg size 0.00)
    0 hashs with 0 fields (00.00% of keys, avg size 0.00)
    0 zsets with 0 members (00.00% of keys, avg size 0.00)
    
    • 10.-latency 获取命令的请求响应延迟时间,单位是毫秒
    [root@localhost bin]# redis-cli -a foobared --latency
    min: 0, max: 16, avg: 1.31 (5697 samples)
    

    二.数据结构类型

    • key:只有string类型

    • values:string、set、list、hash、zset

      结构类型 结构存储的值 结构的读写能力
      string 字符串、整数、浮点数、任何二进制格式的数据 对整字符串和部分进行操作,对整数和浮点数执行自增或者自建操作
      list 一个链表,链表的每个字节都包含一个字符串 链表两端推出或弹出元素;根据偏移量对链表进行修剪;读取单个或者多个元素;根据值查找或者移除元素
      set 包含字符串的无序收集器,每个字符串不重复 添加、获取、移除单个元素;检查一个元素是否存在;计算交、并、差集;从集合中随机取元素
      hash 包含键值对的无序散列表 添加、获取、移除多个键值对;获取所有键值对
      zset 字符串成员member与浮点数分值score之间的有序映射,元素的排序有分值大小决定 获取、添加、移除单个元素;根据分值范围或者成员来获取元素
    1.string
    1.1 SET key value [EX seconds] [PX milliseconds] [NX|XX]
    • EX 代表设置超时时间,单位为秒
    • PX 代表设置超时时间,单位为毫秒
    • NX 代表只有key不存在才设置值
    • XX 代表只有key存在才更新值
    • 如果成功,返回ok,失败则返回nil
    127.0.0.1:6379> set kk1 vv1 EX 2
    OK
    127.0.0.1:6379> get kk1
    "vv1"
    127.0.0.1:6379> get kk1
    (nil)
    127.0.0.1:6379> set kk1 vv1 PX 2000
    OK
    127.0.0.1:6379> get kk1
    "vv1"
    127.0.0.1:6379> get kk1
    (nil)
    127.0.0.1:6379> set kk1 100 NX
    OK
    127.0.0.1:6379> get kk1
    "100"
    127.0.0.1:6379> set kk2 100 XX
    (nil)
    127.0.0.1:6379> set kk1 200 XX
    OK
    127.0.0.1:6379> get kk1
    "200"
    127.0.0.1:6379> set kk1 300 NX
    (nil)
    
    1.2 MGET KEY1 KEY2...
    • 返回指定的key的值,如果key不存在则返回这个key的值为nil
    • 返回指定key的值列表
    127.0.0.1:6379> mget k1 kk1
    1) "v1"
    2) "200"
    127.0.0.1:6379> mget k1
    1) "v1"
    127.0.0.1:6379> mget k1 kk1 kk2
    1) "v1"
    2) "200"
    3) (nil)
    
    1.3 MSET KEY1 VALUE1 KEY2 VALUE2 ...
    • 设置多个k/v,如果某个key已经存在,则被覆盖
    • 原子性操作
    • 不想覆盖现有值,用msetnx
    • 总是返回ok,此操作不会失败
    127.0.0.1:6379> mset k1 v1 k2 v2
    OK
    127.0.0.1:6379> mget k1 k2
    1) "v1"
    2) "v2"
    127.0.0.1:6379> mset k1 v1 k2 v2 k3
    (error) ERR wrong number of arguments for MSET
    
    1.4 MSETNX k1 v1 k2 v2...
    • 只要一个k存在,结果失败
    • 返回1表示成功,0表示失败
    127.0.0.1:6379> mset k2 v2 k3 v3
    OK
    127.0.0.1:6379> msetnx k3 v3 k4 v4
    (integer) 0
    127.0.0.1:6379> msetnx k4 v4 k5 v5
    (integer) 1
    
    1.5 append
    • 如果k存在,并且是string类型,就把新值追加到末尾,相当于字符串拼接
    • 如果k不存在,类似set功能
    • 返回字符长度
    127.0.0.1:6379> get k6
    (nil)
    127.0.0.1:6379> append k6 123
    (integer) 3
    127.0.0.1:6379> get k6
    "123"
    127.0.0.1:6379> append k6 abc
    (integer) 6
    127.0.0.1:6379> get k6
    "123abc"
    
    1.6 incr key
    • 对值进行+1操作,必须是integer类型
    • 最大值为64位有符号值
    • 返回值为加完的结果
    127.0.0.1:6379> mset k1 v1 k2 2.2 k3 3
    OK
    127.0.0.1:6379> incr k1
    (error) ERR value is not an integer or out of range
    127.0.0.1:6379> incr k2
    (error) ERR value is not an integer or out of range
    127.0.0.1:6379> incr k3
    (integer) 4
    
    1.7 decr key
    • 对值减一操作,必须是int类型
    • 如果key不存在,会对key赋值为0,在做操作
    • 上下限为64位有符号值
    • 返回操作后的结果值
    127.0.0.1:6379> mget k1 k2 k3
    1) "v1"
    2) "2.2"
    3) "4"
    127.0.0.1:6379> decr k1
    (error) ERR value is not an integer or out of range
    127.0.0.1:6379> decr k2
    (error) ERR value is not an integer or out of range
    127.0.0.1:6379> decr k3
    (integer) 3
    127.0.0.1:6379> mset k01 -1
    OK
    127.0.0.1:6379> decr k01
    (integer) -2
    127.0.0.1:6379> decr k100
    (integer) -1
    127.0.0.1:6379> get 100
    (nil)
        ```
    
    ###### 1.8 decrby key decrment、incrby key increment
    - 对值进行加减操作,步长为decrement,必须是int
    - 返回操作后的结果
    

    127.0.0.1:6379> mset k1 10 k2 20
    OK
    127.0.0.1:6379> decrby k1 2
    (integer) 8
    127.0.0.1:6379> incrby k2 2
    (integer) 22
    127.0.0.1:6379> mget k1 k2

    1. "8"
    2. "22"
    
    ###### 1.8 incrbyfloat key increment
    - 浮点型加操作,可以是int
    - 返回操作后的结果
    

    127.0.0.1:6379> mset k1 1.1 k2 2.2 k3 3
    OK
    127.0.0.1:6379> incrbyfloat k1 2.2
    "3.3"
    127.0.0.1:6379> decrbyfloat k2 1.1
    (error) ERR unknown command 'decrbyfloat'
    127.0.0.1:6379> incrbyfloat k3 1
    "4"

    
    ###### 1.9 strlen key
    - 对字符串取长
    

    127.0.0.1:6379> strlen k1
    (integer) 3

    
    ###### 1.10 getrange key start end
    - 按索引取子串
    - 索引为负表示末尾取
    

    127.0.0.1:6379> set k1 abcdefg
    OK
    127.0.0.1:6379> getrange k1 0 1
    "ab"
    127.0.0.1:6379> getrange k1 -2 -1
    "fg"

    
    ###### 1.11 get bit key offset
    - 获取一个字符串类型key指定位置的二进制位的值(0/1),索引从0开始
    

    127.0.0.1:6379> get k1
    "abcdefg"
    127.0.0.1:6379> getbit k1 0
    (integer) 0
    127.0.0.1:6379> getbit k1 1
    (integer) 1
    127.0.0.1:6379> getbit k1 2
    (integer) 1
    127.0.0.1:6379> getbit k1 3
    (integer) 0
    127.0.0.1:6379> getbit k1 4
    (integer) 0

    
    ###### 1.12 setbit key offset value
    - 设置字符串类型建指定位置的二进制位的值,返回该位置的旧值
    

    127.0.0.1:6379> setbit k1 0 1
    (integer) 0
    127.0.0.1:6379> getbit k1 0
    (integer) 1
    ```

    1.13 bitcount
    • 取字符串类型键中值时1的二进制位的个数
    127.0.0.1:6379> bitcount k1
    (integer) 27
    127.0.0.1:6379> get k1
    "xe1bcdefg"
    
    2.lists
    2.1 lpush key value ...
    • 把所有值从list的头部插入,如果key不存在就创建一个空的队列
    • 如果key对应的value不是list类型,报错
    • 元素从左往右插入
    • 返回list的长度
    127.0.0.1:6379> get list1
    (nil)
    127.0.0.1:6379> lpush list1 1 2 3 
    (integer) 3
    127.0.0.1:6379> get list1
    (error) WRONGTYPE Operation against a key holding the wrong kind of value
    
    2.2 lpush key value
    • 从list头部插入一个值,key不存在不产生插入动作
    • 返回list的长度
    127.0.0.1:6379> lpush list1 1 2 3 
    (integer) 3
    127.0.0.1:6379> lpush list1 4
    (integer) 4
    
    • 存储顺序如4 3 2 1
    2.3 lpop
    • 弹出一个元素,最左边先弹出
    • 返回被弹出元素
    127.0.0.1:6379> lpop list1
    "4"
    127.0.0.1:6379> lpop list1
    "3"
    127.0.0.1:6379> lpop list1
    "2"
    127.0.0.1:6379> lpop list1
    "1"
    127.0.0.1:6379> lpop list1
    (nil)
    
    2.4 rpop
    • 右边弹出,并返回被弹出元素
    127.0.0.1:6379> lpush list1 1 2 3
    (integer) 3
    127.0.0.1:6379> rpop list1
    "1"
    127.0.0.1:6379> rpop list1
    "2"
    127.0.0.1:6379> rpop list1
    "3"
    127.0.0.1:6379> rpop list1
    (nil)
    
    2.5 blpop key [keyn] timeout / brpop
    • 以阻塞方式从key中弹出并返回第一个值,只弹出和返回第一个非空的key
    127.0.0.1:6379> lpush list1 1 2 3
    (integer) 3
    127.0.0.1:6379> blpop list1 2
    1) "list1"
    2) "3"
    127.0.0.1:6379> blpop list1 list2 2
    1) "list1"
    2) "2"
    
    • timeout 阻塞时长,单位是秒,0表示一直阻塞
    • 只要list的长度为0或者或者key不存在就会则色
    • 当多个key时,如blpop key1 key1,只要有一个key对应的list不是非空,则不会阻塞
    • 返回值依次包含key弹出的值阻塞的时长
    • 超时时,如果没有值可返回,则返回nil
    127.0.0.1:6379> blpop list1 2
    (nil)
    (3.01s)
    127.0.0.1:6379> lpush list1 1 2 3
    (integer) 3
    127.0.0.1:6379> blpop list1 2
    1) "list1"
    2) "3"
    
    2.6 llen key
    • 求列表长度,不存在或者为空,返回0
    127.0.0.1:6379> llen list1
    (integer) 0
    127.0.0.1:6379> lpush list1 1 2 3
    (integer) 3
    127.0.0.1:6379> llen list1
    (integer) 3
        ```
    
    ###### 2.7 rpush key valuen 多值插入
    - 右边插入,插入顺序即所得顺序
    - 返回list长度
    

    127.0.0.1:6379> rpush list1 a b c
    (integer) 6
    127.0.0.1:6379> rpop list1
    "c"
    ```

    2.8 rpush key value 单值插入
    • 右边插入,不存在则不产生动作
    • 返回list长度
    127.0.0.1:6379> rpushx list1 b
    (integer) 6
    127.0.0.1:6379> rpushx list2 a
    (integer) 0
    
    2.9 rpoplpush source destination
    • 原子性操作
    • 从souce尾部/右边移除一个值,并加入到destination指定的头部/左边
    • 如果source的list不存在,则返回nil,不做任何操作
    • 如果soure和destination是一样的,等价于右边移动到左边/尾部移动到头部
    • 返回被弹出和后插入的数据
    127.0.0.1:6379> rpush list1 a b c
    (integer) 3
    127.0.0.1:6379> rpush list2 1 2 3
    (integer) 3
    # 两个列表,分别是
    # list1 a b c
    # list2 1 2 3
    127.0.0.1:6379> rpoplpush list1 list2
    "c"
    # 第一个列表的尾部元素插入第二个列表头部
    # list1 a b
    # list2 c 1 2 3
    127.0.0.1:6379> rpop list2
    "3"
    
    2.10 brpoplpush source destination timeout
    • 当source为空时,将会进行阻塞,timeout为0一直阻塞
    2.11 lindex key index
    • 返回key指定的队列中的位置index的值
    • 0表示第一位,自后一位表示-1
    127.0.0.1:6379> rpop list1
    (nil)
    127.0.0.1:6379> lpush list1 a b c
    (integer) 3
    127.0.0.1:6379> lindex list1 0
    "c"
    127.0.0.1:6379> lindex list1 -1
    "a"
    
    2.12 linsert key before|after pivot value
    • 插入value值在pivot值的前或者后
    • 如果key不存在,不产生动作
    • 如果pivot对应的值不存在则返回-1
    • 否则返回插入后list的长度
    127.0.0.1:6379> linsert list1 before b value1
    (integer) 4
    127.0.0.1:6379> lrange list1 0 3
    1) "c"
    2) "value1"
    3) "b"
    4) "a"
    127.0.0.1:6379> linsert list1 before d value1
    (integer) -1
    
    2.13 lrange key start stop
    • 返回list元素,从左到右
    • 如果start大于stop,返回空
    • 如果stop大于list长度,返回所有元素
    127.0.0.1:6379> lrange list1 3 0
    (empty list or set)
    127.0.0.1:6379> lrange list1 0 100
    1) "c"
    2) "value1"
    3) "b"
    4) "a"
    
    2.14 lrem key count value
    • 删除值等于value的count个元素
    • 如果count大于0,则从头到尾数
    • 如果count小于0,则从尾到头数
    • 如果count等于0,则删除所有值等于value的元素
    127.0.0.1:6379> lpush list5 1 2 2 1 3 5
    (integer) 6
    127.0.0.1:6379> lrange list5 0 100
    1) "5"
    2) "3"
    3) "1"
    4) "2"
    5) "2"
    6) "1"
    127.0.0.1:6379> lrem list5 0 5
    (integer) 1
    127.0.0.1:6379> lrange list5 0 100
    1) "3"
    2) "1"
    3) "2"
    4) "2"
    5) "1"
    127.0.0.1:6379> lrem list5 1 1
    (integer) 1
    127.0.0.1:6379> lrange list5 0 100
    1) "3"
    2) "2"
    3) "2"
    4) "1"
    127.0.0.1:6379> lrem list5 -1 2
    (integer) 1
    127.0.0.1:6379> lrange list5 0 100
    1) "3"
    2) "2"
    3) "1"
    
    2.15 lset key index value
    • 修改key对应的list中,位置为index的元素值为value
    • 当index超过list的长度,将会出错
    127.0.0.1:6379> lrange list5 0 100
    1) "3"
    2) "2"
    3) "1"
    127.0.0.1:6379> lset list5 0 33
    OK
    127.0.0.1:6379> lrange list5 0 100
    1) "33"
    2) "2"
    3) "1"
    127.0.0.1:6379> lset list5 3 33
    (error) ERR index out of range
    
    3.keys
    3.1 del keyn
    • 删除指定key,如果key不存在,操作被忽略
    • 返回被删除的key个数
    127.0.0.1:6379> del list5 list1
    (integer) 2
    127.0.0.1:6379> lrange list5 0 100
    (empty list or set)
    127.0.0.1:6379> set k1 v1
    OK
    127.0.0.1:6379> set k2 v2
    OK
    127.0.0.1:6379> set k3 v3
    OK
    127.0.0.1:6379> del k1
    (integer) 1
    127.0.0.1:6379> del k2 k3
    (integer) 2
    
    3.2 dump key
    • 按照rdb格式把指定key的值序列化返回给客户端,此序列化里面不包括ttl信息
    • 序列化的值中包含校验码
    • 不同版本的rdb可能存在差异
    • key不存在就返回nil
    127.0.0.1:6379> set k1 abcd123
    OK
    127.0.0.1:6379> dump k1
    "x00aabcd123x00x1bxb1xbc|
    Gxdaxeb"
    127.0.0.1:6379> del k1
    (integer) 1
    127.0.0.1:6379> restore k1 10 "x00aabcd123x00x1bxb1xbc|
    Gxdaxeb"
    OK
    127.0.0.1:6379> get k1
    (nil)
    127.0.0.1:6379> get k1
    (nil)
    127.0.0.1:6379> restore k1 0 "x00aabcd123x00x1bxb1xbc|
    Gxdaxeb"
    OK
    127.0.0.1:6379> get k1
    "abcd123"
    
    3.3 restore key ttl serialized-value [REPLACE]
    • 恢复被序列化的key值
    • key已存在,不在replace覆盖属性,会报错
    • 成功返回ok
    127.0.0.1:6379> restore k1 0 "x00aabcd123x00x1bxb1xbc|
    Gxdaxeb"
    (error) BUSYKEY Target key name already exists.
    127.0.0.1:6379> restore k1 0 "x00aabcd123x00x1bxb1xbc|
    Gxdaxeb" replace
    OK
    
    3.3 exists keyn
    • 判断key是否存在,存在则+1
    • 如果key重复,返回值会重复判断和+1
    127.0.0.1:6379> get k1
    "abcd123"
    127.0.0.1:6379> get k2
    (nil)
    127.0.0.1:6379> exists k1
    (integer) 1
    127.0.0.1:6379> exists k1
    (integer) 1
    127.0.0.1:6379> exists k1 k1
    (integer) 2
    127.0.0.1:6379> exists k2
    (integer) 0
    
    3.3 expire key seconds
    • 设置超时时间,单位是秒,达到超时时间后,key被删除
    • 超时属性只能被del、set、getset和*store命令修改或者改变,其他命令不会改变超时属性
    • persist持久化取消超时设置
    • 当key被rename命令修改后,超时属性依然存在
    • 设置成功返回1,key不存在或者超时设置失败返回0
    127.0.0.1:6379> set k1 v1
    OK
    127.0.0.1:6379> set k1 v1 10
    (error) ERR syntax error
    127.0.0.1:6379> expire k1 2
    (integer) 1
    127.0.0.1:6379> get k1
    "v1"
    127.0.0.1:6379> get k1
    (nil)
    127.0.0.1:6379> set k1 v1 5
    (error) ERR syntax error
    127.0.0.1:6379> get k1
    (nil)
    127.0.0.1:6379> set k1 v1
    OK
    127.0.0.1:6379> expire k1 5
    (integer) 1
    127.0.0.1:6379> set k1 v2
    OK
    127.0.0.1:6379> get k1
    "v2"
    127.0.0.1:6379> get k1
    "v2"
    127.0.0.1:6379> get k1
    "v2"
    127.0.0.1:6379> get k1
    "v2"
    127.0.0.1:6379> set k1 v1 
    OK
    127.0.0.1:6379> expire k1 10
    (integer) 1
    127.0.0.1:6379> persist k1
    (integer) 1
    127.0.0.1:6379> get k1
    "v1"
    
    3.4 persist key
    • 持久化key,移除过期时间
    • 1表示成功,0表示key不存在或者key没有设置超时设置
    127.0.0.1:6379> persist k100
    (integer) 0
    127.0.0.1:6379> set k1 v1
    OK
    127.0.0.1:6379> persist k1
    (integer) 0
    
    3.5 expireat key timestamp
    • 设置过期时间为精确时间戳
    • 1表示成功,0表示key不存在或者key没有设置超时设置
    127.0.0.1:6379> set k1 v1
    OK
    127.0.0.1:6379> expireat k1 1528965035
    (integer) 1
    127.0.0.1:6379> get k1
    "v1"
    127.0.0.1:6379> get k1
    "v1"
    # 1528965035 2018-06-14 16:30:35
    127.0.0.1:6379> set k1 v1
    OK
    127.0.0.1:6379> expireat k1 1528965035
    (integer) 1
    127.0.0.1:6379> get k1
    "v1"
    127.0.0.1:6379> get k1
    "v1"
    127.0.0.1:6379> get k1
    "v1"
    127.0.0.1:6379> get k1
    "v1"
    127.0.0.1:6379> get k1
    (nil)
    
    3.6 keys pattern
    • 返回符合匹配key的所有values
    • 会造成阻塞影响性能,可以用scan护着sets代替查找
    • *表示任意字符,?表示单个字符,[ae]代表a或者b
    • [^e]排除e,[a-d]代表a,b,c,d
    127.0.0.1:6379> mset a 1 b 2 c 3 d 4
    OK
    127.0.0.1:6379> keys [a-c]
    1) "a"
    2) "c"
    3) "b"
    (0.58s)
    
    3.7 ttl key
    • 返回生存时间
    • key不存在,返回-2
    • key没有超时设置,返回-1
    127.0.0.1:6379> set k 1 ex 10
    OK
    127.0.0.1:6379> set k2 2
    OK
    127.0.0.1:6379> ttl k
    (integer) 1
    127.0.0.1:6379> ttl k2
    (integer) -1
    127.0.0.1:6379> ttl k3
    (integer) -2
    
    3.8 pttl key
    • 返回的是毫秒生存时间
    127.0.0.1:6379> set k1 v1 EX 100 
    OK
    127.0.0.1:6379> pttl k1
    (integer) 97195
    
    3.9 SCAN cursor [MATCH pattern] [COUNT count]
    • 基于游标方式范湖当前数据的key,因为每次返回的数据不多,也不会阻塞服务器,可以在生产中使用
    • coursor表示游标的位置,一般从0开始,返回数据中的第一行代表的就是下一次游标的位置,当返回的下一行游标是0时,代表本次迭代完成;此游标不是一个连续标准值,比如5,10,15是连续标准
    • MATCH pattern类似keys中的模式一样,返回匹配模式的迭代游标
    • Count代表每次迭代返回的数据条数,默认是10,只是一个提示,实现时并没有严格保证,实际返回的值可能会比这个值多一些,但是不糊多太多
    • 与keys或者smembers命令,scan返回的结果是不稳定的,在执行迭代的过程中,如果key发生变化,不弱删除或者新增,则返回的结果可能存在以下几个问题
      • 可能会返回重复的key,所有使用此命令时,业务系统需要判断重复
      • 如果迭代过程中,有key被删除了,但是迭代完成前没有被添加进来,则此key并不会出现在迭代中
    127.0.0.1:6379> scan 0
    1) "5505024"
    2)  1) "key:000051260311"
        2) "key:000036007278"
        3) "key:000059694484"
        4) "key:000006587804"
        5) "key:000004199401"
        6) "key:000094197164"
        7) "key:000099600200"
        8) "key:000051222239"
        9) "key:000075613120"
       10) "key:000058266859"
       11) "key:000076128079"
    127.0.0.1:6379> scan 10
    1) "1835018"
    2)  1) "key:000075289699"
        2) "key:000078347835"
        3) "key:000071808967"
        4) "key:000066680858"
        5) "key:000020401759"
        6) "key:000087370174"
        7) "key:000089373903"
        8) "key:000094725692"
        9) "key:000077304879"
       10) "key:000019052151"
    127.0.0.1:6379> scan 20
    1) "7077908"
    2)  1) "key:000005041067"
        2) "key:000045121774"
        3) "key:000095755193"
        4) "key:000006008892"
        5) "key:000041833711"
        6) "key:000064230555"
        7) "key:000074550342"
        8) "key:000084491604"
        9) "key:000096452813"
       10) "key:000094200031"
    127.0.0.1:6379> scan  0 count 20
    1) "1179648"
    2)  1) "key:000051260311"
        2) "key:000036007278"
        3) "key:000059694484"
        4) "key:000006587804"
        5) "key:000004199401"
        6) "key:000094197164"
        7) "key:000099600200"
        8) "key:000051222239"
        9) "key:000075613120"
       10) "key:000058266859"
       11) "key:000076128079"
       12) "key:000051853542"
       13) "key:000091156937"
       14) "key:000072767835"
       15) "key:000026187737"
       16) "key:000083167013"
       17) "key:000057492750"
       18) "key:000027269441"
       19) "key:000012211723"
       20) "key:000058915500"
    127.0.0.1:6379> scan 0 match key:00005126031*
    1) "5505024"
    2) 1) "key:000051260311"
    127.0.0.1:6379> scan 0 match 1*
    1) "5505024"
    2) (empty list or set)
    
    4.hashes
    4.1 hset key filed value
    • key代表的是一个hash表,field为hash的表的key,value为hash表中key对应的value
    • 如果key不存在,则创建一个key及对应的hash表
    • 如果field存在,则把value覆盖原来的值
    • 如果field是新加入的,并且设置成功,则返回1
    • 如果field已经存在,成功更新旧值,返回0
    127.0.0.1:6379> hset dict1 name yzw
    (integer) 1
    127.0.0.1:6379> hset dict1 age 40
    (integer) 1
    127.0.0.1:6379> hset dict1 age 18
    (integer) 0
    
    4.2 HMSET key fieldn valuen
    • 1次性设置多个值
    • 成功返回OK
    127.0.0.1:6379> HMSET map1 name yzw age 40
    OK
    
    4.3 HSETNX key field value
    • key代表hash表
    • field代表hash表的key,value代表hash表对应key的value
    • 当field不存在时才设置
    • 如果field不存在,则设置值,返回1
    • 如果field存在,不做任何操作,返回0
    127.0.0.1:6379> hkeys dict1
    1) "name"
    2) "age"
    127.0.0.1:6379> hsetnx dict1 age 18
    (integer) 0
    127.0.0.1:6379> hsetnx dict1 addr gz
    (integer) 1
    127.0.0.1:6379> 
    
    4.4 hkeys key
    • 获取key对应的map的所有key
    • 返回key列表
    127.0.0.1:6379> hkeys dict1
    1) "name"
    2) "age"
    3) "addr"
    
    4.5 hlen key
    • 获取key对应的map的filed数量,也就是字典长度或者元素个数
    127.0.0.1:6379> hlen dict1
    (integer) 3
    
    4.6 hget key field
    • 获取某个field的值
    • 如果key不存在或者field不存在,返回nil,否则返回值
    127.0.0.1:6379> hget dict1 name
    "yzw"
    127.0.0.1:6379> hget dict1 salary
    (nil)
    127.0.0.1:6379> hget ddd name
    (nil)
    
    4.7 hmget key fieldn
    • 返回多个key对应的map值
    • 不存在返回nil
    127.0.0.1:6379> hmget dict1 name age addr salary
    1) "yzw"
    2) "18"
    3) "gz"
    4) (nil)
    
    4.8 hstrlen key field
    • 返回field对应值的长度
    • 不存在返回0
    127.0.0.1:6379> hstrlen dict1 name
    (integer) 3
    127.0.0.1:6379> hstrlen dict1  salary
    (integer) 0
    
    4.9 hdel key fieldn
    • 删除key对应的map的field,可以原子性删除多个
    • 返回删除的值的个数
    127.0.0.1:6379> hdel dict1 addr age
    (integer) 2
    127.0.0.1:6379> hmget dict1 name age addr
    1) "yzw"
    2) (nil)
    3) (nil)
    
    4.10 hexists key field
    • 判断指定map中是否存在对应key
    • 如果key不存在或者filed不存在返回0
    • 否则返回1
    127.0.0.1:6379> hexists dict1 name
    (integer) 1
    127.0.0.1:6379> hexists dict1 age
    (integer) 0
    
    4.11 hgetall key
    • 返回key对应的map的所有k/v对
    127.0.0.1:6379> hgetall dict1
    1) "name"
    2) "yzw"
    
    4.12 hincrby key field increment
    • 对指定field加上increment,必须是int类型,64位有符号数
    • 返回增加后的结果,不存在则加入元素
    127.0.0.1:6379> hgetall dict1
    1) "name"
    2) "yzw"
    3) "age"
    4) "18"
    127.0.0.1:6379> hincrby dict1 age 2
    (integer) 20
    127.0.0.1:6379> hincrby dict1 salary 100
    (integer) 100
    127.0.0.1:6379> hgetall dict1
    1) "name"
    2) "yzw"
    3) "age"
    4) "20"
    5) "salary"
    6) "100"
    
    4.13 hincrbyfloat key field increment
    • 浮点
    127.0.0.1:6379> hset dict1 salary 100.1
    (integer) 0
    127.0.0.1:6379> hgetall dict1
    1) "name"
    2) "yzw"
    3) "age"
    4) "20"
    5) "salary"
    6) "100.1"
    127.0.0.1:6379> hincrbyfloat dict1 salary 1
    "101.1"
    127.0.0.1:6379> hincrbyfloat dict1 salary 0.1
    "101.2"
    
    4.14 hscan key cursor [MATCH pattern] [Count count]
    • 迭代hash里面的value值
    127.0.0.1:6379> hscan dict1 10
    1) "0"
    2) 1) "name"
       2) "yzw"
       3) "age"
       4) "20"
       5) "salary"
       6) "101.2"
    127.0.0.1:6379> hscan dict1 10 MATCH n*
    1) "0"
    2) 1) "name"
       2) "yzw"
    127.0.0.1:6379> hscan dict1 10 MATCH *a*
    1) "0"
    2) 1) "name"
       2) "yzw"
       3) "age"
       4) "20"
       5) "salary"
       6) "101.2"
    127.0.0.1:6379> hscan dict1 10 MATCH *a* COUNT 1
    1) "0"
    2) 1) "name"
       2) "yzw"
       3) "age"
       4) "20"
       5) "salary"
       6) "101.2"
    

    二.举例说明list和hash的应用场景,每个至少一个场景,比如:通过list实现秒杀的请求排队

    1.string
    • 实现MC的功能
    • 对字符串操作
    • 缓存应用k/V,计算数量
    2.list
    • 关注列表、粉丝列表
    • 消息队列
    • 最top内容
    3.hash
    • hash如json,存储非结构化数据
    • 如用户信息
    4.set
    • 去重,分组
    • 如分数 优秀、良好、合格、不合格
    5.zset
    • set内有序排序
  • 相关阅读:
    angular中scope的watch用法
    angular中对于no-repeat的优化——track by
    angular筛选器
    为什么我只贴代码不给你们源码?
    新添子节点却无法被之前的删除功能所删除,处理方法,给删除功能延迟,有好办法记得告诉我下哈,感激不进
    IDEA下Maven项目搭建踩坑记----3.最长的bug,最简单的错误。同一类中,部分函数的@AutoWired注入的对象失效
    IDEA下Maven项目搭建踩坑记----2.项目编译之后 在service层运行时找不到 com.dao.CarDao
    IDEA下Maven项目搭建踩坑记----1.pom,xml文件下${spring-version}不能用
    Myeclipse maven 配置有问题 改之后重启还是不好用
    前端 的一些css的写法
  • 原文地址:https://www.cnblogs.com/jenvid/p/9186601.html
Copyright © 2011-2022 走看看