NoSQL之Redis配置与优化

一、关系数据库和非关系数据库
1、关系数据库与非关系型数据库
(1)关系型数据库
一个结构化的数据库,创建在关系模型基础上·一般面向于记录
包括Oracle、MySQL、SQL Server、Microsoft Access、DB2等
(2)非关系型数据库
除了主流的关系型数据库外的数据库,都认为是非关系型
包括Redis、MongBD、Hbase、CouhDB等
2、非关系型数据库产生背景
High performance——对数据库高并发读写需求
Huge Storage——对海量数据高效存储与访问需求
High Scalability && High Availability———对数据库高可扩展性与高可用性需求
3、Redis简介
Redis基于内存运行并支持持久化,采用key-value(键值对)的存储形式优点
●具有极高的数据读写速度
●支持丰富的数据类型
●支持数据的持久化
●原子性
●支持数据备份
二、Redis安装部署
解压软件包、
make &&make install、
设置Redis相关配置文件、
查看运行状态
从官网下载安装包到/opt目录下

[root@localhost ~]# cd /opt
[root@localhost opt]# ll
-rw-r--r--. 1 root root 1984203 Nov  3 05:52 redis-5.0.7.tar.gz
[root@localhost redis-5.0.7]# yum -y install gcc gcc-c++
[root@localhost redis-5.0.7]# make
[root@localhost redis-5.0.7]# make install
[root@localhost redis-5.0.7]# cd utils
[root@localhost utils]# ./install_server.sh		//一直回车,即选择默认配置
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!
[root@localhost utils]# netstat -natp|grep 6379
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      66224/redis-server  
[root@localhost utils]# redis-cli -h 127.0.0.1 -p 6379 --raw		//--raw 可以解决中文显示的问题
127.0.0.1:6379> 

此时已经安装完毕,但只能从本地登录,进入主配置文件,绑定ip即可从20.0.0.151登录

[root@localhost utils]# redis-cli -h 20.0.0.151 -p 6379 --raw
Could not connect to Redis at 20.0.0.151:6379: Connection refused
not connected> 
[root@localhost utils]# vi /etc/redis/6379.conf
bind 127.0.0.1 20.0.0.151			//第70行 添加20.0.0.151
[root@localhost utils]# /etc/init.d/redis_6379 stop
[root@localhost utils]# netstat -anpt |grep redis
[root@localhost utils]# /etc/init.d/redis_6379 start
[root@localhost utils]# netstat -anpt |grep redis
tcp        0      0 20.0.0.151:6379         0.0.0.0:*               LISTEN      66420/redis-server  
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      66420/redis-server
[root@localhost utils]# redis-cli -h 20.0.0.151 -p 6379 --raw
20.0.0.151:6379> 

三、Redis数据库常用命令
1、redis-cli命令行工具
(1)连接本地数据库

[root@localhost utils]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379>

(2)连接远程数据库

[root@localhost utils]# redis-cli -h 192.168.10.161 -p 6379
20.0.0.151:6379>

2、存放数据(set)、获取数据(get)

20.0.0.151:6379> set name lisi
OK
20.0.0.151:6379> get name
lisi

3、key相关命令
●keys:获取符合规则的键值列表

20.0.0.151:6379> keys name
1) "name"

●exists:判断键值是否存在

20.0.0.151:6379> exists name
(integer) 1

●del:删除当前数据库的指定key

20.0.0.151:6379> del name
(integer) 1

●type:获取key对应的value值类型

20.0.0.151:6379> type name
string

●rename(覆盖) / renamenx(不覆盖):对已有的key进行重命名

20.0.0.151:6379> get name
"lisi"
20.0.0.151:6379> rename name names
OK
20.0.0.151:6379> get names
"lisi"

●dbsize:查看当前数据库中key的数目
●设置超时时间PEXPIRE(单位:毫秒)

20.0.0.151:6379> pexpire name 30000			//
(integer) 1

●查看剩余时间PTTL(单位:毫秒)

20.0.0.151:6379> pttl name					//此时未设置超时时间,-1永不超时
(integer) -1
20.0.0.151:6379> pexpire name 30000			//设置超时时间为30秒
(integer) 1
20.0.0.151:6379> pttl name					//剩余时间为26.7秒
(integer) 26763
20.0.0.151:6379> get name					//已超时,键值对消失
(nil)
20.0.0.151:6379> pttl name					//键值对已经超时
(integer) -2

