Nosql之Redis缓存数据库安装及优化

引言

存储数据类型分类:

结构化数据:可以通过二维表格形式表述这个数据。
非结构化数据:不方便以二维表格形式表述的这种类型的数据。

根据不同种存储数据类型分类分成两种不同类型的数据库

结构化数据库(关系型数据库):里面存储的数据类型是结构化数据。
非结构化数据库(非关系型数据库):里面存储的数据类型是非结构化数据。

关系数据库与非关系型数据库

关系型数据库

·一个结构化的数据库,创建在关系模型基础上;
一般面向于记录;
包括:Oracle、MySQL、SQL Server、Microsoft Access、DB2

非关系型数据库

·除了主流的关系型数据库外的数据库,都认为是非关系型
包括:Redis、MongBD、Hbase、CouhDB等

非关系型数据库产生背景(优势)

High performance———对数据库高并发读写需求
Huge Storage———对海量数据高效存储与访问需求
High Scalability && High Availability——对数据库高可扩展性与高可用性需求

一、Redis简介

1、Redis基于内存运行并支持持久化(内存运行:处理高热数据优秀,不占用多的进程)
2、采用key-value(键值对)的存储形式
3、优点
具有极高的数据读写速度
支持丰富的数据类型
支持数据的持久化
原子性
支持数据备份

二、Redis部署

2.1、Redis安装

1.安装编译工具后编译安装redis

[root@server1 ~]# yum -y install gcc gcc-c++ make
[root@server1 ~]# tar zxvf redis-5.0.4.tar.gz
[root@server1 ~]# cd redis-5.0.4/
[root@server1 redis-5.0.4]# make
[root@server1 redis-5.0.4]# make PREFIX=/usr/local/redis install
###安装过程中,更改安装路径可以用make PRRFIX=安装路径 install

2.进行命令路径优化,执行redis安装脚本进行配置

[root@server1 ~]# ln -s /usr/local/redis/bin/* /usr/local/bin
[root@server1 ~]# cd redis-5.0.4/utils/
[root@server1 utils]# ./install_server.sh	#安装后redis自动开启了
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]	#默认端口
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]	#配置文件路径
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]	#日志文件路径
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]	#执行文件路径
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!	#出现successful!即表示安装成功
在执行脚本的时候,配置项全部默认,直接回车即可

3、将本机地址添加到监听端口,重启服务后测试能否成功登录

###本地登录
[root@server1 utils]# redis-cli	
127.0.0.1:6379>

[root@server1 ~]# vi /etc/redis/6379.conf
bind 127.0.0.1 192.168.40.11	#把允许登录的地址加到配置文件的bind后面

[root@server1 ~]# /etc/init.d/redis_6379 restart
[root@server1 ~]# netstat -anpt | grep 6379
tcp        0      0 192.168.40.11:6379      0.0.0.0:*               LISTEN      49912/redis-server  
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      49912/redis-server  

###远程登录数据库
[root@server1 utils]# redis-cli -h 192.168.40.11 -p 6379	
192.168.73.10:6379>

2.2、Redis配置文件部分参数介绍

  • 配置参数(/etc/redis/6379.conf)
    bind:监听的主机地址
    port:端口
    daemonize yes:启用守护进程
    pidfile:指定PID文件
    loglevel notice:日志级别
    logfile:指定日志文件

三、Redis五种数据类型

主要是为了验证redis支持的五种数据类型

  1. string(字符串)
    string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key对应一个 value。
    string 类型是二进制安全的。意思是 redis 的 string可以包含任何数据。比如jpg图片或者序列化的对象。
    string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储512MB。
    set 键值 设置键值;
    get键获取键的值。
    在这里插入图片描述
  2. hash(哈希)
    Redis hash 是一个键值(key=>value)对集合。
    Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
    Hset:添加hash数据
    hget:获取hash数据
    hmget:获取多个hash数据
    在这里插入图片描述
  3. list(列表)
    Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
    lpush:从左边推入值
    lpop:从左边弹出值
    rpush:从右边推入值
    rpop:从右边弹出值
    llen:查看某个list数据类型的长度。

