1常用命令
redis-serverredis.conf 启动redis服务
redis-cli 启动redis客户端
redis-cli shutdown 停止redis服务
set foo bar 添加或修改foo的值为bar
get foo 获取foo的值
del foo 删除key为foo的记录
select 3 切换到3号数据库,默认有16个数据库,默认使用0号数据库,每个数据库都有属于自己的空间,不必担心之间的key冲突
flushdb 清除当前数据库下的数据,不会影响到其他数据库
flushall 清除所有数据库的数据。在执行这个命令前要格外小心
2数据类型
2.1 String(字符串)
Strings是Redis value的最基本类型。Redis String是二进制安全的,意思是一个Redis字符串能够包含任何类型的数据,包括JPEG图片或者是序列化Ruby对象。一个String长度最多可以达到512M。
你可以用redis的string类型做一些事情:
set num 1
INCR num
get num #结果为2
DECR num
get num #结果为1
INCRBY num 5
get num #结果为6
- 可以使用APPEND命令在String后面追加
APPEND foo hello #假如key不存在,则添加,相当于set
get foo #结果为hello
APPEND foo World #假如key已存在,则追加
get foo #结果为helloWorld
set foo hello
GETRANGE foo 0 2 #截取其中一段,结果为hel
SETRANGE foo 3 k
get foo #设置其中一段,结果为helko
其他命令:
BITCOUNTmykey #获取字符串的位长度,假如不存在,返回0
BITOP AND destkeysrckey1 srckey2 srckey3 ... srckeyN #按位与运算,结果放在destkey
BITOP OR destkeysrckey1 srckey2 srckey3 ... srckeyN #按位或运算,结果放在destkey
BITOP XORdestkey srckey1 srckey2 srckey3 ... srckeyN #按位异或运算,同上
BITOP NOTdestkey srckey #按位非运算,同上
BITPOSmykey 0 #返回字符串的第一个位是1或0的位置
SETBITmykey 7 1 #设置字符串的第七位为1
GETBITmykey 0 #返回字符串的第一位的值
GETSET mycounter "0" #设置值为"0",并返回旧的值;若旧值不存在,返回null
DECRBY mykey 3 #每次递减3
INCRBYFLOATmykey 0.1 #按浮点数递增
MGET key1 key2 #返回所有指定key的值
MSET key1 "Hello" key2 "World" #设置所有指定key的值,若key已存在,则覆盖
MSETNX key1 "Hello" key2 "there" #设置所有指定key的值;若其中任意一个key存在,则不会执行。
PSETEX mykey 1000 "Hello" #设置key的值以及过期时间,单位:毫秒
SETEX mykey 10 "Hello" #设置key的值以及过期时间,单位:秒
SETNX mykey "Hello" #设置key的值,若key已存在,不执行操作
STRLEN mykey #返回值的长度
2.2 Hash(哈希表)
Redis Hashes是由字段和与其对应的值组成的。不管是字段,还是字段的值,都是string。所以很适合表示对象的数据类型。
例如,由name, password,age组成的user信息:
HMSETuser:1000 username antirez password P1pp0 age 34 #设置user各个字段的值
HGETALLuser:1000 #获取user信息
HSET user:1000password 12345 #修改信息
HGETALLuser:1000 #获取信息
拥有少量字段的哈希表(少量意味着大概100左右)存储会占用很小的空间,因此你可以在一个小的Redis实例中存储上百万个对象。
由于Hashes主要用来表示对象,而且能够存储很多元素,因此你也可以用来完成很多其他任务。
每个hash可以最多存储232 – 1个键值对(超过40亿)
其他命令:
HDELmyhash field1 #删除key的指定字段
HEXISTSmyhash field1 #检查key的指定字段是否存在
HGETmyhash field1 #获取key的指定字段的值
HINCRBYmyhash field 1 #递增key的指定字段,值为负,则递减
HINCRBYFLOATmykey field 0.1 #递增key的指定字段,浮点数
HKEYSmyhash #获取key的所有字段
HLENmyhash #获取key的所有字段的数量
HMGETmyhash field1 field2 nofield #获取key的多个字段的值
HMSETmyhash field1 "Hello" field2 "World" #设置key的多个字段的值
HSETNX myhash field "Hello" #设置key的指定字段的值,若key不存在,则创建;若字段已存在,则不操作
HSTRLEN myhash f1 #获取key的指定字段的值的长度
HVALS myhash #获取key的所有的值
2.3 List(列表)
List是string的列表,是根据数据插入的顺序排序的。它是基本的链表。可以向list的头部或者尾部添加元素。LPUSH 向头部插数据,RPUSH 向尾部插数据。当执行这些操作时,会创建一个新的list。
例子:
LPUSHmylist a # 目前list的值"a"
LPUSH mylistb # 目前list的值"b","a"
RPUSH mylistc # 目前list的值"b","a","c"
LRANGE mylist 0-1 # 获取list的所有数据
list的最大长度是232 – 1 (4294967295, 每个list可以有超过40亿的元素)
Redis List从时间复杂度的角度来看,它的主要特征是,当在头部和尾部附近插入和删除元素的时候,是常数级别的,即使是插入好几百万的条目。当访问的元素在list的两端时,速度是非常快的,但是如果访问list中间的数据就会变慢,因为它是一个O(N)操作。
你可以使用Redis的List做很多有趣的事情:
- 在一个社交网络中建立一个时间轴模型,使用LPUSH 在用户时间轴中添加新元素,使用LRANGE来检索最近插入的元素。
- 你可以将LPUSH 和LTRIM 一起使用来创建一个list,让list只保留指定区间内的元素,不在指定区间之内的元素都将被删除,这样仅保存最新的N个元素。
- List可以用作原始消息传递。
- 你可以用list做更多的事情,这种数据类型支持很多命令,包括阻塞命令比如BLPOP
其他命令:
LINDEXmylist 0 #获取list的指定索引处的元素
LSETmylist 0 "four" #设置list的指定索引处的元素
LINSERTmylist BEFORE "World" "There" #在list的"World"值前面插入"There"
LLENmylist #获取list的长度
LPOPmylist #移除和返回list的第一个元素
RPOP mylist #移除和返回list的最后一个元素
LPUSHmylist "hello" #向list头部插入指定的值,假如list不存在,则创建
LPUSHXmylist "Hello" #向list头部插入指定的值,假如list不存在,则不操作
LREMmylist -2 "hello" #删除指定个数的"hello",若为负数,则从尾向头删
LTRIMmylist 1 -1 #截取list指定范围的数据,从0开始,-1最后一个
RPOPLPUSH mylist myotherlist #移除第一个list的最后元素,添加到第二个list的头部,并返回该元素
RPUSHX mylist "World" #向list尾部添加元素,若list不存在,则不操作
BLPOP list1 list2 list3 0 #移除和返回list第一个元素,或者阻塞直到可用为止
BRPOP list1 list2 0 #移除和返回list最后一个元素,或者阻塞直到可用为止
2.4 Set(集合)
唯一的,无序的string元素的集合。可以在时间复杂度为O(1)的情况下添加,删除,和测试成员是否存在(无论Set包含了多少元素,都是常数时间)。
Redis Sets有可以去除重复元素的特征。在一个set中多次插入同样的元素,只会有一个元素的副本。实际上这意味着,添加一个元素不需要先检查它是否存在然后再添加的操作。
关于Redis Set的非常有意思的一件事,是它支持很多服务器端的命令在已存在的set中去计算set,这样一来你可以在很短的时间内做并集,交集,和获取set中的不同元素。
Set的成员最多有232 – 1个(4294967295,每个set可以有超过40亿的元素)
例子:
SADDmyset a #向myset中添加a
SADDmyset b #向myset中添加b
SMEMBERSmyset #获取myset的所有成员,包括"a", "b"
SREMmyset b #删除myset中的b成员
你可以使用Redis的Set做很多有趣的事情:
- 你可以使用Redis Sets来追踪唯一的事情。想知道所有访问指定博客的唯一IP地址吗?只需要每次处理页面的时候使用SADD就行了。可以确保重复的IP不会被插入。
- Redis Set用来表示关系是非常不错的选择。你可以使用Redis Set来创建一个标签系统,每一个Set表示一个标签。你可以使用SADD命令把所有给定标签的对象放进一个表示该特定标签的Set里。你想获取同时拥有3个不同标签的所有对象的ID吗?只需要使用SINTER就行了。
- 你可以使用SPOP 或者 SRANDMEMBER命令,随机提取set中的数据。
其他命令:
SCARDmyset #返回set中元素的个数
SDIFFkey1 key2 #返回第一个set和其他set的不同元素
SDIFFSTORE key key1 key2 #和SDIFF类似,只不过把结果保存在key2中;若key2存在,则覆盖
SINTER key1 key2 #返回所有给定set的交集
SINTERSTORE key key1 key2 #和SINTER类似,只不过把结果保存在key2中;若key2存在,则覆盖
SISMEMBER myset "one" #"one"是否是set的成员
SMOVE myset myotherset "two" #将"two"从源set转移到目的set
SPOP myset 3 #从set中移除或返回一个或多个随机的元素
SRANDMEMBER myset 2 #从set中返回一个或多个随机的元素
SUNION key1 key2 #返回所有给定set的并集
SUNIONSTORE key key1 key2 ##和SUNION类似,只不过把结果保存在key2中;若key2存在,则覆盖
2.5 SortedSet(有序集合)
Redis Sorted Sets是类似于Redis Sets,非重复的字符串的集合。不同之处在于Sorted Set的每个成员都关联一个score,用来将sorted set按照score从小到大进行排序的。成员是唯一的,score可以重复。
使用sorted sets,你可以非常快速的添加,删除或者更新元素(与元素的数量的对数成正比)。由于元素是按顺序放入的,之后就不是有序的,但是你可以很快速的通过score或者排名来获取范围。访问sorted set的中间部分速度也很快,因此你可以把Sorted Sets当成一个无重复元素的list,你可以快速的访问任何你需要的东西:有序的元素,快速测试元素是否存在,快速的访问中间的元素!
简而言之,使用sortedsets你可以很高效的完成很多其他类型的数据库难以完成的任务。
例子:
ZADDsset 1 35 #score为1,值为35
ZADDsset 2 90 #score为2,值为90
ZADDsset 2 80 #score重复,可添加成功
ZRANGEsset 0 -1 #显示所有数据
ZADDsset 3 80 #值重复,添加失败
用sorted sets你可以:
- 在大规模的网络游戏排行榜,每次一个新的分数提交进来你都使用ZADD来更新。你可以很容易的用ZRANGE来获取前几名用户,你也可以用ZRANK根据用户名来返回他的排名。ZRANK和ZRANGE一起使用,你可以根据分数获取用户。
- Sorted Sets经常用来索引存储在Redis内部的数据。比如说,如果你有很多表示用户的哈希表,你可以使用Sorted Sets,用用户的年龄作为score,用用户的ID作为值。这样的话,使用ZRANGEBYSCORE 就可以很简单而且快速的检索到某个年龄段的用户了。
Sorted Sets也许是Redis最高级的数据类型了。
其他命令:
ZCARDmyzset #返回sorted set的元素数量
ZCOUNT myzset (1 3 #返回sorted set中,score在min 和max之间的元素数量