redis初探

前言

由于业务需要,我要了解一下内存数据库,之前有使用过memcache,对比于memcache,有另外一款叫redis的内存数据库更加吸引开发者的眼球。至于优缺点就不在这里叨絮了,以下直接摘录我的一些学习笔记。

安装

1
2
3
4
[root]# wget http://download.redis.io/releases/redis-3.2.3.tar.gz
[root]# tar xvf redis-3.2.3.tar.gz
[root]# cd redis-3.2.3
[root]# make MALLOC=libc

测试

1
2
3
4
5
6
7
8
9
10
# 启动
[root]# src/redis-server &
# 测试
[root]# src/redis-cli
127.0.0.1:6379> set foo bar
OK
127.0.0.1:6379> get foo
"bar"
# 关闭
[root]# src/redis-cli shutdown

配置

推荐在生产环境中使用启动脚本方式启动redis服务。启动脚本redis_init_script 位于位于Redis的 /utils/ 目录下。

  1. 确保守护进程开启 daemonize yes

    1
    2
    3
    4
    5
    vi redis.conf
    # By default Redis does not run as a daemon. Use 'yes' if you need it.
    # Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
    daemonize yes
  2. 修改自启动脚本,#!/bin/sh下增加两行注。防止service redisd does not support chkconfig报错!

    1
    2
    3
    4
    5
    6
    vi utils/redis_init_script
    #!/bin/sh
    # chkconfig: 2345 90 10
    # description: Redis is a persistent key-value database
    #
  3. 根据启动脚本要求,将修改好的配置文件以端口为名复制一份到指定目录。需使用root用户

    1
    2
    mkdir /etc/redis
    cp redis.conf /etc/redis/6379.conf
  4. 将启动脚本复制到/etc/init.d目录下,本例将启动脚本命名为redisd(通常都以d结尾表示是后台自启动服务)。

    1
    cp redis_init_script /etc/init.d/redisd
  5. 设置为开机自启动

    1
    2
    3
    4
    5
    6
    #设置为开机自启动服务器
    chkconfig redisd on
    #打开服务
    service redisd start
    #关闭服务
    service redisd stop

数据类型

  1. Strings - 字符串
    命令:set、get,
    字符串值可以存储最大512兆字节的长度

  2. Hashes - 哈希值
    命令:hset、hmst、hget、hgetall,每个哈希可存储多达$2^{32}$-1个字段

  3. Lists - 列表
    命令:lpush、lrange,排序插入顺序,列表的最大长度为$2^{32}$-1元素

  4. Sets - 集合
    命令:sadd、smembers,成员唯一性,成员中集最大数量为$2^{32}$-1

  5. Zsets - 集合排序
    命令:zadd、zrange、zrangebyscore, 类似于集合,字符串不重复的有序集合,根据score排序

客户端

1
[root]# redis-cli -h host -p port -a password

Redis接受上配置监听TCP端口和Unix套接字客户端的连接,如果启用。当一个新的客户端连接被接受,如有以下操作进行:

  • 客户端套接字置于非阻塞状态,因为Redis的使用复用和非阻塞I/O操作。

  • TCP_NODELAY选项设定是为了以确保我们没有连接延迟。

  • 创建一个可读的文件时,这样Redis能够尽快收集客户端的查询作为新的数据可供读取的Socket中。

发布订阅

1
2
3
4
# 订阅
[root]# SUBSCRIBE channel
# 发布
[root]# PUBLISH channel message

事务

Redis事务由指令 MULTI 启动,然后需要传递事务,而且整个事务是通过执行EXEC命令执行后,执行命令的列表。

1
2
3
4
5
6
7
8
9
10
11
12
13
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET tutorial redis
QUEUED
redis 127.0.0.1:6379> GET tutorial
QUEUED
redis 127.0.0.1:6379> INCR visitors
QUEUED
redis 127.0.0.1:6379> EXEC
1) OK
2) "redis"
3) (integer) 1

常用命令介绍

  • EVAL 执行LUA脚本
  • AUTH password 服务器验证给定的密码
  • ECHO message 打印给定的字符串
  • PING 检查服务器是否正在运行
  • QUIT 关闭当前连接
  • SELECT index 更改当前连接所选数据库
  • CLIENT LIST 获取客户端连接到服务器的连接列表
  • MONITOR 监听由实时服务器接收到的所有请求
  • INFO [section] 获取有关服务器的信息和统计数据
  • CONFIG GET CONFIG_SETTING_NAME 获取配置
  • FLUSHDB 从当前数据库中删除所有项
  • DBSIZE 返回所选数据库中的键的数目
  • KEYS * 返回所有key