在这里插入图片描述
4. set(无序集合)
Redis 的 Set 是 string 类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
sadd 命令
添加一个 string 元素到 key 对应的 set 集合中,成功返回 1,如果元素已经在集合中返回 0。
scard:查看set数据中存在的元素个数
sismember:判断set数据中是否存在某个元素
srem:删除某个set数据中的元素
在这里插入图片描述
Smembers set1 列出set1所有值

在这里插入图片描述
字母和数字都存在的时候,它列出所有结果时是杂乱无章的

  1. zset(sorted set:有序集合)
    Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
    不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
    zset的成员是唯一的,但分数(score)却可以重复。
    zadd 命令
    添加元素到集合,元素在集合中存在则更新对应score
    使用方法:zadd key score member
    zcard:查询
    zrang:数据排序
    在这里插入图片描述
    在这里插入图片描述

四、Redis数据库常用命令

Redis 命令工具

Redis 软件提供了多个命令工具, 当 Redis 安装时, 所包含的软件工具会系统中, 在系统中可以直接使用。 这些命令工具的作用分别如下所示。

名称作用
redis-server用于启动 Redis 的工具
redis-benchmark用于检测 Redis 在本机的运行效率
redis-check-aof修复 AOF 持久化文件
redis-check-rdb修复 RDB 持久化文件
redis-cli是 Redis 命令行工具
redis-setinel是 哨兵模式启动的工具

本小节只讲解 redis-cli、redis-benchmark 命令工具的使用。

4.1、连接数据库

redis-cli命令行工具

连接本地数据库

[root@redis ~]# redis-cli
127.0.0.1:6379> 

连接远程数据库

[root@redis ~]# redis-cli -h 192.168.40.11 -p 6379
192.168.40.11:6379> 

4.2、redis-benchmark测试工具(压力测试)

redis-benchmark是官方自带的 Redis 性能测试工具,可以有效的测试 Redis 服务的性能。基本的测试语法为redis-benchmark 【option】【option value】。

类型作用
- h指定服务器主机名。
-p指定服务器端口。
-s指定服务器端口。
-c指定并发连接数。
-n指定请求数。
-d以字节的形式指定 SET/GET 值的数据大小。
-k1=keep alive 0=reconnect。
-rSET/GET/INCR 使用随机 key,SADD 使用随机值。
-P通过管道传输请求。
-q强制退出 redis。仅显示 query/sec 值。
–csv以 CSV 格式输出。
-l生成循环,永久执行测试。
-t仅运行以逗号分隔的测试命令列表。
-🇮Idle 模式。仅打并N 个 idle 连接并等待。

结合上述选项,可以针对某台 Redis 服务器进行性能检测,如执行

●向IP地址为192.168.73.10、端口为6379的Redis服务器发送100个并发连接与10000个请求测试性能

[root@redis ~]# redis-benchmark -h 192.168.40.11 -p 6379 -c 100 -n 10000

●测试存取大小为100字节的数据包的性能

[root@redis ~]# redis-benchmark -h 192.168.40.11 -p 6379 -q -d 100

4.3、存放/获取数据

  • set:存放数据
  • get:获取数据
192.168.40.11:6379> set name xhc
OK
192.168.40.11:6379> get name
"xhc"

4.4、key相关命令

  • keys:获取符合规则的键值列表
#keys *:查看所有键;通配符*和?都支持
192.168.40.11:6379> keys nam?
1) "name"
192.168.40.11:6379> keys na**
1) "name"
  • exists:判断键值是否存在
192.168.40.11:6379> exists name
(integer) 1	#执行失败返回0,执行成功返回非0值
  • del:删除当前数据库的指定key
