1. 数据类型
-
string
-
hash
-
-
set
-
sortedset/zset
2. 操作命令
2.1 操作 string
2.1.1 string 基础操作
添加/修改数据
语法: set key value 示例: 127.0.0.1:6379> set username zhangsan OK
获取数据
语法: get key 示例: 127.0.0.1:6379> get username "zhangsan"
删除数据
语法: del key 示例: 127.0.0.1:6379> del username (integer) 1
判定性添加数据(key不存在才添加)
语法: setnx key value 示例: 127.0.0.1:6379> setnx username zhangsan (integer) 1 127.0.0.1:6379> setnx username lisi (integer) 0
添加/修改多个数据
语法: mset key1 value1 key2 value2 … 示例: 127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 OK
获取多个数据
语法: mget key1 key2 … 示例: 127.0.0.1:6379> mget k1 k2 k3 1) "v1" 2) "v2" 3) "v3"
获取数据的字符个数(字符串长度)
语法: strlen key 示例: 127.0.0.1:6379> strlen username (integer) 8 127.0.0.1:6379> strlen k1 (integer) 2
追加字符到原始字符串后面(如果原始字符串存在就追加,否则新建)
语法: append key value 示例: 127.0.0.1:6379> append username 1 (integer) 9 127.0.0.1:6379> get username "zhangsan1" 127.0.0.1:6379> append password 123 (integer) 3 127.0.0.1:6379> get password "123"
2.1.2 string 扩展操作
设置整形数值数据自增(默认自增1)
语法: incr key 示例: 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
设置整形数值数据增加指定整数值
语法: incrby key increment 示例: 127.0.0.1:6379> incrby num 10 (integer) 13
设置数据数据增加指定小数值
语法: incrbyfloat key increment 示例: 127.0.0.1:6379> incrbyfloat num 1.5 "14.5"
设置整形数值数据自减(默认自减1)
语法: decr key 示例: 127.0.0.1:6379> set num2 10 OK 127.0.0.1:6379> decr num2 (integer) 9
设置设置整形数值数据减小指定值
语法: decrby key decrement 示例: 127.0.0.1:6379> decrby num2 2 (integer) 7
设置数据的有效时长(支持自动过期)
1.单位为秒 语法: setex key seconds value 示例: 127.0.0.1:6379> setex code 10 abcd OK 10秒内获取 127.0.0.1:6379> get code "abcd" 10秒后获取 127.0.0.1:6379> get code (nil) 2.单位为毫秒 语法: psetex key milliseconds value 使用方式一致,不再演示
2.2 操作 hash
2.2.1 hash 基础操作
添加、修改数据
语法1-添加单个: hset key field value 示例: 127.0.0.1:6379> hset user:001 name zhangsan (integer) 1 语法2-批量添加: hmset key field1 value1 field2 value2 … 示例: 127.0.0.1:6379> hmset user:001 password 123 age 18 OK 语法3-判定性设置field的值,如果该field存在则不做任何操作: hsetnx key field value 示例: 127.0.0.1:6379> hsetnx user:001 name lisi (integer) 0
根据key和field获取单个vlaue
语法: hget key field 示例: 127.0.0.1:6379> hget user:001 name "zhangsan"
根据key获取所有的field和value
语法: hgetall key 示例: 127.0.0.1:6379> hgetall user:001 1) "name" 2) "zhangsan" 3) "password" 4) "123" 5) "age" 6) "18"
删除数据
语法: hdel key field1 [field2 field3...] 示例: 127.0.0.1:6379> hdel user:001 name (integer) 1 127.0.0.1:6379> hdel user:001 password age (integer) 2
根据key获取field的数量
语法: hlen key 示例: 127.0.0.1:6379> hmset user:001 name zhangsan password 123 age 18 OK 127.0.0.1:6379> hlen user:001 (integer) 3
判断指定field是否存在
语法: hexists key field 示例: 127.0.0.1:6379> hexists user:001 name (integer) 1 127.0.0.1:6379> hexists user:001 name111 (integer) 0
2.2.2 hash 扩展操作
根据key获取所有的字段名field
语法: hkeys key 示例: 127.0.0.1:6379> hkeys user:001 1) "name" 2) "password" 3) "age"
根据key获取所有的字段值value
语法: hvals key 示例: 127.0.0.1:6379> hvals user:001 1) "zhangsan" 2) "123" 3) "18"
设置指定字段的数值数据增加指定范围的值
语法: hincrby key field increment hincrbyfloat key field increment 示例: 127.0.0.1:6379> hget user:001 age "18" 127.0.0.1:6379> hincrby user:001 age 1 (integer) 19 127.0.0.1:6379> hincrby user:001 age -2 (integer) 17
2.3 操作list
2.3.1 list 基础操作
添加数据
-
从左侧添加
语法: lpush key value1 [value2 value3...] 示例: 127.0.0.1:6379> lpush list1 a b c (integer) 3
当前数据为: c b a
-
从右侧添加
语法: rpush key value1 [value2 value3...] 示例: 127.0.0.1:6379> rpush list1 d e f (integer) 6
当前数据为: c b a d e f
获取数据
-
范围获取
语法: lrange key start stop 示例1: 127.0.0.1:6379> lrange list1 0 -1 1) "c" 2) "b" 3) "a" 4) "d" 5) "e" 6) "f" 示例2: 127.0.0.1:6379> lrange list1 0 2 1) "c" 2) "b" 3) "a" 示例3: 127.0.0.1:6379> lrange list1 -3 -1 1) "d" 2) "e" 3) "f"
索引规则:
-
从左到右,索引分别为0、1、2、3、4...
如:c(0) b(1) a(2) d(3) e(4) f(5)
-
从右到左,索引分别为 -1、-2、-3、-4...
如:c(-6) b(-5) a(-4) d(-3) e(-2) f(-1)
-
获取指定索引的value
语法: lindex key index 示例: 127.0.0.1:6379> lindex list1 0 "c" 127.0.0.1:6379> lindex list1 1 "b" 127.0.0.1:6379> lindex list1 -1 "f"
-
移除并返回最左侧或最右侧的元素
语法: lpop key rpop key 示例: 127.0.0.1:6379> lpop list1 "c" 127.0.0.1:6379> rpop list1 "f"
-
根据key获取value的个数
语法: llen key 示例: 127.0.0.1:6379> llen list1 (integer) 4
2.3.2 list 扩展操作
删除指定key中指定数量的field
语法: lrem key count value 示例: 127.0.0.1:6379> rpush list2 a b b b b c d d d d (integer) 10 127.0.0.1:6379> lrem list2 4 b (integer) 4 127.0.0.1:6379> lrange list2 0 -1 1) "a" 2) "c" 3) "d" 4) "d" 5) "d" 6) "d" 127.0.0.1:6379> lrem list2 5 d (integer) 4 127.0.0.1:6379> lrange list2 0 -1 1) "a" 2) "c"
规定时间内获取并移除数据
语法: blpop key1 [key2 key3...] timeout brpop key1 [key2 key3...] timeout 示例: 127.0.0.1:6379> lpush a a1 (integer) 1 127.0.0.1:6379> lpush b b1 (integer) 1 127.0.0.1:6379> lpush c c1 (integer) 1 127.0.0.1:6379> blpop a b c 5 1) "a" 2) "a1" 127.0.0.1:6379> blpop a b c 5 1) "b" 2) "b1" 127.0.0.1:6379> blpop a b c 5 1) "c" 2) "c1" 127.0.0.1:6379> blpop a b c 5 (nil) (5.76s)
最后一次没有获取到数据,但是如果在等待的5秒中之内,另一个连接向 a b c 任意一个key中存入了value,则可以获取到数据,操作如下:
-
在当前连接窗口中执行指定时间内获取命令,命令会处于等待状态
127.0.0.1:6379> blpop a b c 20 |
-
打开一个新的客户端窗口,20秒之内在新连接窗口中向a或b或c中存入数据
127.0.0.1:6379> lpush a a1 (integer) 1
-
窗口1会立马获取到最新存入的数据
127.0.0.1:6379> blpop a b c 20 1) "a" 2) "a1" (3.05s)
规定时间内取出一个list的尾部元素并添加到另一个list的头部
语法: brpoplpush source destination timeout source:被移除的list destination:要添加的list 示例: 127.0.0.1:6379> rpush list3 a b c (integer) 3 127.0.0.1:6379> lrange list3 0 -1 1) "a" 2) "b" 3) "c" 127.0.0.1:6379> rpush list4 aa bb cc (integer) 3 127.0.0.1:6379> lrange list4 0 -1 1) "aa" 2) "bb" 3) "cc" 127.0.0.1:6379> brpoplpush list3 list4 10 "c" 127.0.0.1:6379> lrange list3 0 -1 1) "a" 2) "b" 127.0.0.1:6379> lrange list4 0 -1 1) "c" 2) "aa" 3) "bb" 4) "cc"
2.4 操作 set
2.4.1 set 基础操作
添加数据
语法: sadd key member1 [member2...] 示例: 127.0.0.1:6379> sadd set1 a a b c d (integer) 4
获取全部数据
语法: smembers key 示例: 127.0.0.1:6379> smembers set1 1) "a" 2) "d" 3) "c" 4) "b"
删除数据
语法: srem key member1 [member2...] 示例: 127.0.0.1:6379> srem set1 a b (integer) 2 127.0.0.1:6379> smembers set1 1) "d" 2) "c"
获取member元素的个数
语法: scard key 示例: 127.0.0.1:6379> scard set1 (integer) 2
判断集合中是否包含指定数据
语法: sismember key member 示例: 127.0.0.1:6379> sismember set1 d (integer) 1 127.0.0.1:6379> sismember set1 ddd (integer) 0
随机获取集合中[指定数量]的数据
语法: srandmember key [count] 示例: 127.0.0.1:6379> sadd set2 a b c d e f g h i (integer) 9 127.0.0.1:6379> srandmember set2 "b" 127.0.0.1:6379> srandmember set2 "b" 127.0.0.1:6379> srandmember set2 "h" 127.0.0.1:6379> srandmember set2 "e" 127.0.0.1:6379> 127.0.0.1:6379> srandmember set2 3 1) "f" 2) "e" 3) "h" 127.0.0.1:6379> srandmember set2 3 1) "d" 2) "c" 3) "i" 127.0.0.1:6379> srandmember set2 3 1) "e" 2) "h" 3) "g"
随机移除并返回集合中的某个数据
语法: spop key 示例: 127.0.0.1:6379> spop set2 "i" 127.0.0.1:6379> spop set2 "d" 127.0.0.1:6379> smembers set2 1) "a" 2) "h" 3) "f" 4) "b" 5) "e" 6) "g" 7) "c"
2.4.1 set 扩展操作
求多个集合的交、并、差集
-
交集
语法: sinter key1 [key2 …] 示例: 127.0.0.1:6379> sadd s1 a b c d e f (integer) 6 127.0.0.1:6379> sadd s2 a bb c dd e ff (integer) 6 127.0.0.1:6379> sinter s1 s2 1) "c" 2) "a" 3) "e"
-
并集
语法: sunion key1 [key2 …] 示例: 127.0.0.1:6379> sunion s1 s2 1) "f" 2) "dd" 3) "b" 4) "a" 5) "d" 6) "bb" 7) "e" 8) "c" 9) "ff"
-
差集
语法: sdiff key1 [key2 …] 示例: 127.0.0.1:6379> sdiff s1 s2 1) "f" 2) "d" 3) "b" 127.0.0.1:6379> sdiff s2 s1 1) "ff" 2) "dd" 3) "bb"
求多个集合的交、并、差集并存储到指定集合中
语法: 交集: sinterstore destination key1 [key2 …] 并集: sunionstore destination key1 [key2 …] 差集: sdiffstore destination key1 [key2 …] 示例(以交集为例,将s1和s2的交集存储到s3中): 127.0.0.1:6379> smembers s3 (empty list or set) 127.0.0.1:6379> sinter s1 s2 1) "a" 2) "e" 3) "c" 127.0.0.1:6379> sinterstore s3 s1 s2 (integer) 3 127.0.0.1:6379> smembers s3 1) "e" 2) "a" 3) "c"
将指定数据从原始集合中移动到目标集合中
语法: smove source destination member 示例(将s1中的a元素移动到s4中): 127.0.0.1:6379> smembers s4 (empty list or set) 127.0.0.1:6379> smove s1 s4 a (integer) 1 127.0.0.1:6379> smembers s4 1) "a" 127.0.0.1:6379> smembers s1 1) "e" 2) "d" 3) "c" 4) "f" 5) "b"
2.5 key 的操作
2.5.1 key 的基本操作
删除指定key(根据key删除任意类型数据)
语法: del key 示例1-删除string: 127.0.0.1:6379> set aa bb OK 127.0.0.1:6379> get aa "bb" 127.0.0.1:6379> del aa (integer) 1 127.0.0.1:6379> get aa (nil) 示例2-删除hash: 127.0.0.1:6379> hset hash1 k1 v1 (integer) 1 127.0.0.1:6379> hgetall hash1 1) "k1" 2) "v1" 127.0.0.1:6379> del hash1 (integer) 1 127.0.0.1:6379> hgetall hash1 (empty list or set) ...其它数据类型同理...
判断key是否存在
语法: exists key 示例: 127.0.0.1:6379> set aaa bbb OK 127.0.0.1:6379> exists aaa (integer) 1 127.0.0.1:6379> exists bbb (integer) 0
获取key的类型
语法: type key 示例: 127.0.0.1:6379> set mystring hellostring OK 127.0.0.1:6379> hset myhash k1 v1 (integer) 1 127.0.0.1:6379> type mystring string 127.0.0.1:6379> type myhash hash
对list、set中的数值数据进行排序
语法: sort key #升序 sort key desc #降序 示例: 127.0.0.1:6379> del list1 (integer) 0 127.0.0.1:6379> lpush list1 11 2 33 7 5 18 (integer) 6 127.0.0.1:6379> sort list1 1) "2" 2) "5" 3) "7" 4) "11" 5) "18" 6) "33" 127.0.0.1:6379> sort list1 desc 1) "33" 2) "18" 3) "11" 4) "7" 5) "5" 6) "2"
对list、set中的字符串数据进行排序
语法: sort key alpha sort key desc alpha 示例: 127.0.0.1:6379> del list2 (integer) 0 127.0.0.1:6379> lpush list2 a b c d (integer) 4 127.0.0.1:6379> sort list2 (error) ERR One or more scores can't be converted into double 127.0.0.1:6379> sort list2 alpha 1) "a" 2) "b" 3) "c" 4) "d" 127.0.0.1:6379> sort list2 desc alpha 1) "d" 2) "c" 3) "b" 4) "a"
重命名key
语法1-如果新的key已存在会先删除新key然后在重命名: rename key newkey 示例: 127.0.0.1:6379> del username (integer) 0 127.0.0.1:6379> set username zhangsan OK 127.0.0.1:6379> set username2 lisi OK 127.0.0.1:6379> rename username username2 OK 127.0.0.1:6379> get username (nil) 127.0.0.1:6379> get username2 "zhangsan" 语法2-如果新的key不存在则重命名: renamenx key newkey 示例: 127.0.0.1:6379> set username3 wangwu OK 127.0.0.1:6379> renamenx username2 username3 (integer) 0 127.0.0.1:6379> renamenx username2 username4 (integer) 1 127.0.0.1:6379> get username4 "zhangsan"
2.5.2 key 的扩展操作
获取key的有效时间
语法1-获取秒为单位的时效: ttl key 语法2-获取毫秒为单位的时效: pttl key 示例: 127.0.0.1:6379> del username (integer) 0 127.0.0.1:6379> set username zhangsan OK 127.0.0.1:6379> ttl username (integer) -1 127.0.0.1:6379> ttl username2 (integer) -2 127.0.0.1:6379> setex username3 30 wangwu OK 127.0.0.1:6379> ttl username3 (integer) 21 127.0.0.1:6379> pttl username3 (integer) 15840
返回-1代表key没有设置有效时间,返回-2代表key不存在,返回正数代表剩余有效时长
为指定key设置有效期
语法: expire key seconds pexpire key milliseconds 示例: 127.0.0.1:6379> del hash1 (integer) 0 127.0.0.1:6379> hset hash1 k1 v1 (integer) 1 127.0.0.1:6379> ttl hash1 (integer) -1 127.0.0.1:6379> expire hash1 30 (integer) 1 127.0.0.1:6379> ttl hash1 (integer) 20 127.0.0.1:6379> del hash2 (integer) 1 127.0.0.1:6379> hset hash2 k2 v2 (integer) 1 127.0.0.1:6379> ttl hash2 (integer) -1 127.0.0.1:6379> pexpire hash2 30000 (integer) 1 127.0.0.1:6379> ttl hash2 (integer) 26 127.0.0.1:6379> pttl hash2 (integer) 21380
切换key从时效性转换为永久性
语法: persist key 示例: 127.0.0.1:6379> del username (integer) 0 127.0.0.1:6379> setex username 60 zhangsan OK 127.0.0.1:6379> ttl username (integer) 55 127.0.0.1:6379> persist username (integer) 1 127.0.0.1:6379> ttl username (integer) -1
查找key
语法: keys pattern 示例: 127.0.0.1:6379> del username (integer) 1 127.0.0.1:6379> set username1 zhangsan1 OK 127.0.0.1:6379> set username2 zhangsan2 OK 127.0.0.1:6379> set username3 zhangsan3 OK 127.0.0.1:6379> keys * 1) "username3" 2) "username1" 3) "username2" 127.0.0.1:6379> keys username* 1) "username3" 2) "username1" 3) "username2" 127.0.0.1:6379> keys *3 1) "username3"
2.6 db 常用指令
2.6.1 存在的问题
redis在使用过程中,伴随着操作数据量的增加,会出现大量的数据以及对应的key。这是key重名冲突的几率就比较高。要解决这个问题,除了我们在命名时尽量做到统一和规范以外,redis 自身也提供了一个解决机制。
2.6.2 解决方式
redis为每个服务提供有16个数据库,编号从0到15,每个数据库之间是相互独立的。如果没有进行过特殊设置,默认使用的是0号数据库。
2.6.3 db 基础操作
切换数据库
语法: select index 示例: select 1
2.6.4 db 扩展操作
数据移动
语法: move key index 示例: move username 1
统计当前db中key的数量
语法: dbsize 示例: 127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]> dbsize (integer) 1
清除数据
语法1-清除当前db中所有数据: flushdb 语法2-清除所有db中的数据: flushall