关于非关系型数据库redis的亿点点
关系型和非关系型数据库
关系型数据库
非关系型数据库
两个数据库的区别
数据存储方式不同
扩展方式不同
多事务支持性不同
非关系型数据库的产生背景
基于“三高”问题
非关系数据库redis介绍
Redis优点
key-value 键值对类型
string 字符串(可以是整形,浮点型,字符型,统称为元素)
list 列表(实现队列形式,元素不唯一)
set 集合(各不相同的元素,分有序和无序)
hash hash散列值
Redis数据库部署
[root@localhost ~]# yum -y install gcc gcc-c++ make
[root@localhost ]# tar zxf redis-5.0.7.tar.gz
[root@localhost redis-5.0.7]# cd redis-5.0.7/
[root@localhost redis-5.0.7]# make PREFIX=/usr/local/redis install //因为Redis源码包中直接提供了Makefile文件,所以不用执行./configure配置,可以直接执行make
[root@localhost redis-5.0.7]# cd utils/
[root@localhost utils]# ./install_server.sh
Please select the redis executable path [] /usr/local/bin/redis-server
[root@localhost utils]# ln -s /usr/local/redis/bin/* /usr/local/bin/
[root@localhost utils]# netstat -antp | grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 122058/redis-server
[root@localhost utils]# vim /etc/redis/6379.conf
70 bind 127.0.0.1 192.168.1.5 //添加监听的主机地址
93 port 6379 //默认监听端口
137 daemonize yes //开启守护进程模式
159 pidfile /var/run/redis_6379.pid //指定pid文件路径
167 loglevel notice //设置日志的级别
172 logfile /var/log/redis_6379.log //指定日志文件路径
Redis命令工具
-h //指定服务器主机名
-p //指定服务器端口号
-s //指定服务器套接字
-c //指定并发连接数
-n //指定请求数
-d //以字节形式指定set/get值的数据大小
-k //1是keep alive 0是reconnect
-r //set/get/incr是用随机key,sadd使用随机值
-p //通过管道传输<numreq>请求
-q //强制退出redis
--csv //以csv格式输出
-l //生成循环,一直执行测试
-t //仅运行以逗号分隔的测试命令列表
-I //idle模式,打开n个idle连接并等待
[root@localhost utils]# redis-benchmark -h localhost -p 6379 -q -d 110
PING_INLINE: 154320.98 requests per second
PING_BULK: 163398.70 requests per second
SET: 180505.41 requests per second
GET: 156985.86 requests per second
INCR: 177304.97 requests per second
LPUSH: 187617.27 requests per second
RPUSH: 181159.42 requests per second
LPOP: 181159.42 requests per second
RPOP: 180831.83 requests per second
SADD: 162074.56 requests per second
HSET: 154083.20 requests per second
SPOP: 154083.20 requests per second
LPUSH (needed to benchmark LRANGE): 178571.42 requests per second
LRANGE_100 (first 100 elements): 45106.00 requests per second
LRANGE_300 (first 300 elements): 15772.87 requests per second
LRANGE_500 (first 450 elements): 9212.34 requests per second
LRANGE_600 (first 600 elements): 6876.16 requests per second
MSET (10 keys): 102774.92 requests per second
[root@localhost utils]# redis-benchmark -t set,lpush -n 100000 -q
SET: 175131.36 requests per second
LPUSH: 182149.36 requests per second
-h //指定远程主机
-p //指定Redis的服务端口号
-a //指定密码,未设置密码可以省略此选项
若不加任何参数表示使用127.0.0.1:6379连接本机的redis数据库
[root@localhost utils]# /etc/init.d/redis_6379 restart
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
[root@localhost utils]# redis-cli -h 192.168.1.5 -p 6379
192.168.1.5:6379>
Redis常用命令
192.168.1.5:6379> set test zhangsan
OK
192.168.1.5:6379> get test
"zhangsan"
192.168.1.5:6379> keys *
1) "k2"
2) "myset:__rand_int__"
3) "key:__rand_int__"
4) "mylist"
5) "k1"
6) "test"
7) "counter:__rand_int__"
192.168.1.5:6379> KEYS k*
1) "k2"
2) "key:__rand_int__"
3) "k1"
192.168.1.5:6379> KEYS k?
1) "k2"
2) "k1"
192.168.1.5:6379> KEYS k??
1) "k22"
192.168.1.5:6379> exists k
(integer) 0 //0代表不存在
192.168.1.5:6379> exists k1
(integer) 1 //1代表存在
192.168.1.5:6379> del k1
(integer) 1
192.168.1.5:6379> get k1
(nil)
192.168.1.5:6379> type k2
string
192.168.1.5:6379> rename k2 k
OK
192.168.1.5:6379> get k2
(nil)
192.168.1.5:6379> get k
"2"
192.168.1.5:6379> rename k22 k
OK
192.168.1.5:6379> get k
"12"
192.168.1.5:6379> get k1
"2"
192.168.1.5:6379> get k3
"3"
192.168.1.5:6379> renamenx k1 k3 //n代表不进行修改,x进行修改,对已有的新名不进行修改
(integer) 0
192.168.1.5:6379> get k1
"2"
192.168.1.5:6379> get k3
"3"
Redis多库常用命令
192.168.1.5:6379> select 10 //切换到10号库,一共0-15个库
OK
192.168.1.5:6379[10]>
192.168.1.5:6379> get k1
"2"
192.168.1.5:6379> move k1 1
(integer) 1
192.168.1.5:6379> select 1
OK
192.168.1.5:6379[1]> get k1
"2"
192.168.1.5:6379[1]> flushdb //清空当前数据库数据
OK
192.168.1.5:6379[1]> get k1
(nil)
192.168.1.5:6379[1]> flushall //清空所有数据库的数据,慎用
OK
Redis高可用
持久化
主从复制
哨兵
集群(cluster)
Redis持久化
RDB持久化
触发条件
- 手动触发
- 自动触发
vim /etc/redis/6379.conf
以下三个save条件满足任意一个时,都会引起bgsave的调用
219 save 900 1 ##当时间到900秒时,如果redis数据发生了至少1次变化,则执行bgsave
220 save 300 10 ##当时间到300秒时, 如果redis数据发生了至少10次变化, 则执行bgsave
221 save 60 10000 :当时间到60秒时,如果redis数据发生了至少10000次变化, 则执行bgsave
242 rdbcompression yes ##是否开启RDB文件压缩
254 dbfilename dump.rdb ##指定RDB文件名
264 dir /var/lib/redis/6379 ##指定RDB文件和AOF文件所在目录
- 其他自动触发机制
执行流程
启动时加载
AOF持久化
开启AOF
vim /etc/redis/6379.conf
700 appendonly yes ##修改成yes,开启AOF
704 appendfilename "appendonly.aof" ##指定A0F文件名称
796 aof-load-truncated yes ##是否忽略最后一条可能存在问题的指令
/etc/ init.d/redis_ 6379 restart ##重启redis
执行流程
命令追加(append)
文件写入(write)和文件同步(sync)
vim /etc/redis/6379.conf
729 appendfsync always
##命令写入aof_buf后立即调用系统fsync操作同步到AOF文件,fsync完成后线程返回。这种情况下,每次有写命令都要同步到A0F文件,硬盘IO成为性能瓶颈,Redis只能支持大约几百TPS写入,严重降低了Redis的性能;即便是使用固态硬盘(SSD),每秒大约也只能处理几万个命令,而且会大大降低SSD的寿命。
729 appendfsync no
命令写入aof_buf后调用系统write操作,不对AOF文件做fsync同步;同步由操作系统负责,通常同步周期为30秒。这种情况下,文件同步的时间不可控,且缓冲区中堆积的数据会很多,数据安全性无法保证。
729 appendfsync everysec(默认配置)
命令写入aof_buf后调用系统write操作,write完成后线程返回;fsync同步文件操作由专门的线程每秒调用一次。everysec是前述两种策略的折中,是性能和数据安全性的平衡,因此是Redis的默认配置,也是我们推荐的配置。
文件重写(rewrite)
文件重写的触发分类
手动触发
自动触发
vim /etc/ redis/ 6379. conf
AOF同步的策略
729 # appendfsync always
730 appendfsync everysec
731 # appendfsync no
771 auto-aof-rewrite-percentage 100 ##当前AOF文件大小(即aof_current_size)是上次日志重写时AOF文件大小(aof_base_size)两倍时,发生BGREWRITEAOF操作
772 auto-aof-rewrite -min-size 64mb ##当前A0F文件执行BGREWRITEAOF命令的最小值,避免刚开始启动Reids时由于文件尺寸较小导致频繁的BGREWRITEA0F
启动时加载
Redis性能管理
查看Redis内存使用
127.0.0.1:6379> info memory
内存碎片率
内存使用率
内回收key
vim /etc/redis/6379.conf
598 maxmemory-policy noenviction
volatile-lru ##使用LRU算法从已设置过期时间的数据集合中淘汰数据
volatile-ttl ##从已设置过期时间的数据集合中挑选即将过期的数据淘汰
volatile-random ##从已设置过期时间的数据集合中随机挑选数据淘汰
allkeys-lru ##使用LRU算法从所有数据集合中淘汰数据
allkeys-random ##从数据集合中任意选择数据淘汰