192.168.40.11:6379> keys *
1) "xhc"
2) "name"
192.168.40.11:6379> del xhc
(integer) 1
192.168.40.11:6379> keys *
1) "name"
  • type:获取key对应的value值类型
192.168.40.11:6379> type name
string
  • rename(覆盖)/renamenx(不覆盖):对已有的key进行重命名
192.168.40.11:6379> rename name xhc
OK
192.168.40.11:6379> get xhc
"xhc"
192.168.40.11:6379> get name
(nil)

使用renamenx 命令进行重命名时,如果目标 key 存在则不进行重命名。
 192.168.40.11:6379> keys *
1) "xhc"
2) "cc"
192.168.40.11:6379> renamenx xhc cc
(integer) 0
  • dbsize:查看当前数据库中key的数目
192.168.40.11:6379> dbsize
(integer) 2

五、Redis多数库操作

  1. Redis支持多数据库,默认支持16个数据库,0-15命名,使用 redis-cli连接 Redis 数据库后,"默认使用的是序号为 0 的数据库。
  2. 多数据库相互独立,互不干扰。使用Select 命令可以进行 Redis 的多数据库之间的切换,命令格式为 selectindex,其中 index 表示数据库的序号。
  3. 多数据库常用命令

5.1 多数据库间切换

127.0.0.1:6379> select 5	##切换至序号为 5 的数据库
OK
127.0.0.1:6379[5]> 

若当前使用的数据库是序号为 0的数据库,提示符中则不显示序号, 如"127.0.0.1∶6379>""表示当前使用的是序号为 0的数据库。

5.2 多数据库间移动数据

127.0.0.1:6379[5]> set age 5	#创建键名age,值5
OK
127.0.0.1:6379[5]> keys *
1) "age"
127.0.0.1:6379[5]> move age 1	#移动键值到数据库1
(integer) 1
127.0.0.1:6379[5]> select 1
OK
127.0.0.1:6379[1]> keys *
1) "age"

5.3 清除数据库内数据

Redis 数据库的整库数据删除主要分为两个部分∶
清空当前数据库数据, 使用 FLUSHDB命令实现;
清空所有数据库的数据,使用 FLUSHALL 命令实现。
但是, 数据清空操作比较危险,生产环境下一般不建议使用。

127.0.0.1:6379> flushdb
OK

六、Redis持久化

1、持久化概述

Redis是运行在内存中,内存中的数据断电丢失
为了能够重用Redis数据,或者防止系统故障,需要将Redis中的数据写入到磁盘空间中,即持久化

2、持久化分类

RDB方式:创建快照的方式获取某一时刻Redis中所有数据的副本。
(缺点:只能是一个时刻,不可以连续,存在盲区,可能导致少量数据丢失)

AOF方式:将执行的写命令写到文件的末尾,以日志的方式来记录数据的变化。
(缺点:日志文件的量多,人力成本大)

注意:
生产环境RDB+AOF方式,两个快照中间部分采用AOF方式,查找日志中对应时间的写命令

6.1、RDB持久化

  • Redis默认的持久化方式

  • 默认文件名为dump.rdb
    在这里插入图片描述

  • 触发条件
    在指定的时间间隔内,执行指定次数的写操作(配置文件控制)
    执行save或者是bgsave(异步)命令
    执行flushall命令,清空数据库所有数据
    执行shutdown命令,保证服务器正常关闭且不丢失任何数据

  • 优缺点
    适合大规模的数据恢复
    如果业务对数据完整性和一致性要求不高,RDB是很好的选择
    数据的完整性和一致性不高
    备份时占用内存

  • 通过RDB文件恢复数据
    将dump.rdb文件拷贝到redis的安装目录的bin目录下,重启redis服务即可

[root@redis ~]# vi /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       #是否进行压缩

6.2、AOF持久化

  1. Redis默认不开启
  2. 弥补RDB的不足(数据的不一致性)
  3. 采用日志的形式来记录每个写操作,并追加到文件中
  4. Redis重启会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
  5. 根据AOF文件恢复数据
    将appendonly.aof文件拷贝到redis安装目录的bin目录下,重启redis服务即可
  6. 配置文件选项
