redis是一个key-value 存储系统。和Memcached相似,它支持存储的value类型相对更多,包括string(字符串)、list( 链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些 数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操做,并且这些操做都是原子性的。在此基础上,redis支持各类不一样方式的排序。与memcached同样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操做写入追加的记录文件,而且在此基础上实现了master-slave(主从)同步。
至于如何安装、配置redis,此处不作讲解。此文主要讲解redis的基本数据结构以及使用redis客户端的基本操做命令。另外下面命令演示时,大写的命令格式为官方定义格式,小写的为具体使用格式。正则表达式
实际上能够是字符串(包括xml、json),还有数字(整型、浮点型),二进制(图片、音频、视频)redis
//设置一个键的值,能够带一个过时时间 SET key value [EX seconds] [PX milliseconds] [NX|XX] set name jmx //直接设置name=jmx set 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 value setnx name cndy //不存在键name就设置成功,存在时设置失败
//获取键的值 GET key get name //返回jmx //批量获取键的值 MGET key [key ...] mget name sex age //批量获取name、sex、age,返回jmx、boy、18
虽然存储的是字符串,可是也能够是数字字符串,所以redis支持递增或者递减的操做数据库
set num 10 //先在redis中设置一个数字字符串 //对存储在指定key的数值执行原子的加1操做 INCR key incr num //num自增长1,而且返回11 //将key对应的数字加decrement INCRBY key increment incrby num 10 //num的值加10,返回21 //对key对应的数字作减1操做 DECR key decr num //num减1,返回20 //将key对应的数字减decrement DECRBY key decrement decrby num 10 //num值减20,返回10
//若是 key 已经存在,而且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。 //若是 key 不存在,那么它将首先建立一个空字符串的key,再执行追加操做 APPEND key value append name luckly //name原来的值为:jmx,执行此命令以后name的值为:jmxluckly //返回key的string类型value的长度。 //若是key对应的非string类型,就返回错误 STRLEN key strlen name //返回jmxluckly的长度9 //截取字符串 //可使用-1表示最后一个字符串的位置,-2表示倒数第二个字符串的位置 GETRANGE key start end getrange name 1 5 //返回mxluc,返回第一个到第无个之间的字符串
Redis hash是一个string类型的field和value的映射表.一个key可对应多个field,一个field对应一个value。hash特适合用于存储对象。咱们假设有一个用户信息以下json
用户id | 用户编码 | 用户名称 | 性别 | 年龄 |
---|---|---|---|---|
1 | jmx | 君莫笑 | boy | 18 |
接下来咱们使用命令来将用户信息以hash的方式存入到redis中缓存
//设置 key 指定的哈希集中指定字段的值。 //若是 key 指定的哈希集不存在,会建立一个新的哈希集并与 key 关联。 //若是字段在哈希集中存在,它将被重写。 HSET key field value hset user:1 usercode jmx //设置键user:1的属性usercode的值为jmx //存在不作任何操做、不存在相似HSET的功能 HSETNX key field value hsetnx 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 increment hincrby user:1 age 1 //对age属性加1(我又大一岁了)
//返回 key 指定的哈希集中该字段所关联的值 HGET key field hget 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 key hgetall user:1 //返回user:1的全部属性和全部值 //返回 key 指定的哈希集中全部字段的名字 HKEYS key hkeys user:1 //返回usercode、sex、age //返回 key 指定的哈希集中全部字段的值 HVALS key hvals user:1 //返回user:1的全部属性对应的值(不包含属性)
//从 key 指定的哈希集中移除指定的域。在哈希集中不存在的域将被忽略。 HDEL key field [field ...] hdel user:1 age //移除user:1的age属性
//返回hash里面field是否存在 HEXISTS key field hexists user:1 age //返回0,由于上面使用hdel命令把age属性移除了 //返回 key 指定的哈希集包含的字段的数量 HLEN key hlen user:1 //返回2,2个属性(usercode和sex) //返回hash指定field的value的字符串长度,若是hash或者field不存在,返回0. HSTRLEN key field hstrlen user:1 usercode //返回3,usercode的值为jmx,长度为3 hstrlen user:1 age //返回0,age属性不存在,返回0
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 value linsert list before b tearcher //在b以前插入tearcher
//移除而且返回 key 对应的 list 的第一个元素 LPOP key lpop list //返回并移除列表中的第一个元素 //移除并返回存于 key 的 list 的最后一个元素 RPOP key rpop list //返回并移除列表中的最后一个元素
//返回存储在 key 的列表里指定范围内的元素 //从0开始。-1表示最后一个元素 LRANGE key start stop lrange list 0 -1 //查询list的全部元素(0为起始下标,-1为终止下标) //返回存储在 key 里的list的长度 LLEN key llen list
//从存于 key 的列表里移除前 count 次出现的值为 value 的元素。 //这个 count 参数经过下面几种方式影响这个操做: //count > 0: 从头往尾移除值为 value 的元素。 //count < 0: 从尾往头移除值为 value 的元素。 //count = 0: 移除全部值为 value 的元素。 LREM key count value lrem list 0 a //移除list中全部的a
Redis 的 Set 是 String 类型的无序集合。集合成员是惟一的,这就意味着集合中不能出现重复的数据。app
//添加一个或多个指定的member元素到集合的key中 SADD key member [member ...] sadd sets write read play write //由于不能重复,所以sets中只有write、read、play
//返回key集合全部的元素 SMEMBERS key smembers sets //获取sets中的全部元素 //返回成员 member 是不是存储的集合 key的成员 SISMEMBER key member sismember sets read //返回1,表示存在该元素 //查询集合的长度 SCARD key scard sets //返回sets中总共有多少元素之和 //取指定全部集合的交集 SINTER key [key ...] sinter set1 set2 set3 //取set一、set二、set3三个集合的交集 //取全部指定集合的并集 SUNION key [key ...] sunion set1 set2 set3 //取set一、set二、set3三个集合的并集 //取集合的差集 SDIFF key [key ...] sidff set1 set2 //取集合set一、set2的差集
//在key集合中移除指定的元素 SREM key member [member ...] srem sets play //将play属性从sets中移除
zset是set的一个升级版本,他在set的基础上增长了一个顺序属性,这一属性在添加修改元素的时候能够指定,每次指定后,zset会自动从新按新的值调整顺序。由于带有排序,因此适合好比排行榜之类的功能。memcached
//将全部指定成员添加到键为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、1000 zadd scan nx 100 goodd //键scan必须不存在,主用于添加 zadd scan xx incr 200 goodd //键scan必须存在,主用于修改,商品d新增200浏览量 //为有序集key的成员member的score值加上增量increment ZINCRBY key increment member zincrby 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 key type name //查看键name类型,返回string //选择一个数据库,下标值从0开始,一个新链接默认链接的数据库是DB0 SELLECT index select 1 //切换到DB1 //为redis服务请求设置一个密码 AUTH password auth 123456 //若是设置了redis密码的话,使用此命令设置密码 //删除当前数据库里面的全部数据 FLUSHDB //删除全部数据库里面的全部数据,注意不是当前数据库,而是全部数据库 FLUSHALL //返回当前数据里面keys的数量 DBSIZE //查找全部符合给定模式pattern(正则表达式)的 key KEYS pattern keys * //查询全部的key,慎用(由于redis是单线程,使用此命令会阻塞其余的命令)
由于命令太多,上述命令只是redis中的一部分命令而已。更多的命令但愿你们去redis官网查看相关的文档。线程
同时若是你们发现了错误,但愿能留言提出来,以避免误人子弟。