redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
至于如何安装、配置redis,此处不做讲解。此文主要讲解redis的基本数据结构以及使用redis客户端的基本操作命令。另外下面命令演示时,大写的命令格式为官方定义格式,小写的为具体使用格式。
字符串(string)
实际上可以是字符串(包括xml、json),还有数字(整型、浮点型),二进制(图片、音频、视频)
设值命令
//设置一个键的值,可以带一个过期时间SET key value [EX seconds] [PX milliseconds] [NX|XX]set name jmx //直接设置name=jmxset version 1.0 ex 10 //设置version=1.0,并且10s后过期ttl version //设置了过期时间之后,使用ttl命令可以看到键的剩余过去时间//批量设置MSET key value [key value ...]mset sex boy age 18 //批量设置sex=boy,age=18//如果key存在,不执行任何操作,如果key不存在,等价于set命令SETNX key valuesetnx name cndy //不存在键name就设置成功,存在时设置失败
取值命令
//获取键的值GET keyget name //返回jmx//批量获取键的值MGET key [key ...]mget name sex age //批量获取name、sex、age,返回jmx、boy、18
虽然存储的是字符串,但是也可以是数字字符串,因此redis支持递增或者递减的操作
数字操作
set num 10 //先在redis中设置一个数字字符串//对存储在指定key的数值执行原子的加1操作INCR keyincr num //num自增加1,并且返回11//将key对应的数字加decrementINCRBY key incrementincrby num 10 //num的值加10,返回21//对key对应的数字做减1操作DECR keydecr num //num减1,返回20//将key对应的数字减decrementDECRBY key decrementdecrby num 10 //num值减20,返回10
其他命令
//如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。 //如果 key 不存在,那么它将首先创建一个空字符串的key,再执行追加操作APPEND key valueappend name luckly //name原来的值为:jmx,执行此命令之后name的值为:jmxluckly//返回key的string类型value的长度。//如果key对应的非string类型,就返回错误STRLEN keystrlen name //返回jmxluckly的长度9//截取字符串//可以使用-1表示最后一个字符串的位置,-2表示倒数第二个字符串的位置GETRANGE key start endgetrange name 1 5 //返回mxluc,返回第一个到第无个之间的字符串
哈希(hash)
Redis hash是一个string类型的field和value的映射表.一个key可对应多个field,一个field对应一个value。hash特适合用于存储对象。我们假设有一个用户信息如下
用户id | 用户编码 | 用户名称 | 性别 | 年龄 |
---|---|---|---|---|
1 | jmx | 君莫笑 | boy | 18 |
接下来我们使用命令来将用户信息以hash的方式存入到redis中
设值命令
//设置 key 指定的哈希集中指定字段的值。//如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联。//如果字段在哈希集中存在,它将被重写。HSET key field valuehset user:1 usercode jmx //设置键user:1的属性usercode的值为jmx//存在不做任何操作、不存在类似HSET的功能HSETNX key field valuehsetnx user:1 usercode jmxs //因为user:1的usercode已存在,所以不执行任何操作。返回0//批量设置key的属性(多个属性)HMSET key field value [field value ...]hmset user:1 usercode jmx sex boy age 18 //同时设值键userf:1的属性usercode、sex、age//增加 key 指定的哈希集中指定字段的数值HINCRBY key field incrementhincrby user:1 age 1 //对age属性加1(我又大一岁了)
取值命令
//返回 key 指定的哈希集中该字段所关联的值HGET key fieldhget user:1 usercode //返回user:1的属性usercode的值jmx(因为上面设值了user:1的usercode的值为jmx)//返回 key 指定的哈希集中指定字段的值。//对于哈希集中不存在的每个字段,返回nil值,因为不存在的keys被认为是一个空的哈希集。//对一个不存在的key执行HMGET将返回一个只含有nil值的列表HMGET key field [field ...]hmget user:1 age sex usercode //返回:18 boy jmx//返回 key 指定的哈希集中所有的字段和值。//返回值中,每个字段名的下一个是它的值,所以返回值的长度是哈希集大小的两倍HGETALL keyhgetall user:1 //返回user:1的所有属性和所有值//返回 key 指定的哈希集中所有字段的名字HKEYS keyhkeys user:1 //返回usercode、sex、age//返回 key 指定的哈希集中所有字段的值HVALS keyhvals user:1 //返回user:1的所有属性对应的值(不包含属性)
删值命令
//从 key 指定的哈希集中移除指定的域。在哈希集中不存在的域将被忽略。HDEL key field [field ...]hdel user:1 age //移除user:1的age属性
其他命令
//返回hash里面field是否存在HEXISTS key fieldhexists user:1 age //返回0,因为上面使用hdel命令把age属性移除了//返回 key 指定的哈希集包含的字段的数量HLEN keyhlen user:1 //返回2,2个属性(usercode和sex)//返回hash指定field的value的字符串长度,如果hash或者field不存在,返回0.HSTRLEN key fieldhstrlen user:1 usercode //返回3,usercode的值为jmx,长度为3hstrlen user:1 age //返回0,age属性不存在,返回0
列表(list)
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),也可以从头部(左边)或者尾部(右边)拿到一个元素。
设值命令
//将所有指定的值插入到存于 key 的列表的头部//如果 key 不存在,那么在进行 push 操作前会创建一个空列表。 //如果 key 对应的值不是一个 list 的话,那么会返回一个错误。LPUSH key value [value ...]lpush list a b c //把a b c依次从头部放入list中//依次从尾部插入列表,使用方式和LPUSH方式一样,省略演示代码RPUSH key value [value ...]//在某个内容之前或者之后插入LINSERT key BEFORE|AFTER pivot valuelinsert list before b tearcher //在b之前插入tearcher
取值命令
//移除并且返回 key 对应的 list 的第一个元素LPOP keylpop list //返回并移除列表中的第一个元素//移除并返回存于 key 的 list 的最后一个元素RPOP keyrpop list //返回并移除列表中的最后一个元素
查询命令
//返回存储在 key 的列表里指定范围内的元素//从0开始。-1表示最后一个元素LRANGE key start stoplrange list 0 -1 //查询list的所有元素(0为起始下标,-1为终止下标)//返回存储在 key 里的list的长度LLEN keyllen list
删除命令
//从存于 key 的列表里移除前 count 次出现的值为 value 的元素。 //这个 count 参数通过下面几种方式影响这个操作://count > 0: 从头往尾移除值为 value 的元素。//count < 0: 从尾往头移除值为 value 的元素。//count = 0: 移除所有值为 value 的元素。LREM key count valuelrem list 0 a //移除list中所有的a
集合(set)
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
添加命令
//添加一个或多个指定的member元素到集合的key中SADD key member [member ...]sadd sets write read play write //因为不能重复,因此sets中只有write、read、play
查询命令
//返回key集合所有的元素SMEMBERS keysmembers sets //获取sets中的所有元素//返回成员 member 是否是存储的集合 key的成员SISMEMBER key membersismember sets read //返回1,表示存在该元素//查询集合的长度SCARD keyscard sets //返回sets中总共有多少元素之和//取指定所有集合的交集SINTER key [key ...]sinter set1 set2 set3 //取set1、set2、set3三个集合的交集//取所有指定集合的并集SUNION key [key ...]sunion set1 set2 set3 //取set1、set2、set3三个集合的并集//取集合的差集SDIFF key [key ...]sidff set1 set2 //取集合set1、set2的差集
移除命令
//在key集合中移除指定的元素SREM key member [member ...]srem sets play //将play属性从sets中移除
顺序集合(zset)
zset是set的一个升级版本,他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。因为带有排序,所以适合比如排行榜之类的功能。
添加命令
//将所有指定成员添加到键为key有序集合(sorted set)里面ZADD key [NX|XX] [CH] [INCR] score member [score member ...]zadd scan 1500 gooda 500 goodb 1000 goodc //商品a、b、c的浏览量为分别为1500、500、1000zadd scan nx 100 goodd //键scan必须不存在,主用于添加zadd scan xx incr 200 goodd //键scan必须存在,主用于修改,商品d新增200浏览量//为有序集key的成员member的score值加上增量incrementZINCRBY key increment memberzincrby scan 200 gooda //给商品a增加200的浏览量
查看命令
//返回存储在有序集合key中的指定范围的元素//-1未之后一个元素//返回的元素可以认为是按得分从最低到最高排列ZRANGE key start stop [WITHSCORES]zrange scan 0 1 withscores //查询点击量最低的2个商品//返回存储在有序集合key中的指定范围的元素//-1未之后一个元素//返回的元素可以认为是按得分从最高到低高排列ZREVRANGE key start stop [WITHSCORES]zrevrange scan 0 1 withscores //查询点击量最高的2个商品//以下命令比较简单,省略演示//返回有序集key中成员member的排名(从小到大)ZRANK key member//返回有序集key中成员member的排名(从大到小)ZREVRANK key member//返回有序集key中,成员member的score值ZSCORE key member//返回key的有序集元素个数ZCARD key
删除命令
//删除一个元素ZREM key member [member ...]zrem scan goodc //将商品c的浏览量从集合中删除
其他常用命令
除了上述类型操作命令之后,还要一些常用的命令如下
//返回key所存储的value的数据结构类型,它可以返回string, list, set, zset 和 hash等不同的类型TYPE keytype name //查看键name类型,返回string//选择一个数据库,下标值从0开始,一个新连接默认连接的数据库是DB0SELLECT indexselect 1 //切换到DB1//为redis服务请求设置一个密码AUTH passwordauth 123456 //如果设置了redis密码的话,使用此命令设置密码//删除当前数据库里面的所有数据FLUSHDB//删除所有数据库里面的所有数据,注意不是当前数据库,而是所有数据库FLUSHALL//返回当前数据里面keys的数量DBSIZE//查找所有符合给定模式pattern(正则表达式)的 keyKEYS patternkeys * //查询所有的key,慎用(因为redis是单线程,使用此命令会阻塞其他的命令)
总结
因为命令太多,上述命令只是redis中的一部分命令而已。更多的命令希望大家去redis官网查看相关的文档。
同时如果大家发现了错误,希望能留言提出来,以免误人子弟。