[root@redis ~]# vi /etc/redis/6379.conf
appendonly yes	#开启AOF持久化
appendfilename "appendonly.aof"   #AOF文件名称
#appendfsync always		#同步持久化,每次发生数据变化会立刻写入磁盘;
appendfsync everysec    #默认推荐,每秒异步记录一次(默认值)
#appendfsync no         #不同步,交给操作系统决定如何同步
aof-load-truncated yes  #忽略最后一条可能存在问题的指令
  • AOF的重写机制

    AOF的工作原理是将写操作追加到文件中,文件的冗余内容会越来越多
    当AOF文件的大小超过所设定的阀值时,Redis就会对AOF文件的内容压缩

  • AOF的重写的原理
    Redis会fork出一条新进程,读取内存中的数据(并没有读取旧文件),并重新写到一个临时文件中,最后替换旧的aof文件

  • AOF的重写配置

[root@redis ~]# vi /etc/redis/6379.conf 
no-appendfsync-on-rewrite no	#在日志进行BGREWRITEAOF时, 如果设置为yes表示新写操作不进行同步fsync,只暂存在缓冲区里,避免造成磁盘I0操作冲突,等重写完成后在写入。redis中默认为no
auto-aof-rewrite-percentage 100	#当前AOF文件大小是上次日志重写时AOF文件大小两倍时,发生BGREWRITEAOF操作
auto-aof-rewrite-min-size 64mb	#当前AOF文件执行BGREWRITEAOF命令的最小值,避免刚开始启动Reids时由于文件尺寸较小导致频繁的BGREWRITEAOF.当AOF文件到达64M的时候,发生BGREWRITEAOF操作

7、Redis性能管理

7.1、查看Redis内存使用

[root@redis ~]# redis-cli
127.0.0.1:6379> info memory
# Memory
used_memory:875160
used_memory_human:854.65K	    #内存使用总量
...省略内容
mem_fragmentation_ratio:9.04	#内存碎片率
mem_fragmentation_bytes:6706600

7.2、内存碎片率介绍

1、操作系统分配的内存值used_memory_rss除以redis使用的内存值
used_ memory计算得出
2、内存碎片是由操作系统低效的分配/回收物理内存导致的
不连续的物理内存分配
3、跟踪内存碎片率对理解redis实例的资源性能是非常重要的
内存碎片率稍大于1是合理的,这个值表示内存碎片率比较低
内存碎片率超过1.5,说明redis消耗了实际需要物理内存的150%,其中50%是 内存碎片率
内存碎片率低于1的,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换
(内存碎片率为1是最佳,低于1访问速度会慢,高于1说明碎片太多)

7.3、内存使用率介绍

1、redis实例的内存使用率超过可用最大内存,操作系统将开始进行
内存与swap空间交换(这时redis响应速度会变慢)
2、避免内存交换
针对缓存数据大小选择
尽可能的使用Hash数据结构
设置key的过期时间

7.4、如何回收key

1、保证合理分配redis有限的内存资源
2、当达到设置的最大阈值时,需选择一种key的回收策略
默认情况下回收策略是noeviction(禁止收回)
/etc/redis/6379.conf配置文件中修改maxmemory-policy属性值

  • volatile-lru:使用LRU算法从已设置过期时间的数据集合中淘汰数据
  • volatile-ttl:从已设置过期时间的数据集合中挑选即将过期的数据淘汰(建议使用)
  • volatile-random:从已设置过期时间的数据集合中随机挑选数据淘汰
  • allkeys-lru:使用LRU算法从所有数据集合中淘汰数据 allkeys-random:从数据集合中任意选择数据淘汰
  • no-enviction:禁止淘汰数据

去掉#注释后,配置文件一定要顶格写

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值