当前位置:   article > 正文

nosql之redis配置与优化_nosql 之redis 配置与优化有道云分享

nosql 之redis 配置与优化有道云分享

1.数据库

sql:结构化数据库,可通过二维表格形式表述这个数据,存储结构化数据,别称关系型数据库
nosql:非结构化数据库,存储非结构化数据,别称非关系型数据库,例:Redis、Memcached

1.1非关系型数据库产生背景

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

1.2 Redis简介

  • Redis基于内存运行并支持持久化
  • 采用key-calue(键值对)的存储形式

1.3Redis优点

  • 具有极高的数据读写速度
  • 支持丰富的数据类型
  • 支持数据的持久化
  • 原子性
  • 支持数据备份

1.4Redis和Memcached区别

MemcachedRedis
类型Key-value数据库Key-value数据库
过期策略支持支持
数据类型单一数据类型五大数据类型
持久化不支持支持
主从复制不支持支持
虚拟内存不支持支持

2.Redis数据类型

2.1 String(字符串)

string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value
string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化对象
string类型是redis最基本的数据类型,string类型的值最大能存储512M

2.1.1实例

set string1  10	##设置键值对:set 键 值,表示string1值为10 
get string1		##获取键的值:get10
Incr string1	##键值自增1
11
Decr string1	##键值自减1
10
Decrby string1 5	#键值自减5(自定义)
5
Incrby string1 7	#键值自增7(自定义)
12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.2Hash(哈希)

Redis hash是一个键值(key=>value)对集合
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象
场景:存储、读取、修改用户属性

2.2.1实例

hset hash1 key1 a	#hset添加hash数据
hset hash1 key2 b
hset hash1 key3 c
hset hash1 field1 a1 field2 a2
hget hash1 key1		#hget获取hash数据
a
hmget hash1 key1 key2 key3		#hmget获取多个hash数据
a b c
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.3 List(列表)

Redis列表是简单的字符串列表,按照插入顺序,可以添加一个元素到列表的头部(左边)或者尾部(右边)
场景:最新消息排行等功能、消息队列

2.3.1实例

lpush list1 1		#lpush从左边推入值
lpush list1 2
lpush list1 3
lien list1		#lien查看某个list数据类型的长度
3
rpop list1		#rpop从右边弹出值
1
lien list1
2
lpop list1		#lpop从左边弹出值
3
rpush list2 1		#rpush从右边推入值
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2.4 set(集合)

Redis的set是string类型的无序集合
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)
场景:共同好友、好友推荐

2.4.1实例

sadd set1 12	#sadd key member添加一个string元素到key对应的set集合中,成功返回1,如果元素已经在集合中返回0
1
sadd set1 13
1
sadd set1 12
0
scard set1		#scard查看set数据中存在的元素个数
2
sismember set1 11		#sismember判断set数据中是否存在某个元素
0
sismember set1 13
1
srem set1 12		#srem删除某个set数据中的元素
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2.5 zset(sorted set:有序集合)

Redis zset和set一样也是string类型元素的集合,且不允许重复的值
不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序
zset的成员是唯一的,但分数(score)却可以重复
场景:排行榜、带权重的消息队列

2.5.1实例

zadd zset1 1.1 val1		#zadd key score member天啊及元素到集合,元素在集合中存在则更新对应score
zadd zset1 2.2 val2
zcard		#查询
zrang			#数据排序
  • 1
  • 2
  • 3
  • 4

3.部署redis

编译安装