●取消超时时间PERSIST(单位:毫秒)

20.0.0.151:6379> pexpire name 30000
(integer) 1
20.0.0.151:6379> pttl name
(integer) 24944
20.0.0.151:6379> persist name
(integer) 1
20.0.0.151:6379> pttl name
(integer) -1

4、redis-benchmark测试工具
-h:指定服务器主机名
-p:指定服务器端口
-c:指定并发连接数
-n:指定请求数
-d:以字节的形式指定SET/GET值的数据大小
-q:强制退出Redis,仅显示query/sec值
EX:测试存取大小为100字节的数据包的性能

[root@localhost utils]# redis-benchmark -h 20.0.0.151 -p 6379 -q -d 100
PING_INLINE: 98135.42 requests per second
PING_BULK: 92250.92 requests per second
SET: 90909.09 requests per second
GET: 92081.03 requests per second
......

5、Redis多数据库操作
(1)Redis支持多数据库,默认支持16个数据库,0-15命名,不可以自定义数据库名称
(2)多数据库相互独立,互不干扰
(3)多数据库常用命令
●多数据库间切换

20.0.0.151:6379> select 0~15
	●多数据库间移动数据
20.0.0.151:6379> get name
(nil)
20.0.0.151:6379> move name 1
(integer) 1
20.0.0.151:6379> select 1
OK
20.0.0.151:6379[1]> get name
"lisi"
	●清除数据库内数据

无论在哪个数据库操作,所有库都会清空

20.0.0.151:6379> set name lisi
OK
20.0.0.151:6379> keys *
1) "name"
20.0.0.151:6379> select 1
OK
20.0.0.151:6379> set names zs
OK
20.0.0.151:6379[1]> keys *
1) "names"
20.0.0.151:6379[1]> flushall
OK
20.0.0.151:6379[1]> keys *
(empty list or set)
20.0.0.151:6379> keys *
(empty list or set)

PS:传统数据库按应用存储,而Redis是按照实际环境存储的
四、五种数据类型
1、String (字符串)
string是redis 最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。string类型是二进制安全的。redis的string 可以包含任何数据。比如jpg图片或者序列化的对象。string类型是 Redis最基本的数据类型,string 类型的值最大能存储512MB.

20.0.0.151:6379> set name lisi
OK
20.0.0.151:6379> get name
lisi

2、Hash(哈希字典)
Redis hash是一个键值(key=>value)对集合。
Redis hash 是一个string 类型的 field和value的映射表,hash 特别适合用于存储对象。每个hash可以存储2的32次方-1键值对。
//作用场景:
键值对集合,即编程语言中的Map类型
适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值

20.0.0.151:6379> hmset stu name lisi age 18 sex male hob running
OK
20.0.0.151:6379> hget stu name
lisi
20.0.0.151:6379> hget stu age
18

3、.–List(列表)
Redis列表是简单的字符串列表,按照插入顺序排序,可以重复。可以添加一个元素到列表的头部(左边)或者尾部(右边)。列表最多可存储2的32次方-1元素。key允许重复
//作用场景:
●增删快,提供了操作某一段元素的API
●最新消息排行等功能(比如朋友圈的时间线)
●消息队列

20.0.0.151:6379> lpush stu1 name age sex
3
20.0.0.151:6379> lrange stu1 0 10				//它是倒过来的排序,存取类似于乐高玩具,最后加入的序号靠前
sex
age
name

4、Set(集合)
Redis 的Set是string类型的无序集合。
集合是通过哈希表实现的。所以添加,删除,查找的复杂度都是O(1)。
//作用场景:
●共同好友
●利用唯一性,统计访问网站的所有独立ip
●好友推荐时,根据tag求交集,大于某个阈值就可以推荐
sadd命令
添加一个string元素到 key对应的set集合中,成功返回1,如果元素已经在集合中返回0。

20.0.0.151:6379> sadd color green red yellow
3
20.0.0.151:6379> smembers color
yellow
green
red

