简介
Redis是一个开源、先进的key-value存储系统,可用于构建高性能、可扩展的Web应用程序。
特点
1.完全在内存中,使用磁盘仅用于持久性
2.相比许多键值数据存储,Redis拥有一套较为丰富的数据类型
3.Redis可以将数据复制到任意数量的从服务器
优势
- 异常快速:Redis的速度非常快,每秒能执行约11万读操作,每秒能执行约8.1万写操作。
- 支持丰富的数据类型:Redis支持大多数开发人员已经知道的像列表,集合,有序集合,散列等数据类型。
- 操作都是原子性:所有Redis操作是原子的。
- 多功能实用工具:Redis是一个多功能实用的工具,可以用于多种场景,比如缓存,消息,队列使用(Redis原生支持发布/订阅)等
下载与安装
wget http://download.redis.io/releases/redis-3.2.8.tar.gz
tar xzf redis-3.2.8.tar.gz
cd redis-3.2.8
make
启动服务
./src/redis-server
测试
./src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
类型及命令
-
字符串
set key value get key
eg
127.0.0.1:6379> set mytest 'this is a test' OK 127.0.0.1:6379> get mytest "this is a test"
-
哈希
hset key field value hget key field hgetall key
eg
127.0.0.1:6379> hset hashtest num 1 (integer) 1 127.0.0.1:6379> hset hashtest age 2 (integer) 1 127.0.0.1:6379> hget hashtest age "2" 127.0.0.1:6379> hgetall hashtest 1) "num" 2) "1" 3) "age" 4) "2" 127.0.0.1:6379>
-
列表
lpush key value [value ...] lrange key start stop
eg
127.0.0.1:6379> lpush listtest a b c d (integer) 4 127.0.0.1:6379> lrange listtest 0 1 1) "d" 2) "c"
-
无序集合
sadd key member [member ...] smembers key
eg
127.0.0.1:6379> sadd settest this is a test (integer) 4 127.0.0.1:6379> smembers settest 1) "this" 2) "test" 3) "a" 4) "is"
-
有序集合
zadd key [NX|XX] [CH] [INCR] score member [score member ...] zrange key start stop [WITHSCORES]
eg1
127.0.0.1:6379> zadd treetest 0 this (integer) 1 127.0.0.1:6379> zadd treetest 1 is (integer) 1 127.0.0.1:6379> zadd treetest 2 a (integer) 1 127.0.0.1:6379> zadd treetest 3 test (integer) 1 127.0.0.1:6379> zrange treetest 0 10 1) "this" 2) "is" 3) "a" 4) "test"
eg2
127.0.0.1:6379> zadd treetest 0 this (integer) 1 127.0.0.1:6379> zadd treetest 0 is (integer) 1 127.0.0.1:6379> zadd treetest 0 a (integer) 1 127.0.0.1:6379> zadd treetest 0 test (integer) 1 127.0.0.1:6379> zrange treetest 0 10 1) "a" 2) "is" 3) "test" 4) "this"
其他命令
DEL
DEL key [key …]
如果删除的key不存在,则直接忽略
返回被删除的keys的数量
EXISTS
EXISTS key
返回key是否存在
如果key存在返回1,不存在返回0
主从
特点/优势
- 同一个Master可以同步多个Slaves。
- Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力。
- Master是以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求。
- Slave同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据。
- 为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成。即便如此,系统的伸缩性还是得到了很大的提高。
- Master可以将数据保存操作交给Slaves完成,从而避免了在Master中要有独立的进程来完成此操作。
工作原理
在Slave启动并连接到Master之后,它将主动发送一个SYNC命令。此后Master将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,Master将传送整个数据库文件到Slave,以完成一次完全同步。而Slave服务器在接收到数据库文件数据之后将其存盘并加载到内存中。此后,Master继续将所有已经收集到的修改命令,和新的修改命令依次传送给Slaves,Slave将在本次执行这些数据修改命令,从而达到最终的数据同步。
如果Master和Slave之间的链接出现断连现象,Slave可以自动重连Master,但是在连接成功之后,一次完全同步将被自动执行。
命令
-
登录之后执行
./redis-cli -p 7777 127.0.0.1:7777> slaveof 127.0.0.1 6389 OK
-
启动时执行
./redis-server --port 7777 --slaveof 127.0.0.1 6389
-
报错与解决
第一次做主从时提示错误:MASTER <-> SLAVE sync started Error condition on socket for SYNC: Connection refused Connecting to MASTER 192.168.0.11:6379
解决方案为:
在redis.conf文件中追加一行,然后重启服务bind 0.0.0.0
发布订阅
启动Redis服务后,启动三个客户端,其中两个执行订阅SUBSCRIBE
:
127.0.0.1:6379> SUBSCRIBE redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1
第三个执行发布PUBLISH
:
127.0.0.1:6379> PUBLISH redisChat "bbb"
(integer) 2
订阅的客户端此时会变成:
127.0.0.1:6379> SUBSCRIBE redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1
1) "message"
2) "redisChat"
3) "bbb"
事务
Redis事务让一组命令在单个步骤执行。事务有两个属性,说明如下:
- 在一个事务中的所有命令按顺序执行作为单个隔离操作。通过另一个客户端发出的请求在Redis的事务的过程中执行,这是不可能的。
- Redis的事务具有原子性。原子意味着要么所有的命令都执行或都不执行。
Redis事务由multi
命令开启,由exec
命令执行并结束
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set affair test
QUEUED
127.0.0.1:6379> get affair
QUEUED
127.0.0.1:6379> exec
1) OK
2) "test"
备份与恢复
备份
Redis备份可以使用save
命令或者bgsave
二者的区别在于后者在后台执行
127.0.0.1:6379> save
OK
127.0.0.1:6379> bgsave
Background saving started
恢复
要恢复Redis的数据只需移动 Redis 的备份文件(dump.rdb)到 Redis 目录,然后启动服务器即可
获取Redis目录可以使用命令
127.0.0.1:6379> config get dir
1) "dir"
2) "/Users/lin/Documents/redis-3.2.8/src"
安全
Redis 默认没有密码
127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) ""
设置密码:
127.0.0.1:6379> CONFIG set requirepass 'abc'
OK
此时再操作则提示需要验证
127.0.0.1:6379> CONFIG get requirepass
(error) NOAUTH Authentication required.
输入密码后才能继续操作
127.0.0.1:6379> auth abc
OK
127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) "abc"
最大连接数
默认1000
127.0.0.1:6379> config get maxclients
1) "maxclients"
2) "10000"
启动时修改
redis-server --maxclients 100000