Redis

Mar 10, 2017


简介

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"

类型及命令

  1. 字符串

    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"
    
  2. 哈希

    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>
    
  3. 列表

    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"
    
  4. 无序集合

    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"
    
  5. 有序集合

    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,但是在连接成功之后,一次完全同步将被自动执行。

命令

  1. 登录之后执行

    ./redis-cli -p 7777
    127.0.0.1:7777> slaveof 127.0.0.1 6389
    OK
    
  2. 启动时执行

     ./redis-server --port 7777 --slaveof 127.0.0.1 6389
    
  3. 报错与解决
    第一次做主从时提示错误:

    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