tar -zxvf redis-5.0.4.tar.gz 
make && make PREFIX=/usr/local/redis install
ln -s /usr/local/redis/bin/* /usr/bin/
cd redis-5.0.4/utils/
./install_server.sh		##交互式安装,指定各种文件目录
  • 1
  • 2
  • 3
  • 4
  • 5

管理redis服务

/etc/init.d/redis_6379 stop	#关闭服务
/etc/init.d/redis_6379 start	#开启服务
/etc/init.d/redis_6379 restart		#重启服务
/etc/init.d/redis_6379 status		#查看服务运行状态
  • 1
  • 2
  • 3
  • 4

修改配置文件

vi /etc/redis/6379.conf
bind 127.0.0.1 192.168.20.80	#监听地址,增加本机IP
port 6379		#默认端口号6379
daemonize yes		#启用守护进程
pidfile /var/run/redis_6379.pid		#指定PID文件
loglevel notice		#日志级别
logfile /var/log/redis_6379.log		#指定日志文件
dir /var/lib/redis/6379		#指定本地数据库存放目录
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

连接redis数据库

/usr/local/redis/bin/redis-cli		#连接本地数据库
redis-cli -h 192.168.20.80|-p 6379		#连接远程数据库
连接后操作
ping		#检测redis服务是否启动
exit/quit	#退出
  • 1
  • 2
  • 3
  • 4
  • 5

reids命令工具

redis-server		#用于启动redis
redis-benchmark		#用于检测redis在本机的运行效率
redis-check-aof		#修复AOF持久化文件
redis-check-rdb		#修复RDB持久化文件
redis-cli			#redis命令行工具
redis-setimel		#哨兵模式启动工具
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4.redis压力测试

redis-benchmark是官方自带的redis性能测试工具,可以有效的测试redis服务性能
基本语法为:redis-benchmark 【option】 【option value】
选项(option):
-h:指定服务器主机名
-p:指定服务器端口
-s:指定服务器socket
-c:指定并发连接数
-n:指定请求数
-d:以字节的形式指定SET/GET值的数据大小
-k:1=keep alive 0=reconnect
-r:SET/GET/INCR 使用随机 key,SADD使用随机值
-p:通过管道传输请求
-q:强制退出redis,仅显示query/sec值
–csv:以CSV格式输出
-l:生成循环,永久执行测试
-t:仅运行以逗号分隔的测试命令列表
-I:Idle模式。仅打开N个idle连接并等待

4.1测试操作

向IP为192.168.20.80、端口号为6379的redis服务器发送100个并发连接与100000个请求测试性能

redis-benchmark -h 192.168.20.80 -p 6379 -c 100 -n 100000
  • 1

单独测试某项操作性能

redis-benchmark -t setget -n 100000 -q
  • 1

4.2测试效果

部分效果(string数据类型读写性能)
在这里插入图片描述

5.多数据库操作

redis支持多数据库,默认支持16个数据库,0-15命名
多数据库相互独立,互不干扰

5.1多数据库操作常用命令

5.1.1 key相关命令

1.keys
使用keys命令可以取符合规则的键值列表,通常可以结合*、?等选项来使用

set k1 1
set k2 2
set v33 3
set v4 4
keys *		#查看当前数据库中所有键
1)k1
2)k2
3)v33
4)v4
keys k*		#查看当前数据库中以k开头的所有键
1)k1
2)k2
keys v?	#查看当前数据库中以v开头并只跟了一个参数的键
1)v4
keys v??	#查看当前数据库以v开头并跟了两个参数的键
1)v33
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

5.1.2 del删除

del命令可以删除当前数据库指定的key

keys *
1)k1
2)k2
del k2		#删除k2
(integer)1
get k2
(nil)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

5.1.3 exists 判断存在

exists命令可以判断键值是否存在

exists k1
(integer)1	#表示键存在
exists k2
(integer)0	#表示不存在
  • 1
  • 2
  • 3
  • 4

5.1.4 flushdb 清空数据库数据

redis数据库的整库数据删除主要分为两个部分:1,清空当前数据库数据,2,使用flushdb清空所有数据库数据

flushdb		#清空所有数据库数据
ok	#返回删除完成确认
  • 1
  • 2

5.1.5 move 多数据库移动

redis数据库提供了一个move命令,可以进行多数据库的数据移动,命令的基本语法格式为move key dbindex,启动key表示目标键,dbindex表示目标序号

select 0		#切换至目标数据库0
get k1	#查看是否存在
move k1 1	#将数据库0中的k1移动到数据库1get k1		#数据此时不存在
select 1
get k1		#数据存在数据库1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

5.1.6 select 多数据库切换

redis支持多数据库,在redis没有任何改动的情况下默认包含16个数据库,数据库名称是用数字0-15一次命名,使用select可以进行redis的多数据库之间的切换,命名格式为select index,index表示数据库序号,使用redis-cli连接数据库后,默认使用序号为0的数据库

select 15		##切换至数据库15
  • 1

5.1.7 rename 重命名

rename命令是对已有key进行重命名,格式为rename 源key 目标key,使用rename进行重命名时,无论目标key是否存在都进行重命名,且源key的值会覆盖目标key的值,在实际使用过程中,建议先用exists命令查看目标key是否存在,再决定是否重命名,以避免覆盖数据

keys v*
1)v3
2)v4
get v3
3
rename v3 v2
keys v*
1)v2
2)v4
get v2
3
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

5.1.8 renamenx

renamenx命令作用是对已有key进行重命名,并检测新名是否存在,其命令格式与rename的命令格式除命令关键字不同外基本相同,renamenx 源key 目标key,使用renamenx命令进行重命名时,如果目标key存在则不进行重命名

keys *
1)k1
2)k2
renamenx k1 k2
(integer)0	#失败
  • 1
  • 2
  • 3
  • 4
  • 5

5.1.9 type 查看value值类型

使用type可以获取key对应的value值类型

type k1
string		#查询到为字符串型
  • 1
  • 2

6.redis持久化

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

持久化分类
RDB:创建快照的方式获取某一时刻Redis中所有数据的副本
AOF:将执行的写命令写到文件的末尾,以日志的方式来记录数据的变化

RDB和AOF的区别
·RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入到临时文件,写入成功后,在替换之前的文件,用二进制压缩存储
·AOF持久化以日志的形式记录服务器所处理的每一个写,删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录

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

6.1 RDB

6.1.1 RDB优缺点

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

6.1.2 RDB持久化操作

通过RDB文件恢复数据
将dump.rdb文件拷贝到redis的安装目录的bin目录下,重启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   #是否进行压缩
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

6.2 AOF

6.2.1 AOF优缺点

Redis默认不开启
弥补RDB的不足(数据的不一致性)
采用日志的形式来记录每个写操作,并追加到文件中
Redis重启会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
根据AOF文件恢复数据

6.2.2 AOF持久化操作

根据AOF文件恢复数据
将appendonly.aof文件拷贝到Redis安装目录的bin目录下,重启Redis服务即可
配置文件选项

vi /etc/redis/6379.conf
appendonly yes  	#开启AOF持久化
appendfilename "appendonly.aof"   #AOF文件名称
#appendfsync always     #同步持久化,每次发生数据变化会立刻写入磁盘
appendfsync everysec    #默认推荐,每秒异步记录一次(默认值)
#appendfsync no      	#不同步,交给操作系统决定如何同步
aof-load-truncated yes   #忽略最后一条可能存在问题的指令
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

6.2.3 AOF重写

AOF的重写机制
AOF的工作原理是将写操作追加到文件中,问价你的冗余内容会越来越多
当AOF文件的大小超过所设定的阈值时,Redis就会对AOF文件的内容压缩
AOF重写的原理
Redis会fork出一条新进程,读取内存中的数据(并没有读取旧文件),并重新写到一个临时文件中,最后替换旧的aof文件

AOF重写配置

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命令
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

7. redis性能管理

7.1查看redis内存使用

127.0.0.1:6379> info memory
# Memory
used_memory:2650536
used_memory_human:2.53M    
## 内存使用总量     
used_memory_rss:12120064
used_memory_rss_human:11.56M
used_memory_peak:2650536
used_memory_peak_human:2.53K
...
mem_fragmentation_ratio:4.57
 ## 内存碎片率      
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

7.2 redis内存碎片率

  • 操作系统分配的内存值used_memory_res除以Redis使用的内存值used_memory计算得出
  • 内存碎片是由操作系统低效的分配/回收物理内存导致的
    不连续的物理内存分配
  • 跟踪内存碎片率对理解Redis实例的资源性能是非常重要的
    ·内存碎片率稍大于1是合理的,这个值表示内存碎片率比较低
    ·内存碎片率超过1.5,说明Redis消耗了实际需要物理内存的150%,其中50%是内存碎片率
    ·内存碎片率低于1的,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换

7.3 redis内存使用率

  • redis实例的内存使用率超过可用最大内存,操作系统将开始进行内存与swap空间交换
  • 避免内存交换
    ·针对缓存数据大小选择
    ·尽可能的使用Hash数据结构
    ·设置key的过期时间

7.4 回收key

  • 保证合理分配redis有限的内存资源
  • 当达到设置的最大阈值时,需选择一种key的回收策略
    ·默认情况下回收策略是禁止删除
    ·redis.conf配置文件中修改maxmemory-policy属性值
volatile-lru:使用LRU算法从已设置过期时间的数据集合中淘汰数据
volatile-ttl:从已设置过期时间的数据集合中挑选即将过期的数据淘汰
volatile-random:从已设置过期时间的数据集合中随机挑选数据淘汰
allkeys-lru:使用LRU算法从所有数据集合中淘汰数据
allkeys-random:从数据集合中任意选择数据淘汰
no-enviction:禁止淘汰数据
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/973634
推荐阅读
相关标签
  

闽ICP备14008679号