02 Redis数据结构基础
Posted 不懂ABAP的python不是好basis
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了02 Redis数据结构基础相关的知识,希望对你有一定的参考价值。
一.客户端命令行参数
1.
-x
从标准输入读取一个参数,等价于set k v[[email protected] etc]# echo -en ‘v1‘|redis-cli -a foobared -x set k1 OK [[email protected] etc]# redis-cli -a foobared get k1 "v1"
2.
-r
重复执行一个命令指定次数[[email protected] etc]# redis-cli -a foobared -r 2 get k1 "v1" "v1"
3.
-i
命令执行间隔[[email protected] etc]# redis-cli -a foobared -r 2 -i 3 get k1 "v1" "v1"
4.
-rdb
获取指定实例的rdb文件,保存到本地[[email protected] etc]# redis-cli -a foobared --rdb /tmp/6379.rdb SYNC sent to master, writing 263 bytes to ‘/tmp/6379.rdb‘ Transfer finished with success. [[email protected] 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而导致其他客户端命令请求被阻塞[[email protected] etc]# redis-cli -a foobared --scan --pattern ‘*1‘ k1 [[email protected] etc]# redis-cli -a foobared --scan --pattern ‘*1*‘ k10 k1 [[email protected] 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
,且同样需要输入密码[[email protected] 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诊断数据[[email protected] 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,根据采样得出大概的数据统计[[email protected] 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
获取命令的请求响应延迟时间,单位是毫秒[[email protected] 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内有序排序
以上是关于02 Redis数据结构基础的主要内容,如果未能解决你的问题,请参考以下文章