Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set 有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
安装linux 下 使用apt-get install redis 安装
基本使用 启动: redis-server --port 6380Redis服务器默认会使用 6379 端口,通过 --port 参数可以自定义端口号
考虑到Redis 有可能正在将内存中的数据同步到硬盘中,强行终止Redis 进程可能会导致数据丢失。正确停止Redis 的方式应该是向Redis 发送 SHUTDOWN 命令,方法为:
redis-cli SHUTDOWN当Redis 收到 SHUTDOWN 命令后,会先断开所有客户端连接,然后根据配置执行持久化,最后完成退出。
Redis 可以妥善处理SIGTERM 信号,所以使用“kill Redis 进程的PID”也可以正常结束Redis,效果与发送 SHUTDOWN 命令一样。
连接数据库:
redis-cli -h 127.0.0.1 -p 6379或
redis-cli redis 127.0.0.1:6379> PING PONG redis 127.0.0.1:6379> ECHO hi "hi"//Redis 提供了PING 命令来测试客户端与Redis 的连接是否正常,如果连接正常会收到回复PONG。如:
redis-cli PING PONG配置数据库:
配置方法
1.使用redis.conf配置
redis-server /path/to/redis.conf2.通过启动参数配置
redis-server /path/to/redis.conf --loglevel warning3.运行时配置
127.0.0.1:6379> CONFIG SET loglevel warning OK并不是所有参数都可以通过config set 来设置,常见参数配置方式如下:

使用数据库
Redis 是一个字典结构的存储服务器,而实际上一个Redis 实例提供了多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。这与我们熟知的在一个关系数据库实例中可以创建多个数据库类似,所以可以将其中的每个字典都理解成一个独立的数据库。
每个数据库对外都是以一个从0 开始的递增数字命名,Redis 默认支持16 个数据库,可以通过配置参数databases 来修改这一数字。客户端与Redis 建立连接后会自动选择0 号数据库,不过可以随时使用SELECT 命令更换数据库,如要选择1 号数据库:
redis> SELECT 1 OK redis [1]> GET foo (nil)Redis 不支持自定义数据库的名字,每个数据库都以编号命名,开发者必须自己记录哪些数据库存储了哪些数据。另外Redis 也不支持为每个数据库设置不同的访问密码,所以一个客户端要么可以访问全部数据库,要么连一个数据库也没有权限访问。最重要的一点是多个数据库之间并不是完全隔离的,比如FLUSHALL 命令可以清空一个Redis 实例中所有数据库中的数据。综上所述,这些数据库更像是一种命名空间,而不适宜存储不同应用程序的数据。
redis支持通配符规则:

插入: 127.0.0.1:6379> SET bar 1 OK
然后使用KEYS *就能获得Redis 中所有的键,KEYS 命令需要遍历Redis 中的所有键,当键的数量较多时会影响性能,不建议在生产环境中使用。
判断键是否存在:
EXISTS key如果键存在则返回整数类型1,否则返回0
redis> EXISTS bar (integer) 1 redis> EXISTS noexists (integer) 0 删除: DEL key [key …] 获得键值的数据类型: redis> SET foo 1 OK redis> TYPE foo string redis> LPUSH bar 1 (integer) 1 redis> TYPE bar listLPUSH 命令的作用是向指定的列表类型键中增加一个元素,如果键不存在则创建它
字符串类型 命令: 1.赋值与取值 SET key value GET key
2.递增数字,同时创建该key INCR key INCRBY key increment

3.减少指定的整数 DECR key DECRBY key decrement

4.增加指定浮点数 INCRBYFLOAT key increment

5.向尾部追加值 APPEND key value
APPEND 作用是向键值的末尾追加value。如果键不存在则将该键的值设置为value,即相当于 SET key value 。返回值是追加后字符串的总长度。在redis-cli 中输入需要双引号以示区分。

6.获取字符串长度 STRLEN key

7.同时获得/设置多个键值 MGET key [key …] MSET key value [key value …]

8.位操作 GETBIT key offset SETBIT key offset value BITCOUNT key [start] [end] BITOP operation destkey key [key …]
BITOP 命令可以对多个字符串类型键进行位运算,并将结果存储在 destkey 参数指定的
键中。 BITOP 命令支持的运算操作有 AND 、 OR 、 XOR 和 NOT 。

散列类型 命令: 1.赋值与取值 HSET key field value HGET key field HMSET key field value [field value …] HMGET key field [field …] HGETALL key

2.判断字段是否存在\ HEXISTS key field

3.当字段不存在时赋值 HSETNX key field value

