redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
适用场景:
QPS非常高
大都是热数据
数据持久化时间不长
经常发生变更
2.安装
brew install redis
文件名 | 描述 |
---|---|
redis-cli | redis命令行客户端 |
redis-server | redis服务端 |
redis-benchmark | redis基准测试 |
redis-check-aof | redis的aof持久化文件修复 |
redis-check-dump | redis的rdb持久化文件修复 |
redis-sentinel | redis集群管理工具 |
(1) 默认配置启动:redis-server即可启动Redis服务。Redis默认监听6379端口,通过–port参数可以自定义端口号。
(2) 初始化脚本启动:为了使Redis能够自动启动,在生产环境中要用此法运行。在Redis源码目录utils文件夹下有个redis_init_script的初始化脚本文件,我们需要配置Redis的运行方式和持久化文件、日志文件的存储位置等。
停止:redis-cli SHUTDOWN
3. 客户端命令
redis-cli -h 127.0.0.1 -p 6379,-h参数指定host,-p命令指定端口,默认如果不输入任何参数的话就是连接的本机本地服务。
redis-cli PING 是redis提供的一个测试客户端与Redis连接是否正常的测试,如果正常,会返回PONG。
注:redis命令不区分大小写,所以get var和GET var是等价的
序号 | Redis keys命令及描述 |
---|---|
1 | DEL key |
2 | DUMP key |
3 | EXISTS key |
4 | EXPIRE key seconds |
5 | EXPIREAT key timestamp |
6 | PEXPIRE key milliseconds |
7 | PEXPIREAT key milliseconds-timestamp |
8 | KEYS pattern |
9 | MOVE key db |
10 | PERSIST key |
11 | PTTL key |
12 | TTL key |
13 | RANDOMKEY |
14 | RENAME key newkey |
15 | RENAMENX key newkey |
16 | TYPE key |
4 Redis数据结构
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
4.1 string(字符串)
常用命令:set,get,decr,incr,mget 等。。
是Redis最基本的数据类型,可以理解成与Memcached一模一样的类型,一个key对应一个value
二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象
一个键最大能存储512MB
存储string类型的键值对。一般形式:set key value; setnx key value; setex key time value
setnx判断插入内容的键是否存在,若键不存在,返回1,成功插入;若存在,返回0,插入失败。如果不用setnx用set的话,若插入内容的键已经存在,那么此次插入的值将会覆盖原先的这个键对应的值。
setex添加了value的存在时间time,当超过这个时间key所对应的value值将被清空,再查这个key将返回nil(即空)。
127.0.0.1:6379> set name shiwenhao
OK
127.0.0.1:6379> get name
"shiwenhao"
127.0.0.1:6379> setnx name 123
(integer) 0
127.0.0.1:6379> get name
"shiwenhao"
4.2 Hash(哈希)
常用命令:hget,hset,hgetall,hmget,hmset等。
是一个键值对集合
是一个string类型的field和value的映射表,hash特别适合用于存储对象
127.0.0.1:6379> hset set1 name shi
(integer) 1
127.0.0.1:6379> hset set1 sex boy
(integer) 1
127.0.0.1:6379> hget set1 name
"shi"
127.0.0.1:6379> hget set1 sex
"boy"
hset&hget一次只能往哈希结构里面插入一个键值对,如果插入多个可以用hmset&hmget
127.0.0.1:6379> hmset set2 name wen school ncepu sex boy
OK
127.0.0.1:6379> hmget set2 name
1) "wen"
127.0.0.1:6379> hgetall set2
1) "name"
2) "wen"
3) "school"
4) "ncepu"
5) "sex"
6) "boy"
127.0.0.1:6379> hmget set2 name sex
1) "wen"
2) "boy"
4.3 List(列表)
常用命令:lpush,rpush,lpop,rpop,lrange等。
使用场景:
Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现。
Lists 就是链表,相信略有数据结构知识的人都应该能理解其结构。使用Lists结构,我们可以轻松地实现最新消息排行等功能。Lists的另一个应用就是消息队列,
可以利用Lists的PUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出进行执行。Redis还提供了操作Lists中某一段的api,你可以直接查询,删除Lists中某一段的元素。
127.0.0.1:6379> lpush var 1
(integer) 1
127.0.0.1:6379> lpush var a
(integer) 2
127.0.0.1:6379> lpush var ab
(integer) 3
127.0.0.1:6379> lrange var 0 1
1) "ab"
2) "a"
127.0.0.1:6379> lrange var 0 10
1) "ab"
2) "a"
3) "1"
127.0.0.1:6379> lrange var 2 2
1) "1"
lpush往列表的前边插入;lrange后面的数字是范围(闭区间)
4.4 set(集合)
常用命令:sadd,spop,smembers,sunion 等。
Redis的Set是string类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)
使用场景:
Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
Sets 集合的概念就是一堆不重复值的组合。利用Redis提供的Sets数据结构,可以存储一些集合性的数据,比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。
127.0.0.1:6379> sadd setvar redis
(integer) 1
127.0.0.1:6379> sadd setvar mongodb
(integer) 1
127.0.0.1:6379> sadd setvar mongodb
(integer) 0
127.0.0.1:6379> sadd setvar rabbitmq
(integer) 1
127.0.0.1:6379> smembers setvar
1) "rabbitmq"
2) "redis"
3) "mongodb"
set往集合中插入元素,smembers列举出集合中的元素
成功插入返回1;错误插入返回0,例子中mongodb第二次插入时,因已经存在,故插入失败。
4.5 zset(sorted sete:有序集合)
常用命令:zadd,zrange,zrem,zcard等
zset和set一样也是String类型的集合,且不允许元素重复
zset和set不同的地方在于zset关联一个double类型的分数,redis通过分数对集合中的元素排序。zset的元素是唯一的,但是分数是可以重复的
使用场景:
Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。
另外还可以用Sorted Sets来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。
127.0.0.1:6379> zadd zvar 1 redis
(integer) 1
127.0.0.1:6379> zadd zvar 1 redis
(integer) 0
127.0.0.1:6379> zadd zvar 2 redis
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> zadd zvar 2 mongo
(integer) 1
127.0.0.1:6379> zadd zvar 0 rabbitmq
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379> ZRANGEBYSCORE zvar 0 1000
1) "rabbitmq"
2) "mongo"
3) "redis"
zadd zset num value:向zset中添加value,并置序列号为num。
zrange zset 0 -1:顺序返回zset中所有元素。
zrevrange zset 0 -1:逆序返回zset中所有元素。
zrange zset 0 -1 withscores:顺序返回zset中所有元素,并带有序列号。
zrevrange zset 0 -1 withscores:逆序返回zset中所有元素,并带有序列号。
zincrby zset num value:将zset中value所对应的序列号增加num。
zrank zset value:返回zset中value在顺序排序后的顺序(即该value是第几位,从第0位开始)。
zrevrank zset value:返回zset中value在逆序排序后的顺序(即该value是第几位,从第0位开始)。
zrangebyscore zset num0 num1 withscores:按序列号返回zset中序列号num0-num1的所有元素,并带有序列号。
zcard zset:返回zset中所有元素的个数。
zcount zset num0 num1:返回zset中序列号在num0-num1之间所有元素的个数。
zremrangebyrank zset num0 num1:删除zset中排序从num0到num1之间的所有元素(排序从0开始计数)。
zremrangebyscore zset num0 num1:删除zset中序列号从num0-num1之间的所有元素。