Redis支持5中数据类型,分别是:字符串(String)、列表(List)、集合(Set)、有序集合(Sorted Set)和哈希(hash)。
字符串
redis中的字符串是二进制安全的,可以存储任何类型的数据,最大长度是512M。
设置key-value对:set key value
同时设置多个key-value对:mset key value [key value …]
获取key所对应的值:get key
获取多个key所对应的值:mget key [key…]
获取所有的key:keys *
查询key是否存在:exists key。返回值1表示key存在,0表示不存在。
删除key:del key [key …]。返回值表示删除key的个数。如果是0,表示没有删除任何key
返回key的类型:type key
修改key所对应的value:getset key value。如果key不存在,则设置key-value,否则将key所对应的value修改为指定的value,返回值为老的value。
重命名一个key:rename key
获取字符串的长度:strlen key
127.0.0.1:6379> set myname "felix"
OK
127.0.0.1:6379> get myname
"felix"
127.0.0.1:6379> keys *
1) "myname"
127.0.0.1:6379> EXISTS myname
(integer) 1
127.0.0.1:6379>
删除key
127.0.0.1:6379> set test1 1
OK
127.0.0.1:6379> set test2 2
OK
127.0.0.1:6379> set test3 3
OK
127.0.0.1:6379> del test1 test2 test
(integer) 2
127.0.0.1:6379>
返回key的类型:
127.0.0.1:6379> type myname
string
127.0.0.1:6379>
修改或设置key对应的value:
127.0.0.1:6379> getset hello felix
(nil)
127.0.0.1:6379> get hello
"felix"
127.0.0.1:6379> getset hello "felix.zhang"
"felix"
127.0.0.1:6379> get hello
"felix.zhang"
127.0.0.1:6379>
如果字符串是数字类型,还可以进行数值操作。
redis的所有操作都是原子操作,不管有多少个客户端连接,获取到的结果都是一致的。
数值操作相关的指令:返回值为增加或减少后的值。
incr:每次操作增加1。
incrby:增加指定的值。如果key不存在,从0开始增加。
decr:每次操作减少1.
decrby:每次操作减少指定的值。如果key不存在,从0开始减少。
INCR:
127.0.0.1:6379> set test 1
OK
127.0.0.1:6379> get test
"1"
127.0.0.1:6379> INCR test
(integer) 2
127.0.0.1:6379> INCR test
(integer) 3
127.0.0.1:6379> get test
"3"
127.0.0.1:6379>
INCRBY:
127.0.0.1:6379> get test
"3"
127.0.0.1:6379> INCRBY test 2
(integer) 5
127.0.0.1:6379> INCRBY test 2
(integer) 7
127.0.0.1:6379>
DECR:
127.0.0.1:6379> DECR test
(integer) 6
127.0.0.1:6379> DECR test
(integer) 5
127.0.0.1:6379>
DECRBY:
127.0.0.1:6379> DECRBY test 5
(integer) 0
127.0.0.1:6379> DECRBY test 5
(integer) -5
127.0.0.1:6379>
列表
列表的最大长度是2^32 - 1
不管列表的最大长度有多长,在列表中插入数据的速度都是一样的。
列表常用的操作:
lpush:在列表的左侧插入一个元素。返回值为列表的长度。
rpush:在列表的右侧插入一个元素。返回值为列表的长度。
lrange:返回指定范围内的元素。包含开始和结束索引。如果要查询所有的元素可以用lrange list 0 -1
llen:获取列表的长度。
lpop:删除列表左边的元素。返回值是删除的元素。
rpop:删除列表右边的元素。返回值是删除的元素。
lindex:根据索引获取值。lindex key index
linsert:往列表中插入值。linsert key before|after pivot value
lset:修改指定索引处的值。指定的索引必须存在,否则会报错。
ltrim:截断一个索引,返回从start到stop之间的值。包括start和stop。
列表中的第一个元素编号为0,最后一个元素编号为-1。
127.0.0.1:6379> lpush mylist "1"
(integer) 1
127.0.0.1:6379> lpush mylist "0"
(integer) 2
127.0.0.1:6379> LRANGE mylist 0 -1
1) "0"
2) "1"
127.0.0.1:6379> rpush mylist "2"
(integer) 3
127.0.0.1:6379> rpush mylist "3"
(integer) 4
127.0.0.1:6379> LRANGE mylist 0 -1
1) "0"
2) "1"
3) "2"
4) "3"
127.0.0.1:6379>
获取列表的长度
127.0.0.1:6379> llen mylist
(integer) 4
127.0.0.1:6379>
删除列表中的元素
127.0.0.1:6379> LRANGE mylist 0 -1
1) "0"
2) "1"
3) "2"
4) "3"
127.0.0.1:6379> LPOP mylist
"0"
127.0.0.1:6379> LRANGE mylist 0 -1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> RPOP mylist
"3"
127.0.0.1:6379> LRANGE mylist 0 -1
1) "1"
2) "2"
127.0.0.1:6379>
插入数据
127.0.0.1:6379> lrange mylist 0 -1
1) "0"
2) "1"
3) "2"
4) "zhang"
5) "felix"
6) "3"
7) "4"
127.0.0.1:6379> LINSERT mylist before 3 "hello world"
(integer) 8
127.0.0.1:6379> LRANGE mylist 0 -1
1) "0"
2) "1"
3) "2"
4) "zhang"
5) "felix"
6) "hello world"
7) "3"
8) "4"
127.0.0.1:6379>
修改指定索引处的值:
127.0.0.1:6379> lrange mylist 0 -1
1) "zhang"
2) "world"
127.0.0.1:6379> lset mylist 0 hello
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "world"
127.0.0.1:6379> lrange mylist 2 fail
(error) ERR value is not an integer or out of range
127.0.0.1:6379>
ltrim截断一个索引:
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "world"
3) "this"
4) "is"
5) "a"
6) "list"
127.0.0.1:6379> LTRIM mylist 0 1
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "world"
127.0.0.1:6379>
集合
redis的集合是一种无序集合(不会按照添加的顺序显示),集合中的元素没有先后顺序。集合中的元素不能重复。集合中的元素为字符串。
sadd:往集合中添加一个或多个新的元素。
smembers:列出集合中的所有元素。
spop:随机删除集合中的一个元素。
srem: 从集合中删除一个或多个元素,不存在的元素会忽略。
sismember:判断一个元素是不是集合中的元素。返回值为1,表示true,返回值为0,表示false。
scard:返回集合中元素的个数。
sinter:求两个或多个集合的交集。
sunion:求两个或多个集合的并集。
sdiff:求两个或多个集合的差集。
sinterstore、sunionstore和sdiffstore可以将交集、并集、差集的结果存储到一个新的集合中。
添加元素、删除元素、列出集合中的元素
添加元素:
127.0.0.1:6379> sadd myset zhang
(integer) 1
127.0.0.1:6379> sadd myset wang li zhao
(integer) 3
127.0.0.1:6379>
删除元素:
127.0.0.1:6379> SMEMBERS myset
1) "zhou"
2) "zhao"
3) "li"
4) "zheng"
5) "zhang"
6) "wu"
127.0.0.1:6379> SREM myset zhou wu zheng wang hello
(integer) 3
127.0.0.1:6379> SMEMBERS myset
1) "zhao"
2) "li"
3) "zhang"
127.0.0.1:6379>
列出集合中的元素:
127.0.0.1:6379> SMEMBERS myset
1) "zhang"
2) "zhao"
3) "wang"
4) "li"
127.0.0.1:6379>
判断元素是否是集合中的元素:
127.0.0.1:6379> SMEMBERS myset
1) "zhao"
2) "li"
3) "zhang"
127.0.0.1:6379> SISMEMBER myset 'zhang'
(integer) 1
127.0.0.1:6379> SISMEMBER myset 'wang'
(integer) 0
127.0.0.1:6379>
集合中元素的个数:
127.0.0.1:6379> SCARD myset
(integer) 3
127.0.0.1:6379>
集合的交集:SINTER
127.0.0.1:6379> SMEMBERS myset1
1) "zhao"
2) "li"
3) "zhang"
127.0.0.1:6379> sadd myset2 felix zhang zhao
(integer) 3
127.0.0.1:6379> SINTER myset1 myset2
1) "zhao"
2) "zhang"
127.0.0.1:6379>
集合的并集:SUNION
127.0.0.1:6379> SMEMBERS myset1
1) "zhao"
2) "li"
3) "zhang"
127.0.0.1:6379> SMEMBERS myset2
1) "zhang"
2) "felix"
3) "zhao"
127.0.0.1:6379> SUNION myset1 myset2
1) "felix"
2) "zhang"
3) "zhao"
4) "li"
127.0.0.1:6379>
集合的差集:SDIFF
127.0.0.1:6379> SMEMBERS myset1
1) "zhao"
2) "li"
3) "zhang"
127.0.0.1:6379> SMEMBERS myset2
1) "zhang"
2) "felix"
3) "zhao"
127.0.0.1:6379> SDIFF myset1 myset2
1) "li"
127.0.0.1:6379>
127.0.0.1:6379> SDIFF myset2 myset1
1) "felix"
127.0.0.1:6379>
有序集合
有序集合中的元素也是字符串,集合中的元素也不能重复。有序集合中的每个元素都会关联一个score,score的主要作用用于排序。
zadd:添加元素。如果元素已经存在,则更新score。
zrem:删除一个或元素。
zcard:获取有序集合的元素个数。
zrange:获取索引在start到stop之间的元素值。还可以使用WITHSCORES显示score的值。(score从低到高)。索引是根据score值来定的
zrevrange:实现的功能和zrange一样,score是从高到低。
zcount:获取score在start和stop之间的元素个数。
zrangebyscore:获取score位于start和stop之间的元素值。也可以跟上WITHSCORES显示他们的score。start为min,stop为max。
zrevrangebyscore:获取score位于start和stop之间的元素值。start为max,stop为min。
zscore:返回元素的score值。
zrank:返回元素的索引值。
zrevrank:反向查询元素的索引值。
添加元素:
127.0.0.1:6379> ZADD myzset 10 baidu.com
(integer) 1
127.0.0.1:6379> ZADD myzset 20 jd.com 30 google.com
(integer) 2
127.0.0.1:6379>
获取zset的元素个数:
127.0.0.1:6379> ZCARD myzset
(integer) 3
127.0.0.1:6379>
获取从start到stop之间的元素:
127.0.0.1:6379> zrange myzset 0 -1
1) "baidu.com"
2) "jd.com"
3) "google.com"
127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES
1) "baidu.com"
2) "10"
3) "jd.com"
4) "20"
5) "google.com"
6) "30"
127.0.0.1:6379>
获取score在start和stop之间的元素个数:
127.0.0.1:6379> ZCOUNT myzset 10 20
(integer) 2
127.0.0.1:6379>
获取score位于start和stop之间的元素:
127.0.0.1:6379> ZRANGEBYSCORE myzset 10 20
1) "baidu.com"
2) "jd.com"
127.0.0.1:6379> ZRANGEBYSCORE myzset 10 20 withscores
1) "baidu.com"
2) "10"
3) "jd.com"
4) "20"
127.0.0.1:6379>
查看元素的score值:
127.0.0.1:6379> ZSCORE myzset jd.com
"20"
127.0.0.1:6379>
查看元素的索引:
127.0.0.1:6379> ZRANK myzset jd.com
(integer) 1
127.0.0.1:6379> ZRANK myzset google.com
(integer) 2
127.0.0.1:6379> ZRANK myzset google
(nil)
127.0.0.1:6379>
哈希
redis的hash是filed和value的映射。
hset:创建一个hash类型的key,并添加或修改field和value。
hmset:创建一个hash类型的key,可以添加一个或多个field和value。
hget:返回hash表的某个field所对应的value。
hmget:返回hash表的某个或某些field所对应的value。
hlen:返回hash表的长度。
hkeys:返回hash表的所有key。
hvals:返回hash表的所有value。
hgetall:返回hash表的所有key和value。
hexists:判断hash表的某个field是否存在。返回1表示存在,0表示不存在。
hdel:删除hash表中的一个或多个field。对于不存在的field将会忽略。
创建一个hash,并添加field和value:
127.0.0.1:6379> hset myhash username felix
(integer) 1
127.0.0.1:6379>
创建包含多个field和value的hash表:
127.0.0.1:6379> hmset myhash password 123456 age 27
OK
127.0.0.1:6379>
获取hash表的field所对应的value:
127.0.0.1:6379> HGET myhash age
"27"
127.0.0.1:6379> HMGET myhash username age
1) "felix"
2) "27"
127.0.0.1:6379>
返回hash表的长度:
127.0.0.1:6379> HLEN myhash
(integer) 1
127.0.0.1:6379>
返回hash表中的所有key和value:
127.0.0.1:6379> HKEYS myhash
1) "username"
2) "password"
3) "age"
127.0.0.1:6379> HVALS myhash
1) "felix"
2) "123456"
3) "27"
127.0.0.1:6379>
127.0.0.1:6379> HGETALL myhash
1) "username"
2) "felix"
3) "password"
4) "123456"
5) "age"
6) "27"
127.0.0.1:6379>
判断hash表中是否存在某个field:
127.0.0.1:6379> HEXISTS myhash salary
(integer) 0
127.0.0.1:6379> HEXISTS myhash username
(integer) 1
127.0.0.1:6379>
删除一个或多个field:
127.0.0.1:6379> HDEL myhash age password
(integer) 2
127.0.0.1:6379> HGETALL myhash
1) "username"
2) "zhang"
127.0.0.1:6379> HDEL myhash test
(integer) 0
127.0.0.1:6379> HGETALL myhash
1) "username"
2) "zhang"
127.0.0.1:6379>