HSETNX命令与HSET命令类似,区别在于如果字段已经存在,HSETNX命令将不执行任何操作。 4.增加数字 HINCRBY key field increment

5.删除字段 HDEL key field [field …]

6.只获取字段名或字段值 HKEYS key HVALS key

7.获得字段数量 HLEN key

字符串类型 命令: 1.向列表两端增加元素 LPUSH key value [value …] RPUSH key value [value …]

2.从列表两端弹出元素 LPOP key RPOP key

3.获取列表中元素的个数 LLEN key

4.获得列表片段 LRANGE key start stop

LRANGE命令将返回索引从start 到stop 之间的所有元素(包含两端的元素)。与大多数人的直
觉相同,Redis 的列表起始索引为0. RANGE 返回的值包含最右边的元素.
5.删除列表中指定的值 LREM key count value
LREM 命令会删除列表中前count 个值为value 的元素,返回值是实际删除的元素个数。根据count 值的不同,LREM 命令的执行方式会略有差异:
● 当count > 0 时LREM 命令会从列表左边开始删除前count 个值为value的元素;
● 当count < 0 时LREM 命令会从列表右边开始删除前|count|个值为value的元素;
● 当count = 0 是LREM 命令会删除所有值为value 的元素。
6.获得/设置指定索引的元素值 LINDEX key index
LINDEX 命令用来返回指定索引的元素,索引从0 开始。如果index 是负数则表示从右边开始计算的索引,最右边元素的索引是-1 LSET key index value
LSET 是另一个通过索引操作列表的命令,它会将索引为index 的元素赋值为value
7. 只保留列表指定片段 LTRIM key start endLTRIM 命令可以删除指定索引范围之外的所有元素,其指定列表范围的方法和LRANGE 命令相同.

8.向列表中插入元素 LINSERT key BEFORE|AFTER pivot value
LINSERT 命令首先会在列表中从左到右查找值为pivot 的元素,然后根据第二个参数是BEFORE 还是AFTER 来决定将value 插入到该元素的前面还是后面。LINSERT 命令的返回值是插入后列表的元素个数。

9.将一个元素从一个列表转到另一个列表 RPOPLPUSH sourcedestination
RPOPLPUSH 命令会先从source 列表类型键的右边弹出一个元素,然后将其加入到destination 列表类型键的左边,并返回这个元素的值,整个过程是原子的。

集合类型
【无序集合】
集合中的每个元素都是不同的,且没有顺序。
命令:
1.增加/删除元素 SADD key member [member …] SREM key member [member …]//SADD 命令用来向集合中增加一个或多个元素,如果键不存在则会自动创建。因为在一个集合中不能有相同的元素,所以如果要加入的元素已经存在于集合中就会忽略这个元素。本命令的返回值是成功加入的元素数量。SREM 命令用来从集合中删除一个或多个元素,并返回删除成功的个数。
2.获得集合中的所有元素 SMEMBERS keySMEMBERS 命令会返回集合中的所有元素。

3.判断元素是否在集合中 SISMEMBER key member

4.集合间运算 SDIFF key [key …]
SDIFF 命令用来对多个集合执行差集运算。多个set 时,后一个与前两个差集 进行运算。
SINTER key [key …]SINTER 命令用来对多个集合执行交集运算。多个set时,同上。
SUNION key [key …]SUNION 命令用来对多个集合执行并集运算。多个set时,同上。

5. 获得集合中元素个数 SCARD key

SCARD 命令用来获得集合中的元素个数 6.进行集合运算并将结果存储 SDIFFSTORE destination key [key …]

SDIFFSTORE 命令和SDIFF 命令功能一样,唯一的区别就是前者不会直接返回运算结果,而是将结果存储在destination 键中。 SINTERSTORE destination key [key …]
SDIFFSTORE 功能同上类似,命令常用于需要进行多步集合运算的场景中,如需要先计算差集再将结果和其他键计算交集。
SUNIONSTORE destination key [key …]SINTERSTORE 和SUNIONSTORE 命令与之类似,不再赘述。
7.随机获得集合中的元素 SRANDMEMBER key [count]SRANDMEMBER 命令用来随机从集合中获取count个元素

8.从集合中弹出一个元素 SPOP key
//SPOP 命令会从集合中随机选择一个元素弹出。

