关系型数据库
非关系型数据库
非关系型数据库产生的背景
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
Redis的主要特点
优点
安装环境组件编译器,编译安装redis
[root@localhost mnt]# tar zxvf redis-5.0.7.tar.gz -C /opt
[root@localhost mnt]# cd /opt/redis-5.0.7/
[root@localhost redis-5.0.7]# make
[root@localhost redis-5.0.7]# make PREFIX=/usr/local/redis/ install '指定redis目录并安装'
[root@localhost redis-5.0.7]# cd /usr/local/redis/
[root@localhost redis]# ls
bin
[root@localhost redis]# cd bin/
[root@localhost bin]# ls
redis-benchmark redis-check-rdb redis-sentinel
redis-check-aof redis-cli redis-server
执行redis配置文件脚本,并进行配置
[root@localhost bin]# cd /opt/redis-5.0.7/utils/ '回到redis源码包解压目录'
[root@localhost utils]# ./install_server.sh '执行脚本进行配置'
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379] '选择redis默认接口,直接回车'
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] '选择redis默认配置文件名称,直接回车'
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] '选择默认redis日志文件名称,直接回车'
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] '选择默认接口的默认数据文件,直接回车'
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server] '选择redis可执行文件路径'
Selected config: '选择的配置清单展示'
Port : 6379
Config file : /etc/redis/6379.conf
Log file : /var/log/redis_6379.log
Data dir : /var/lib/redis/6379
Executable : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort. '直接回车完成配置'
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
优化redis配置
[root@localhost utils]# ln -s /usr/local/redis/bin/* /usr/local/bin/ '将redis命令创建软连接,便于系统识别'
[root@localhost utils]# netstat -ntap |grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 72538/redis-server
[root@localhost bin]# service redis_6379 stop '关闭redis服务'
Stopping ...
Redis stopped
[root@localhost bin]# service redis_6379 start '开启redis服务'
Starting Redis server...
[root@localhost bin]# netstat -ntap |grep 6379 '检查redis开启情况'
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 72620/redis-server
tcp 0 0 127.0.0.1:6379 127.0.0.1:55370 TIME_WAIT -
[root@localhost bin]# redis-cli
127.0.0.1:6379> keys *
(empty list or set)
设置监听端口,启动服务
[root@localhost bin]# vim /etc/redis/6379.conf '修改配置文件'
bind 127.0.0.1 192.168.179.124 '添加监听端口'
[root@localhost bin]# service redis_6379 restart
[root@localhost bin]# redis-cli -h 192.168.179.124 -p 6379 '指定端口登录'
192.168.179.124:6379> keys *
(empty list or set)
获取命令帮助
help @<group>:获取<group>中的命令列表
help <command>:获取某个命令的帮助
help <tab>:获取可能帮助的主题列表
Redis-cil命令行工具
set:存放数据
get:获取数据
key相关命令
keys:获取符合规则的键值列表
exists:判断键值是否存在
del:删除当前数据库的指定key
type:获取key对应的value值类型
rename(覆盖)l renamenx(不覆盖):对已有的key进行
重命名
dbsize:查看当前数据库中key的数目
192.168.179.124:6379> help set '查看set命令帮助'
SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
summary: Set the string value of a key
since: 1.0.0
group: string
192.168.179.124:6379> set name zhangsan '创建键(name),值(zhangsan)'
OK
192.168.179.124:6379> set addr beijing '创建键(addr),值(beijing)'
OK
192.168.179.124:6379> keys *
1) "addr"
2) "name"
192.168.179.124:6379> keys na?? '查看na开头的4个字节的key'
1) "name"
192.168.179.124:6379> keys ad* '查看ad开头的key'
1) "addr"
192.168.179.124:6379> EXISTS name '查看name是否存在'
(integer) 1
192.168.179.124:6379> del addr '删除addr键'
(integer) 1
192.168.179.124:6379> keys *
1) "name"
192.168.179.124:6379> rename name user '将name键重命名为user'
OK
192.168.179.124:6379> keys *
1) "user"
192.168.179.124:6379> type user '查看user对应的值类型'
string
192.168.179.124:6379> dbsize '查看当前数据库中key的数目'
(integer) 1
-h:指定服务器主机名
-p:指定服务器端口
-c:指定并发连接数
-n:指定请求数
-d:以字节的形式指定SET/GET值的数据大小
-q:强制退出Redis,仅显示query/sec值
[root@localhost bin]# redis-benchmark -h 192.168.179.124 -p 6379 -c 100 -n 100000
'压测ip地址192.168.179.124,端口为6379,并发量100,请求量100000个'
====== SET ======
100000 requests completed in 1.18 seconds
100 parallel clients
3 bytes payload
keep alive: 1
====== GET ======
100000 requests completed in 1.18 seconds
100 parallel clients
3 bytes payload
keep alive: 1
[root@localhost bin]# redis-benchmark -h 192.168.179.124 -p 6379 -q -d 100
'压测IP地址为192.168.179.124,端口为6379,-q:强制退出redis,-d:指定字节数量'
SET: 84674.01 requests per second
GET: 86580.09 requests per second
[root@localhost bin]# redis-cli -h 192.168.179.124 -p 6379
192.168.179.124:6379> keys *
1) "myset:__rand_int__"
2) "user"
3) "key:__rand_int__"
4) "mylist"
5) "counter:__rand_int__"
192.168.179.124:6379> select 13 '进入第12个库'
OK
192.168.179.124:6379[13]> keys * '查看所有键'
(empty list or set)
192.168.179.124:6379[13]> select 0 '返回第一个库'
OK
192.168.179.124:6379> move user 13 '将user键值对移动到第13个库'
(integer) 1
192.168.179.124:6379> select 13
OK
192.168.179.124:6379[13]> keys *
1) "user"
192.168.179.124:6379[13]> get user '查看user键值'
"zhangsan"
192.168.179.124:6379[13]> flushdb '清空库'
OK
192.168.179.124:6379[13]> keys *
(empty list or set)
持久化概述
持久化分类
Redis的默认持久化方式
默认文件名dump.rdb
触发条件
优缺点
通过RDB文件恢复数据
[root@localhost redis]# cd /var/lib/redis/6379/
[root@localhost 6379]# ls
dump.rdb
配置文件选项
[root@localhost 6379]# vim /etc/redis/6379.conf
save 900 1 '900秒之内至少一次写操作'
save 300 10 '300秒之内至少发生10次写操作'
save 60 10000 '60秒之内发生至少10000次写操作'
... '只要满足其一都会触发快照操作,注释所有的save项表示关闭RDB'
dbfilename dump.rdb 'RDB文件名称'
dir /var/lib/redis/6379 'RDB文件路径'
rdbcompression yes '是否进行压缩'
根据AOF文件恢复数据
[root@localhost log]# cd /var/lib/redis/6379/
[root@localhost 6379]# ls
appendonly.aof dump.rdb
配置文件选项
[root@localhost 6379]# vim /etc/redis/6379.conf
appendonly yes '开启AOF持久化'
appendfilename "appendonly.aof" 'AOF文件名称'
# appendfsync always '同步持久化,每次发生数据变化会立刻写入磁盘'
appendfsync everysec '默认推荐,每秒异步记录一次(默认值)'
# appendfsync no '不同步,交给操作系统决定如何同步'
aof-load-truncated yes '忽略最后一条可能存在问题的指令'
AOF的重写机制
AOF重写的原理
AOF的重写配置
[root@localhost 6379]# vim /etc/redis/6379.conf
no-appendfsync-on-rewrite no
'在日志进行BGREWRITEAOF时,如果设置为yes表示新写操作不进行同步fsync,只是暂存在缓冲区里,避免造成磁盘IO操作冲突,等重写完成后在写入。Redis中默认为no'
auto-aof-rewrite-percentage 100
'当前AOF文件大小是上次日志重写时AOF文件大小两倍时,发生BGREWRITEAOF操作'
auto-aof-rewrite-min-size 64mb
'当前AOF文件执行BGREWRITEAOF命令的最小值,避免刚开始启动Reids时由于文件尺寸较小导致频繁的BGREWRITEAOF'
查看Redis内存使用
[root@localhost 6379]# redis-cli
127.0.0.1:6379> info memory
# Memory
used_memory:853320 '内存使用总量'
used_memory_human:833.32K
used_memory_rss:3473408
......
allocator_frag_ratio:1.24
allocator_frag_bytes:406552
allocator_rss_ratio:4.44 '内存碎片率'
内存碎片率
内存使用率
回收key