关于NoSQL
随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发
的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的
数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数
据集合多重数据种类带来的挑战,尤其是大数据应用难题。
NoSQL有如下优点:易扩展,NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库
的关系型特性。数据之间无关系,这样就非常容易扩展。无形之间也在架构的层面上带来了可扩展
的能力。大数据量,高性能,NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表
现优秀。这得益于它的无关系性,数据库的结构简单
一,关系型数据库和非关系型数据库
1,关系型数据课
- 一个结构化的数据库,创建在关系模型基础上
- 一般面相与记录
- 包括以下
- oracle,mysql,sql server,microsoft access,db2等 sybase数据库才是老大
2,非关系型数据课
- 除了主流的关系型数据库外的数据库,都认为是非关系型数据库
- 包括以下
- redis, mongbd,hbase,couhdb等
3,时间序列数据库
- 是原本的非关系数据库中加入了时间轴的概念
- 例如微信朋友圈
4,非关系型数据库产生背景
- High performance—对数据库高并发读写需求
- huge storage–对海量数据高效存储与访问需求
- high scalability && high availability----对数据库高可扩展性与高可用性需求
二,redis安装部署
1,什么是Redis ?
-
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。同时 redis也是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
-
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。 也是最受欢迎的数据库之一。
-
Redis基于内存运行并支持持久化
-
采用key-value(链值对)的存储形式
-
优点
- 具有极高的数据读写速度
- 支持丰富的数据类型
- 支持数据的的持久化
- 原子性
- 支持数据备份
2,Redis安装部署
(1)操作步骤
解压软件包–make&&make install —设置redis相关配置文件—查看运行状态
(2)编译安装Redis
tat xzvf redis---
cd redis---/
make -j3 //加线程编译剫更快
make PREFIX=/usr/local/redis install
ln -s /usr/local/redis/bin/* /usr/local/bin/
(3) 设置Redis相关配置文件
[root@server3 redis-5.0.7]# cd utils/
[root@server3 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] #确定端口号
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] #日志文件
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!
[root@server3 utils]#
暗装完成之后登录
[root@server3 utils]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379>
(4)redis进程控制
[root@server3 utils]# /etc/init.d/redis_6379 status
Redis is running (68589)
[root@server3 utils]# /etc/init.d/redis_6379 stop
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
[root@server3 utils]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@server3 utils]# /etc/init.d/redis_6379 restart
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
[root@server3 utils]#
3,Redis配置文件
配置参数(/etc/redis/6379.conf)
- bind:监听的主机地址
- port:端口
- daemonize yes:启用守护进程
- pidfile:指定PID文件(建议使用kill -9,不要使用pkill -9 )
- loglevel notice:日志级别
- logfile:指定日志文件
三,redis数据库常用命令
1,Redis-cli命令行工具
- 将本机地址添加到监听端口,重启服务后测试能否成功登录
[root@server3 utils]# vi /etc/redis/6379.conf
bind 127.0.0.1 20.0.0.30 ###把允许登录的地址加到配置文件的bind后面
[root@server3 utils]# /etc/init.d/redis_6379 restart
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
[root@server3 utils]# netstat -lutap | grep 6379
tcp 0 0 localhost:6379 0.0.0.0:* LISTEN 29276/redis-server
tcp 0 0 localhost:6379 localhost:52850 TIME_WAIT -
[root@server3 utils]#
- 连接本地数据库
[root@server3 utils]# redis-cli
127.0.0.1:6379>
- 连接远程
[root@server3 utils]# redis-cli -h 20.0.0.30 -p 6379
- help @:获取中的命令列表
- help :获取某个命令的帮助
- help :获取可能帮助的主题列表
[root@server3 utils]# redis-cli
127.0.0.1:6379> help @list
BLPOP key [key ...] timeout
summary: Remove and get the first element in a list, or block until one is available
since: 2.0.0
- Redis-cli命令行工具
- set:存放数据
- get:获取数据
127.0.0.1:6379> help 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
127.0.0.1:6379>
127.0.0.1:6379> set teacher zhangli
OK
127.0.0.1:6379> get teacher
"zhangli"
127.0.0.1:6379>
2,key相关命令
- keys: 获取符合罪责的键值列表
#keys *:查看所有键;通配符*和?都支持
20.0.0.30:6379> keys nam?
1) "name"
20.0.0.30:6379> keys na??
1) "name"
- exists:判断当前键值是否存在
20.0.0.30:6379> exists name (integer) 1 #执行失败返回0,执行成功返回非0值
- del:删除当前数据库的指定key
20.0.0.30:6379> keys *
1) "name"
2) "age"
20.0.0.30:6379> del age
(integer) 1
20.0.0.30:6379> keys *
1) "name"
- type:获取key对应的value值类型
20.0.0.30:6379> type name string
- rename(覆盖)/renamenx(不覆盖):对已有的key进行重命名
20.0.0.30:6379> rename name zhangsan
OK
- dbsize:查看当前数据库中Key的数目
20.0.0.30:6379> dbsize (integer)
1
3,Redis-benchmark测试工具
参数 | 功能 |
---|---|
-h | 指定服务器主机名 |
-p | 指定服务器端口 |
-c | 指定并发连接数 |
-n | 指定请求数 |
-d | 以字节的形式指定set/get值的数据大小 |
-q | 强制退出Redis,仅显示query/sec值 |
Redis数据库采用key-value(键值对)的数据存储形式,所使用的命令
●向IP地址为20.0.0.30、端口为6379的Redis服务器发送100个并发连接与10000个请求测试性能
redis-benchmark -h 20.0.0.30 -p 6379 -c 100 -n 10000
●测试存取大小为100字节的数据包的性能
redis-benchmark -h 20.0.0.30 -p 6379 -q -d 100
四,Redis持久化
1 RDB持久化
- Redis的默认持久化方式
- 默认文件名dump.rdb
- 触发条件
- 优缺点
- 适合大规模的数据恢复
- 如果业务对数据完整性和一致性要求不高,RDB是很好的选择
- 数据的完整性和一致性不高
- 备份时占用内存
3, 通过RDB文件恢复数据
- 将dump.rbd文件拷贝到Redis的安装目录的bin目录下,重启Redis服务即可
- 配置文件选项
五 ,Redis性能管理
1,内存碎片率
2,内存使用率
- Redis实例的内存使用率超过可用最大内存,操作系统将开始进行内存与swap空间交换
- 避免内存交换
- 针对缓存数据大小选择
- 尽可能的使用hash数据结构
- 设置key的过期时间
3,回收Key
- 保证合理分配Redis优先的内存资源
- 当达到设置的最大阀值时,需选择一种key的回收策略
- 默认情况下回收策略是禁止删除
- Redis.conf配置文件中修改maxmemory-policy属性值
- volatile-lru:使用lru算法从已设置过期时间的数据集合中淘汰数据
- volatile-ttl:从已设置过期时间的数据集合中淘汰数据
- volatile-random:从已设置过期时间的数据集合中随机挑选数据淘汰
- allkeys-lru:使用lru算法从所有数据集合中淘汰数据
- allkeys-random:从数据集合中任意选择数据淘汰
- no-enviction:禁止淘汰数据