【有序集合】
有序集合类型为集合中的每个元素都关联了一个分数,这使得我们不仅可以完成插入、删除和判断元素是否存在等集合类型支持的操作,还能够获得分数最高(或最低)的前N 个元素、获得指定分数范围内的元素等与分数有关的操作。虽然集合中每个元素都是不同的,但是它们的分数却可以相同。
命令: 1.增加元素 ZADD key score member [score member …]ZADD 命令用来向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。ZADD 命令的返回值是新加入到集合中的元素个数(不包含之前已经存在的元素,即使分数改变了)。
2.获得元素的分数 ZSCORE key member 3.获得排名在某个范围的元素列表 ZRANGE key start stop [WITHSCORES]ZRANGE 命令会按照元素分数从小到大的顺序返回索引从start 到stop 之间的所有元素(包含两端的元素)。ZRANGE 命令与LRANGE 命令十分相似,如索引都是从0 开始,负数代表从后向前查找(1 表示最后一个元素)。如果需要同时获得元素的分数的话可以在ZRANGE 命令的尾部加WITHSCORES 参数。如果两个元素的分数相同,Redis 会按照字典顺序来进行排列。再进一步,如果元素的值是中文怎么处理呢?答案是取决于中文的编码方式,如使用UTF-8 编码。
ZREVRANGE key start stop [WITHSCORES]ZREVRANGE 命令和ZRANGE 的唯一不同在于ZREVRANGE 命令是按照元素分数从大
到小的顺序给出结果的。
4.获得指定分数范围的元素 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]按照元素分数从小到大的顺序返回分数在 min 和 max 之间(包含 min 和 max )的元素。如果希望分数范围不包含端点值,可以在分数前加上“(”符号。
如: ZRANGEBYSCORE scoreboard 80 (100min 和 max 还支持无穷大,同 ZADD 命令一样, -inf 和 +inf 分别表示负无穷和正无穷。 WITHSCORES 参数的用法与 ZRANGE 命令一样,不再赘述。
LIMIT offset count 与 SQL 中的用法基本相同,即在获得的元素列表的基础上向后偏移 offset 个元素,并且只获取前 count 个元素。

5.增加某个元素的分数 ZINCRBY key increment member
ZINCRBY 命令可以增加一个元素的分数,返回值是更改后的分数。increment 为增量,负数为减分。
6. 获得集合中元素的数量 ZCARD key7.获得指定分数范围内的元素个数
ZCOUNT key min max 8.删除一个或多个元素 ZREM key member [member …]ZREM 命令的返回值是成功删除的元素数量(不包含本来就不存在的元素)。
9.按照排名范围删除元素 ZREMRANGEBYRANK key start stopZREMRANGEBYRANK 命令按照元素分数从小到大的顺序(即索引0 表示最小的值)删除处在 指定排名范围内的所有元素,并返回删除的元素数量。
10.按照分数范围删除元素 ZREMRANGEBYSCORE key min maxZREMRANGEBYSCORE 命令会删除指定分数范围内的所有元素,参数 min 和 max 的特性和 ZRANGEBYSCORE 命令中的一样。返回值是删除的元素数量。
11.获得元素的排名 ZRANK key member ZREVRANK key memberZRANK 命令会按照元素分数从小到大的顺序获得指定的元素的排名(从0 开始,即分数最小的元素排名为0)。
12.计算有序集合的交集 ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX]ZINTERSTORE 命令用来计算多个有序集合的交集并将结果存储在 destination 键中(同样以有序集合类型存储),返回值为 destination 键中的元素个数。
destination 键中元素的分数是由AGGREGATE 参数决定的
● 当 AGGREGATE 是 SUM 时(也就是默认值), destination 键中元素的分数是每个参与计算的集合中该元素分数的和。
● 当 AGGREGATE 是 MIN 时, destination 键中元素的分数是每个参与计算的集合中该元素分数的最小值。
● 当 AGGREGATE 是 MAX 时, destination 键中元素的分数是每个参与计算的集合中该元素分数的最大值。
WEIGHTS 参数设置每个集合的权重,每个集合在参与计算时元素的分数会被乘上该集合的权重。
另外还有一个命令与 ZINTERSTORE 命令的用法一样,名为 ZUNIONSTORE ,它的作
用是计算集合间的并集,这里不再赘述。
进阶 1.事务(transaction)Redis 中的事务(transaction)是一组命令的集合。事务同命令一样都是Redis 的最小执行单位,一个事务中的命令要么都执行,要么都不执行。事务的原理是先将属于一个事务的命令发送给Redis,然后再让Redis 依次执行这些命令。
格式:
redis> MULTI OK redis> other command1 QUEUED ................... redis> other command2 QUEUED redis> EXECRedis 保证一个事务中的所有命令要么都执行,要么都不执行。如果在发送 EXEC 命令前客户端断线了,则Redis 会清空事务队列,事务中的所有命令都不会执行。而一旦客户端发送了 EXEC 命令,所有的命令就都会被执行,即使此后客户端断线也没关系,因为Redis中已经记录了所有要执行的命令。除此之外,Redis 的事务还能保证一个事务内的命令依次执行而不被其他命令插入。
错误处理:
● 语法错误
只要有一个命令有语法错误,执行EXEC命令后Redis就会直接返回错误,连语法正确的命令也不会执行
● 运行错误
事务里其他的命令依然会继续执行(包括出错命令之后的命令)。
Redis的事务没有关系数据库事务提供的回滚(rollback)功能。为此开发者必须在事务执行出错后自己收拾剩下的摊子(将数据库复原回事务执行前的状态等)。
WATCH 命令
WATCH 命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行。监控一直持续到 EXEC 命令(事务中的命令是在 EXEC 之后才执行的,所以在 MULTI 命令后可以修改 WATCH 监控的键值)。执行 EXEC 命令后会取消对所有键的监控,如果不想执行事务中的命令也可以使用 UNWATCH 命令来取消监控
2. 生存时间在Redis 中可以使用 EXPIRE 命令设置一个键的生存时间,到时间后Redis 会自动删除它。
使用方法:
EXPIRE key seconds其中 seconds 参数表示键的生存时间,单位是秒。
如果想知道一个键还有多久的时间会被删除,可以使用TTL 命令。返回值是键的剩余时间(单位是秒):
TTL foo当键不存在时TTL 命令会返回1。另外同样会返回1 的情况是没有为键设置生存时间(即永久存在,这是建立一个键后的默认情况)。
如果想取消键的生存时间设置(即将键恢复成永久的),可以使用PERSIST 命令。如果生存时间被成功清除则返回1;否则返回0(因为键不存在或键本来就是永久的):
PERSIST foo除了 PERSIST 命令之外,使用 SET 或 GETSET 命令为键赋值也会同时清除键的生存时间,再次使用 EXPIRE 命令会重新设置键的生存时间。其他只对键值进行操作的命令(如 INCR 、 LPUSH 、 HSET 、 ZREM )均不会影响键的生存时间。
EXPIRE 命令的 seconds 参数必须是整数,所以最小单位是1 秒。如果想要更精确的控制键的生存时间应该使用 PEXPIRE 命令, PEXPIRE 命令与 EXPIRE 的唯一区别是前者的时间单位是毫秒,即 PEXPIRE key 1000 与 EXPIRE key 1 等价。对应地可以用 PTTL 命令以毫秒为单位返回键的剩余时间。如果使用 WATCH 命令监测了一个拥有生存时间的键,该键时间到期自动删除并不会被 WATCH 命令认为该键被改变。
另外还有两个相对不太常用的命令: EXPIREAT 和 PEXPIREAT 。 EXPIREAT 命令与 EXPIRE 命令的差别在于前者使用 Unix 时间作为第二个参数表示键的生存时间的截止时间。 PEXPIREAT 命令与 EXPIREAT 命令的区别是前者的时间单位是毫秒。
3.排序命令:
SORT KEYS [ALPHA]SORT 命令可以对列表类型、集合类型和有序集合类型键进行排序,并且可以完成与关系数据库中的连接查询相类似的任务。在对有序集合类型排序时会忽略元素的分数,只针对元素自身的值进行排序。
除了可以排列数字外,SORT 命令还可以通过ALPHA 参数实现按照字典顺序排列非数字元素.如果没有加ALPHA 参数的话,SORT 命令会尝试将所有元素转换成双精度浮点数来比较,如果无法转换则会提示错误。SORT 命令还支持LIMIT 参数来返回指定范围的结果。用法和SQL 语句一样,LIMIT offset count,表示跳过前offset 个元素并获取之后的count 个元素。
BY 参数的语法为“BY 参考键”。
其中参考键可以是字符串类型键或者是散列类型键的某个字段(表示为键名->字段名)。如果提供了BY 参数,SORT 命令将不再依据元素自身的值进行排序,而是对每个元素使用元素的值替换参考键中的第一个“*”并获取其值,然后依据该值对元素排序.当参考键名不包含“*”时(即常量键名,与元素值无关),SORT 命令将不会执行排序操作,因为Redis 认为这种情况是没有意义的(因为所有要比较的值都一样).
GET 参数不影响排序,它的作用是使SORT 命令的返回结果不再是元素自身的值,而是GET 参数中指定的键值。G