一.Redis的数据类型
1.String类型及操作
String是最简单的类型,一个key对应一个value,string类型是二进制安全的。Redis的string可以包含任何数据,比如jpg图片或者序列化的对象。
Set方法:设置key对应的值为string类型的value
例如:我们添加一个name=lili的键值对
redis 127.0.0.1:6379> set name lili
OK
Setnx:设置key对应的值为string类型的value,如果key已经存在,返回0,nx是not exist的意思。
例如:我们添加一个name=lili_new的键值对。
redis 127.0.0.1:6379> get name
"lili"
redis 127.0.0.1:6379> setnx name lili_new
(integer) 0
redis 127.0.0.1:6379> get name
"lili"
redis 127.0.0.1:6379> setnx age 20
(integer) 1
Setex:设置key对应的值为string类型的value,并指定此键值对应的有效期。
例如:我们添加一个haircolor=red的键值对,并指定有效期为10秒
redis 127.0.0.1:6379> setex haircolor 10 red
OK
redis 127.0.0.1:6379> get haircolor
"red"
redis 127.0.0.1:6379> get haircolor
(nil)
nil:表示空
Setrange:设置指定key的value值的子字符串
例如:我们希望将lili的126邮箱替换为gmail邮箱
redis 127.0.0.1:6379> get name
"lili@126.com"
redis 127.0.0.1:6379> setrange name 6 gmail.com
(integer) 14
redis 127.0.0.1:6379> get name
"lili@gmail.com"
redis 127.0.0.1:6379> set email lijie@lampbrother.net
OK
redis 127.0.0.1:6379> get email
"lijie@lampbrother.net"
redis 127.0.0.1:6379> setrange email 6-li-jie.me
(integer) 21
redis 127.0.0.1:6379> get email
"lijie@li-jie.meer.net"
mset:一次设置多个key的值,成功返回ok表示所有的值都设置了,失败返回0表示没有任何值被设置。
redis 127.0.0.1:6379> mset key1 lijie1 key2 lijie2
OK
redis 127.0.0.1:6379> get key1
"lijie1"
redis 127.0.0.1:6379> get key2
"lijie2"
msetnx:一次设置多个key的值,成功返回ok表示所有的值都设置了,失败返回0表示没有任何值被设置,但是不会覆盖已经存在的key。
1. redis 127.0.0.1:6379> msetnx key3 lijie3 key2 30
2. (integer) 0
3. redis 127.0.0.1:6379> get key3
4. (nil)
5. redis 127.0.0.1:6379> msetnx key3 lijie3 key4 30
6. (integer) 1
7. redis 127.0.0.1:6379> get key3
8. "lijie3"
9. redis 127.0.0.1:6379> get key4
10. "30"
get:获取key对应的string值,如果key不存在返回nil。
getset:设置key的值,并返回key的旧值。
1. redis 127.0.0.1:6379> getset key4 40
2. "30"
3. redis 127.0.0.1:6379> get key4
4. "40"
getrange:获取key的value值的子字符串。
1. redis 127.0.0.1:6379> get email
2. "lijie@li-jie.meer.net"
3. redis 127.0.0.1:6379> getrange email 0 4
4. "lijie"
mget:一次获取多个key的值,如果对应key不存在则对应返回nil。
1. redis 127.0.0.1:6379> mget key1 key2 key3
2. 1) lijie1
3. 2) lijie2
4. 3) lijie3
incr:对key的值做加加操作,并返回新的值。
1. redis 127.0.0.1:6379> incr key4
2. (integer) 41
3. redis 127.0.0.1:6379> incr key4
4. (integer) 42
5. redis 127.0.0.1:6379> get key4
6. "42"
7.
8. redis 127.0.0.1:6379> incr key7
9. (integer) 1
10. redis 127.0.0.1:6379> incr key7
11. (integer) 2
12. redis 127.0.0.1:6379> get key7
13. "2"
incrby:同incr类似,加指定值,key不存在时候会设置key,并认为原来的value是0。
1. redis 127.0.0.1:6379> incrby key4 5
2. (integer) 47
3. redis 127.0.0.1:6379> get key4
4. "47"
5. redis 127.0.0.1:6379> incrby key4 -5
6. (integer) 42
7. redis 127.0.0.1:6379> get key4
8. "42"
decr:对key的值做减减操作。
decrby:同decr类似,减指定值。
1. redis 127.0.0.1:6379> get key6
2. "39"
3. redis 127.0.0.1:6379> decr key6
4. (integer) 38
5. redis 127.0.0.1:6379> decrby key6 -3
6. (integer) 41
7. redis 127.0.0.1:6379> decrby key6 3
8. (integer) 38
append:给指定key的字符串追加value,返回新字符串值的长度。
1. redis 127.0.0.1:6379> get name
2. "test"
3. redis 127.0.0.1:6379> append name .net
4. (integer) 8
5. redis 127.0.0.1:6379> get name
6. "test.net"
strlen:取指定key的value值的长度。
1. redis 127.0.0.1:6379> strlen name
2. (integer) 8
2.hash类型及操作
Redis hash是一个string类型的field和value的映射表。它的添加、删除操作都是0(1)(平均)。hash特别适合用于存储对象。相较于将对象的每个字段存成单个string类型。将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。
hset:设置hash field为指定值,如果key不存在,则先创建。
1. redis 127.0.0.1:6379> hset user:001 name lijie
2. (integer) 1
3. redis 127.0.0.1:6379> hget user:001 name
4. "lijie"
hsetnx:设置hash field为指定值,如果key不存在,则先创建。如果存在返回0。
1. redis 127.0.0.1:6379> hsetnx user:002 name lamp
2. (integer) 1
3. redis 127.0.0.1:6379> hget user:002 name
4. "lamp"
5. redis 127.0.0.1:6379> hsetnx user:002 name lampbrother
6. (integer) 0
7. redis 127.0.0.1:6379> hget user:002 name
8. "lamp"
hmset:同时设置hash的多个field。
1. redis 127.0.0.1:6379> hmset user:003 name lijie age 20 sex 1
2. OK
3. redis 127.0.0.1:6379> hget user:003 name
4. "lijie"
5. redis 127.0.0.1:6379> hget user:003 age
6. "20"
7. redis 127.0.0.1:6379> hget user:003 sex
8. "1"
hget:获取指定的hash field。
hmget:获取全部指定的hash field。
1. redis 127.0.0.1:6379> hmget user:003 name age sex
2. 1) "lijie"
3. 2) "20"
4. 3) "1"
hincrby:指定的hash field加上给定值。
1. redis 127.0.0.1:6379> hincrby user:003 age 5
2. (integer) 25
3. redis 127.0.0.1:6379> hget user:003 age
4. "25"
hexists:测试指定field是否存在。
1. redis 127.0.0.1:6379> hexists user:003 age
2. (integer) 1
3. redis 127.0.0.1:6379> hexists user:001 sex
4. (ingeger) 0
hlen:返回指定hash的field数量
1. redis 127.0.0.1:6379> hlen user:001
2. (integer) 1
3. redis 127.0.0.1:6379> hlen user:003
4. (integer) 3
hdel:删除指定hash的field
1. redis 127.0.0.1:6379> hget user:003 age
2. "25"
3. redis 127.0.0.1:6379> hdel user:003 age
4. (integer) 1
5. redis 127.0.0.1:6379> hget user:003 age
6. (nil)
hkeys:返回hash的所有field
1. redis 127.0.0.1:6379> hkeys user:001
2. 1) "name"
3. redis 127.0.0.1:6379> hkeys user:003
4. 1) "name"
5. 2) "sex"
hvals:返回hash的所有value
1. redis 127.0.0.1:6379> hvals user:003
2. 1) "lijie"
3. 2) "1"
hgetall:获取某个hash中全部的field及value
1. redis 127.0.0.1:6379> hgetall user:003
2. 1) "name"
3. 2) "lijie"
4. 3) "sex"
5. 4) "1"
3.list类型及操作
List是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等,操作key理解为链表的名字。Redis的list类型其实就是一个每个子元素都是string类型的双向链表。我们可以通过push、pop操作从链表的头部或者尾部添加删除元素,这样list既可以作为栈,又可以作为队列。
lpush:在key对应list的头部添加字符串元素。
1. redis 127.0.0.1:6379> lpush mylist "world"
2. (integer) 1
3. redis 127.0.0.1:6379> lpush mylist "hello"
4. (integer) 2
5. redis 127.0.0.1:6379> lrange mylist 0 -1
6. 1) "hello"
7. 2) "world"
0代表头部第一个元素,-1代表尾部第一个元素。lrange mylist 0 -1表示从list中头第一个元素一直到尾第一个元素依次取出来,即第一个元素取到最后一个元素。
rpush:在key对应list的尾部添加字符串元素。
1. redis 127.0.0.1:6379> rpush mylist2 "world"
2. (integer) 1
3. redis 127.0.0.1:6379> rpush mylist2 "hello"
4. (integer) 2
5. redis 127.0.0.1:6379> lrange mylist2 0 -1
6. 1) "world"
7. 2) "hello"
linsert:在key对应list的特定位置前或后添加字符串
1. redis 127.0.0.1:6379> rpush mylist3 "world"
2. (integer) 1
3. redis 127.0.0.1:6379> linsert mylist3 before "world "hello"
4. (integer) 2
5. redis 127.0.0.1:6379> lrange mylist3 0 -1
6. 1) "hello"
7. 2) "world"
lset:设置list中指定下标的元素值
1. redis 127.0.0.1:6379> rpush mylist4 "hello"
2. (integer) 1
3. redis 127.0.0.1:6379> lset mylist4 0 "world"
4. OK
5. redis 127.0.0.1:6379> lrange mylist4 0 -1
6. 1) "world"
lrem:从key对应list中删除n个和value相同的元素(n<0从尾删除,n=0全部删除)。
1. redis 127.0.0.1:6379> rpush mylist5 "hello"
2. (integer) 1
3. redis 127.0.0.1:6379> rpush mylist5 "hello"
4. (integer) 2
5. redis 127.0.0.1:6379> lrem mylist5 1 "hello" //从mylist5中删除1个和hello相同的元素
6. (integer) 1 //代表删除元素的个数
ltrim:保留指定key的值范围内的数据
1. redis 127.0.0.1:6379> rpush mylist8 "one"
2. (integer) 1
3. redis 127.0.0.1:6379> rpush mylist8 "two"
4. (integer) 2
5. redis 127.0.0.1:6379> ltrim mylist8 1 -1
6. (integer) 1
7. redis 127.0.0.1:6379> lrange mylist8 0 -1
8. 1) "two"
lpop:从list的头部删除元素,并返回删除元素
1. redis 127.0.0.1:6379> lrange mylist 0 -1
2. 1) "hello"
3. 2) "world"
4. redis 127.0.0.1:6379> lpop mylist
5. "hello"
6. redis 127.0.0.1:6379> lrange mylist 0 -1
7. 1) "world"
rpop:从list的尾部删除元素,并返回删除元素
1. redis 127.0.0.1:6379> lrange mylist2 0 -1
2. 1) "hello"
3. 2) "world"
4. redis 127.0.0.1:6379> rpop mylist2
5. "world"
6. redis 127.0.0.1:6379> lrange mylist2 0 -1
7. 1) "hello"
lists类型
rpoplpush:从第一个list的尾部移除元素并添加到第二个list的头部。
1. redis 127.0.0.1:6379> lrange mylist5 0 -1
2. 1) "three"
3. 2) "hello"
4. redis 127.0.0.1:6379> lrange mylist6 0 -1
5. 1) "hello"
6. 2) "foo"
7. redis 127.0.0.1:6379> rpoplpush mylist5 mylist6
8. "hello"
9. redis 127.0.0.1:6379> lrange mylist5 0 -1
10. 1) "three"
11. redis 127.0.0.1:6379> lrange mylist6 0 -1
12. 1) "hello"
13. 2) "hello"
14. 3) "foo"
lindex:返回名称为key的list中index位置的元素。
1. redis 127.0.0.1:6379> lrange mylist5 0 -1
2. 1) "three"
3. 2) "foo"
4. redis 127.0.0.1:6379> lindex mylist5 0
5. "three"
6. redis 127.0.0.1:6379> lindex mylist5 1
7. "foo"
llen:返回key对应list的长度
1. redis 127.0.0.1:6379> lrange mylist6 0 -1
2. 1) "hello"
3. 2) "hello"
4. 3) "foo"
5. redis 127.0.0.1:6379> llen mylist6
6. (integer) 3
4.set类型及操作
Set是集合,它是string类型的无序集合。set是通过hash table实现的,添加、删除和查找的复杂度都是O(1)。对集合我们可以取并集、交集、差集。通过这些操作我们可以实现sns中的好友推荐和blog的tag功能。
sadd:向名称为key的set中添加元素。
1. redis 127.0.0.1:6379> sadd myset "hello"
2. (integer) 1 //表示添加成功
3. redis 127.0.0.1:6379> sadd myset "world"
4. (integer) 1 //表示添加成功
5. redis 127.0.0.1:6379> sadd myset "world"
6. (integer) 0 //表示添加不成功
7. redis 127.0.0.1:6379> smembers myset
8. 1) "world"
9. 2) "hello"
srem:删除名称为key的set中的元素。
1. redis 127.0.0.1:6379> sadd myset2 one
2. (integer) 1
3. redis 127.0.0.1:6379> sadd myset2 two
4. (integer) 1
5. redis 127.0.0.1:6379> sadd myset2 three
6. (integer) 1
7. redis 127.0.0.1:6379> smembers myset2
8. 1) "three"
9. 2) "two"
10. 3) "one"
11. redis 127.0.0.1:6379> srem myset2 two
12. (integer) 1
13. redis 127.0.0.1:6379> srem myset2 two
14. (integer) 0
15. redis 127.0.0.1:6379> smembers myset2
16. 1) "three"
17. 2) "one"
spop:随机返回并删除名称为key的set中一个元素。
1. redis 127.0.0.1:6379> sadd myset3 one
2. (integer) 1
3. redis 127.0.0.1:6379> sadd myset3 two
4. (integer) 1
5. redis 127.0.0.1:6379> sadd myset3 three
6. (integer) 1
7. redis 127.0.0.1:6379> sadd myset3 four
8. (integer) 1
9. redis 127.0.0.1:6379> sadd myset3 five
10. (integer) 1
11. redis 127.0.0.1:6379> smembers myset3
12. 1) "four"
13. 2) "three"
14. 3) "two"
15. 4) "one"
16. 5) "five"
17. redis 127.0.0.1:6379> spop myset3
18. "one"
19. redis 127.0.0.1:6379> spop myset3
20. "four"
21. redis 127.0.0.1:6379> spop myset3
22. "three"
23. redis 127.0.0.1:6379> smembers myset3
24. 1) "two"
25. 2) "five"
sdiff:返回所有给定key与第一个key的差集。
1. redis 127.0.0.1:6379> smembers myset2
2. 1) "three"
3. 2) "two"
4. redis 127.0.0.1:6379> smembers myset3
5. 1) "two"
6. 2) "one"
7. redis 127.0.0.1:6379> sdiff myset2 myset3
8. 1) "three"
sdiffstore:返回所有给定key与第一个key的差集,并将结果存为另一个key。
1. redis 127.0.0.1:6379> smembers myset2
2. 1) "three"
3. 2) "two"
4. redis 127.0.0.1:6379> smembers myset3
5. 1) "two"
6. 2) "one"
7. redis 127.0.0.1:6379> sdiffstore myset4 myset2 myset3
8. (integer) 1
9. redis 127.0.0.1:6379> smembers myset4
10. 1) "three"
sinter:返回所有给定key的交集。
1. redis 127.0.0.1:6379> smembers myset2
2. 1) "three"
3. 2) "two"
4. redis 127.0.0.1:6379> smembers myset3
5. 1) "two"
6. 2) "one"
7. redis 127.0.0.1:6379> sinter myset2 myset3
8. 1) "two"
sinterstore:返回所有给定key的交集,并将结果存为另一个key。
1. redis 127.0.0.1:6379> smembers myset2
2. 1) "three"
3. 2) "two"
4. redis 127.0.0.1:6379> smembers myset3
5. 1) "two"
6. 2) "one"
7. redis 127.0.0.1:6379> sinterstore myset6 myset2 myset3
8. (integer) 1
9. redis 127.0.0.1:6379> smembers myset6
10. 1) "two"
sunion:返回所有给定key的并集。
1. redis 127.0.0.1:6379> smembers myset2
2. 1) "three"
3. 2) "two"
4. redis 127.0.0.1:6379> smembers myset3
5. 1) "two"
6. 2) "one"
7. redis 127.0.0.1:6379> sunion myset2 myset3
8. 1) "three"
9. 2) "one"
10. 3) "two"
sunionstore:返回所有给定key的并集。
1. redis 127.0.0.1:6379> smembers myset2
2. 1) "three"
3. 2) "two"
4. redis 127.0.0.1:6379> smembers myset3
5. 1) "two"
6. 2) "one"
7. redis 127.0.0.1:6379> sunionstore myset7 myset2 myset3
8. (integer) 3
9. redis 127.0.0.1:6379> smembers myset7
10. 1) "three"
11. 2) "one"
12. 3) "two"
smove:从第一个key对应的set中移除member并添加到第二个对应的set中。
1. redis 127.0.0.1:6379> smembers myset2
2. 1) "three"
3. 2) "two"
4. redis 127.0.0.1:6379> smembers myset3
5. 1) "two"
6. 2) "one"
7. redis 127.0.0.1:6379> smove myset2 myset7 three
8. (integer) 1
9. redis 127.0.0.1:6379> smembers myset2
10. 1) "two"
11. redis 127.0.0.1:6379> smembers myset3
12. 1) "two"
13. 2) "one"
14. 3) "three"
scard:返回名称为key的set的元素个数。
1. redis 127.0.0.1:6379> scard myset3
2. (integer) 3
sismember:测试member是否是名称为key的set的元素。
1. redis 127.0.0.1:6379> smembers myset2
2. 1) "two"
3. redis 127.0.0.1:6379> sismember myset2 two
4. (integer) 1
5. redis 127.0.0.1:6379> sismember myset2 one
6. (integer) 0
srandmember:随机返回名称为key的set的一个元素,但不删除元素。
1. redis 127.0.0.1:6379> smembers myset3
2. 1) "two"
3. 2) "one"
4. redis 127.0.0.1:6379> srandmember myset3
5. "two"
6. redis 127.0.0.1:6379> srandmember myset3
7. "one"
5.sort set类型及操作
sorted set是set的一个升级版本,它在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解为有两列的mysql表,一列存value,一列存顺序。操作中key理解为zset的名字。
zadd:向名称为key的zset中添加元素member,score用于排序。如果该元素存在,则更新其顺序。
1. redis 127.0.0.1:6379> zadd myzset 1 "one"
2. (integer) 1
3. redis 127.0.0.1:6379> zadd myzset 2 "two"
4. (integer) 1
5. redis 127.0.0.1:6379> zadd myzset 3 "two"
6. (integer) 0
7. redis 127.0.0.1:6379> zrange myzset 0 -1 withscores
8. 1) "one"
9. 2) "1"
10. 3) "two"
11. 4) "3"
zrem:删除名称为key的zset中的元素member
1. redis 127.0.0.1:6379> zrange myzset 0 -1 withscores
2. 1) "one"
3. 2) "1"
4. 3) "two"
5. 4) "3"
6. redis 127.0.0.1:6379> zrem myzset two
7. (integer) 1
8. redis 127.0.0.1:6379> zrange myzset 0 -1 withscores
9. 1) "one"
10. 2) "1"
zincrby:如果在名称为key的zset中已经存在元素member,则该元素的score增加increment,否则向该集合中添加该元素,其score的值为increment。
1. redis 127.0.0.1:6379> zadd myzset2 1 "one"
2. (integer) 1
3. redis 127.0.0.1:6379> zadd myzset2 2 "two"
4. (integer) 1
5. redis 127.0.0.1:6379> zincrby myzset2 2 "one"
6. "3" //代表one的顺序号变成了3
7. redis 127.0.0.1:6379> zrange myzset2 0 -1 withscores
8. 1) "two"
9. 2) "2"
10. 3) "one"
11. 4) "3"
zrank:返回名称为key的zset中member元素的排名(按score从小到大排序)即下标。
1. redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
2. 1) "one"
3. 2) "1"
4. 3) "two"
5. 4) "2"
6. 5) "three"
7. 6) "3"
8. 7) "five"
9. 8) "5"
10. redis 127.0.0.1:6379> zrank myzset3 two
11. (integer) 1 //two的下标是1(从0开始)
zrevrank:返回名称为key的zset中member元素的排名(按score从大到小排序)即下标。
1. redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
2. 1) "one"
3. 2) "1"
4. 3) "two"
5. 4) "2"
6. 5) "three"
7. 6) "3"
8. 7) "five"
9. 8) "5"
10. redis 127.0.0.1:6379> zrevrank myzset3 two
11. (integer) 2
zrevrange:返回名称为key的zset(按score从大到小顺序)中的index从start到end的所有元素。
1. redis 127.0.0.1:6379> zrevrange myzset3 0 -1 withscores
2. 1) "five"
3. 2) "5"
4. 3) "three"
5. 4) "3"
6. 5) "two"
7. 6) "2"
8. 7) "one"
9. 8) "1"
zrangebyscore:返回集合中score在给定区间的元素。
1. redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
2. 1) "one"
3. 2) "1"
4. 3) "two"
5. 4) "2"
6. 5) "three"
7. 6) "3"
8. redis 127.0.0.1:6379> zrangebyscore myzset3 2 3 withscores
9. 1) "two"
10. 2) "2"
11. 3) "three"
12. 4) "3"
zcount:返回集合中score在给定区间的数量。
1. redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
2. 1) "one"
3. 2) "1"
4. 3) "two"
5. 4) "2"
6. 5) "three"
7. 6) "3"
8. 7) "five"
9. 8) "5"
10. redis 127.0.0.1:6379> zcount myzset3 2 3
11. (integer) 2
zcard:返回集合中的元素个数。
1. redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
2. 1) "one"
3. 2) "1"
4. 3) "two"
5. 4) "2"
6. 5) "three"
7. 6) "3"
8. 7) "five"
9. 8) "5"
10. redis 127.0.0.1:6379> zcard myzset3
11. (integer) 4
zremrangebyrank:删除集合中排名在给定区间的元素。
1. redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
2. 1) "one"
3. 2) "1"
4. 3) "two"
5. 4) "2"
6. redis 127.0.0.1:6379> zremrangebyrank myzset3 1 1
7. (integer) 1 //只删除一个
8. redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
9. 1) "one"
10. 2) "1"
zremrangebyscore:删除集合中score在给定区间的元素。
1. redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
2. 1) "one"
3. 2) "1"
4. 3) "two"
5. 4) "2"
6. 5) "three"
7. 6) "3"
8. redis 127.0.0.1:6379> zremrangebyscore myzset3 1 2
9. (integer) 2 //删除顺序为1和2的
10. redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
11. 1) "three"
12. 2) "3"