5、zset(sorted set:有序集合)
Redis zset和set一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序.zset的成员是唯一的,但分数(score)却可以重复。
//作用场景:
将Set中的元素增加一个权重参数score,元素按score有序排列
●数据插入集合时,已经进行天然排序
●排行榜
●带权重的消息队列
zadd命令
添加元素到集合,元素在集合中存在则更新对应score

20.0.0.151:6379> zadd hob 0 sw
1
20.0.0.151:6379> zadd hob 1 run
1
20.0.0.151:6379> zadd hob 3 jump
1
20.0.0.151:6379> zadd hob 2 rap
1
20.0.0.151:6379> zrangebyscore hob 0 3
sw
run
rap
jump

四、Redis持久化
1、持久化概述
●Redis是运行在内存中,内存中的数据断电丢失
●为了能够重用Redis数据,或者防止系统故障,需要将Redis中的数据写入到磁盘空间中,即持久化
2、持久化分类
(1)RDB方式:创建快照的方式获取某一时刻Redis中所有数据的副本
Redis的默认持久化方式
默认文件名dump.rdb
触发条件
●在指定的时间间隔内,执行指定次数的写操作(配置文件控制)
●执行save或者是bgsave(异步)命令
●执行flushall命令,清空数据库所有数据
●执行shutdown命令,保证服务器正常关闭且不丢失任何数据
优缺点
●适合大规模的数据恢复
●如果业务对数据完整性和一致性要求不高,RDB是很好的选择
●数据的完整性和一致性不高
●备份时占用内存
操作过程
将dump.rdb文件拷贝到redis的安装目录的bin目录下,重启redis服务即可(/var/lib/redis/6379)
配置文件选项

vim /etc/redis/6379.conf
save 900 1						//900秒之内至少一次写操作、300秒之内至少发生10次写操作、60秒之内发生至少10000次写操作,
save 300 10						  只要满足其一都会触发快照操作,注释所有的save项表示关闭RDB
save 60 10000
dbfilename dump.rdb				//RDB文件名称
dir /var/lib/redis/6379			//RDB文件路径
rdbcompression yes				//是否进行压缩

(2)AOF方式:将执行的写命令写到文件的末尾,以日志的方式来记录数据的变化
●Redis默认不开启
●弥补RDB的不足(数据的不一致性)
●采用日志的形式来记录每个写操作,并追加到文件中Redis 重启会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
操作过程
将appendonly.aof文件拷贝到Redis的安装目录的bin目录下,重启Redis服务即可(/var/lib/redis/6379)
配置文件选项

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

五、Redis性能管理
1、查看Redis内存使用

20.0.0.151:6379> info memory
# Memory
used_memory:854056
used_memory_human:834.04K
used_memory_rss:12865536
used_memory_rss_human:12.27M
used_memory_peak:24700264
........

2、内存碎片率
(1)操作系统分配的内存值used_memory_rss除以Redis使用的内存值used_memory计算得出
(2)内存碎片是由操作系统低效的分配/回收物理内存导致的
不连续的物理内存分配
(3)跟踪内存碎片率对理解Redis实例的资源性能是非常重要的
●内存碎片率稍大于1是合理的,这个值表示内存碎片率比较低
●内存碎片率超过1.5,说明Redis消耗了实际需要物理内存的150%,其中50%是内存碎片率
●内存碎片率低于1的,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换
3、内存使用率
(1)redis实例的内存使用率超过可用最大内存,操作系统将开始进行内存与swap空间交换
(2)避免内存交换
●针对缓存数据大小选择
●尽可能的使用Hash数据结构
●设置key的过期时间
4、回收key
(1)保证合理分配redis有限的内存资源
(2)当达到设置的最大阀值时,需选择—种key的回收策略
●默认情况下回收策略是禁止删除
●redis.conf配置文件中修改maxmemory-policy 属性值

volatile-lru						//使用LRU算法从已设置过期时间的数据集合中淘汰数据 
volatile-ttl						//从已设置过期时间的数据集合中挑选即将过期的数据淘汰 
volatile-random						//从已设置过期时间的数据集合中随机挑选数据淘汰 
allkeys-Iru							//使用LRU算法从所有数据集合中淘汰数据
allkeys-random						//从数据集合中任意选择数据淘汰 
no-enviction						//禁止淘汰数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值