备份

Redis的数据回写机制分同步和异步两种,
  • 同步回写即SAVE命令,主进程直接向磁盘回写数据。在数据大的情况下会导致系统假死很长时间,所以一般不是推荐的。
  • 异步回写即BGSAVE命令,主进程fork后,复制自身并通过这个新的进程回写磁盘,回写结束后新进程自行关闭。由于这样做不需要主进程阻塞,系统不会假死,一般默认会采用这个方法。
还原Redis数据

要恢复Redis数据只是移动Redis备份文件(dump.rdb)到Redis目录,然后启动服务器就行。

1
目录的设置:CONFIG get dir

目前Redis持久化的方式有两种: RDB 和 AOF

RDB就是Snapshot快照存储,是默认的持久化方式。
可理解为半持久化模式,即按照一定的策略周期性的将数据保存到磁盘。
对应产生的数据文件为dump.rdb,通过配置文件中的save参数来定义快照的周期。
下面是默认的快照设置:

1
2
3
save 900 1 #当有一条Keys数据被改变时,900秒刷新到Disk一次
save 300 10 #当有10条Keys数据被改变时,300秒刷新到Disk一次
save 60 10000 #当有10000条Keys数据被改变时,60秒刷新到Disk一次

AOF(Append-Only File)比RDB方式有更好的持久化性。
由于在使用AOF持久化方式时,Redis会将每一个收到的写命令都通过Write函数追加到文件中,类似于MySQL的binlog。
当Redis重启是会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。
对应的设置参数为:

1
2
3
4
5
appendonly yes #启用AOF持久化方式
appendfilename appendonly.aof #AOF文件的名称,默认为appendonly.aof
# appendfsync always #每次收到写命令就立即强制写入磁盘,是最有保证的完全的持久化,但速度也是最慢的,一般不推荐使用。
appendfsync everysec #每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,是受推荐的方式。
# appendfsync no #完全依赖OS的写入,一般为30秒左右一次,性能最好但是持久化最没有保证,不被推荐。

为了压缩AOF的持久化文件,Redis提供了bgrewriteaof命令。
收到此命令后Redis将使用与快照类似的方式将内存中的数据以命令的方式保存到临时文件中,最后替换原来的文件,以此来实现控制AOF文件的增长。
由于是模拟快照的过程,因此在重写AOF文件时并没有读取旧的AOF文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的AOF文件。

1
2
3
no-appendfsync-on-rewrite yes #在日志重写时,不进行命令追加操作,而只是将其放在缓冲区里,避免与命令的追加造成DISK IO上的冲突。
auto-aof-rewrite-percentage 100 #当前AOF文件大小是上次日志重写得到AOF文件大小的二倍时,自动启动新的日志重写过程。
auto-aof-rewrite-min-size 64mb #当前AOF文件启动新的日志重写过程的最小值,避免刚刚启动Reids时由于文件尺寸较小导致频繁的重写。

通常,如果你要想提供很高的数据保障性,那么建议你同时使用两种持久化方式。

安全

1
2
3
4
5
# 设置密码
redis 127.0.0.1:6379> CONFIG set requirepass "123456"
redis 127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) "123456"

设置密码,如果任何客户端运行命令没有验证后,再(错误)NOAUTH需要验证。错误将再回到这点。因此,客户端需要使用AUTH命令进行认证。

1
redis 127.0.0.1:6379> AUTH 123456

基准

Redis的基准是实用程序运行n个命令检查Redis 的性能。

1
[root]# redis-benchmark -n 100000

管道传输

Redis是一个TCP服务器,并支持请求/响应协议。redis的一个请求完成需要下面的步骤:

  • 客户端发送一个查询到服务器,并从套接字中读取,通常在封闭的方式,对服务器的响应。

  • 服务器处理命令并将响应返回给客户端。

可视化工具

下载地址:https://redisdesktop.com/download

罐头很懒 (⊙v⊙)<br><br>工作日日常 :<br>do {<br>&nbsp;&nbsp;打代码<br>} while ( 发呆 || 吃饭 )<br><br>周末日常 :<br>( 鱼罐头 || 午餐肉 || 炸鸡块 ) +<br>( 罐可乐 || 瓶啤酒 ) +<br>( 盒仔饭 || 艇仔粥 || 即食面 ) +<br>( 轻音乐 || 肥皂剧 || 热网综 ) +<br>( 水果糖 || 甜布丁 )