一文详解NOsql数据库Redis

409 阅读6分钟
一图详解DB的分支产品


Nosql数据库介绍

是一种非关系型数据库服务,它能解决常规数据库的并发能力,比如传统的数据库的IO与性能的瓶颈,同样它是关系型数据库的一个补充,有着比较好的高效率与高性能。

专注于key-value查询的redis、memcached、ttserver

解决以下问题:

1)对数据库的高并发读写需求

2)大数据的高效存储和访问需求

3)高可扩展性和高可用性的需求

Nosql数据库的应用环境

1)数据模型比较简单

2)需要灵活性更强的IT系统

3)对数据库的性能要求较高

4)不需要高度数据一致性

5)对于给定KEY,比较容易映射复杂值的环境

Nosql软件的分类与特点

1)key-value键值存储数据库(redis、memcached)

  1. 用于内容缓存,适合负载并扩展大的数据集

  2. 数据类型是一系列的键值对

  3. 有快速查询功能,但存储数据少结构化

  4. 对事务的支持不好,数据库故障产生时不可进行回滚

2)列存储数据库(HBase)

  1. 用于分布式的文件系统

  2. 以列簇式存储,将同一列数据存在一起

  3. 查找速度快,可扩展强,更容易进行分布式扩展

  4. 功能相对局限

3)面向文件的数据库(mongoDB)

  1. 用于WEB应用较多

  2. 数据类型是一系列键值对

  3. 查询性能不高,没有统一的查询语法

4)图形数据库(Graph)

  1. 社交网络应用较多

  2. 不容易做分布式的集群方案

常用的Nosql数据库介绍

1)memcached

是一个开源高性能的,具有分布式内存对象的缓存系统

特点:

1、安装布署简单

2、支持高并发、高性能

3、通过程序或负载均衡可以实现分布式

4、仅为内存缓存,重启服务数据丢失

官方网站:http://memcached.org

2)memcacheDB

是新浪基于memcached开发的一个开源项目,具备了事务恢复功能

特点:

1、高并发读写

2、高效存储

3、高可用数据存储

官方网站:http://memcachedb.org/benchmark.html

生产环境如何选择Nosql数据库

1、最常规的缓存应用,memcached最合适

2、持久化存储方案memcacheDB

3、2000万以内数据量的小数据用memcached

4、大数据量可以用redis

redis持久化数据服务

REmote DIctionary server(redis)是一个基于key-value键值对的持久化数据库存储系统,对支持数据存储类型更多,包括字符串、列表、集合等

是一种持久化缓存服务,会周期的把更新的数据写入磁盘以及把修改操作记录追加到文件里记录下来,还支持主从同步模式,是一个开源的基于C语言编写的,支持网络、内存可持久化的日志型、key-value数据库

redis持久服务的特点
  1. key-value键值类型存储系统

  2. 支持数据可靠存储

  3. 单进程单线程高性能服务器

  4. 恢复比较慢

  5. 单机qps(秒并发)可以达到10W

  6. 适合小数据高速读写访问

redis存储系统优、缺点:

  1. 可以持久化存储数据

  2. 支持每秒10W的读写频率

  3. 支持丰富的数据类型

  4. 所有操作都是原子性的

  5. 支持异机主从复制

  6. 内存管理开销大(低于物理内存的3/5)

  7. 不同命令延迟差别大

官方网站:http://www.redis.io

redis持久化介绍

redis将数据存储于内存中,通过快照、日志两种方式实现持久化存储,前者性能高,会有数据丢失的情况,后者相反。

redis应用场景

MYSQL+memcached网站架构的问题:数据量大就需要拆表,需要扩容,数据一致性是个问题

1)最佳应用场景就是内存服务

2)作为memcached替代方案

3)对数据一致性有一定要求但不高的业务

4)需要更多数据类型支持的业务

5)需要主从同步及负载均衡的业务

redis的安装

要进行主从同步配置,可以实现故障切换,主上禁用数据持久化,从上配置,内存要够大

wget http://download.redis.io/releases/redis-2.8.24.tar.gz
[root@redis-m tools]#tar zxf redis-2.8.24.tar.gz
[root@redis-m tools]#cd redis-2.8.24
[root@redis-m redis-2.8.24]#make
[root@redis-m redis-2.8.24]#make PREFIX=/application/redis-2.8.24 install
[root@redis-m redis-2.8.24]#ln -s /application/redis-2.8.24 /application/redis
[root@redis-m tools]# tree /application/redis
/application/redis
`-- bin
    |-- redis-benchmark #性能测试工具
    |-- redis-check-aof #检测更新日志
    |-- redis-check-dump #检查本地数据库rdb文件
    |-- redis-cli #命令行客户端操作工具
    |-- redis-sentinel -> redis-server
    `-- redis-server #服务的启动程序

配置环境变量

[root@redis-m tools]# echo "PATH=/application/redis/bin:$PATH">>/etc/profile
[root@redis-m tools]# source /etc/profile
[root@redis-m tools]# which redis-server
/application/redis/bin/redis-server

查看帮助文档

[root@redis-m tools]# redis-server --help
Usage: ./redis-server [/path/to/redis.conf] [options]
       ./redis-server - (read config from stdin)
       ./redis-server -v or --version
       ./redis-server -h or --help
       ./redis-server --test-memory <megabytes>
Examples:
       ./redis-server (run the server with default conf)
       ./redis-server /etc/redis/6379.conf
       ./redis-server --port 7777
       ./redis-server --port 7777 --slaveof 127.0.0.1 8888
       ./redis-server /etc/myredis.conf --loglevel verbose

启动服务

[root@redis-m ~]# cd /application/redis/   
[root@redis-m redis]# ll
total 4
drwxr-xr-x 2 root root 4096 Mar 22 04:50 bin
[root@redis-m redis]# mkdir conf
[root@redis-m redis]# cp /download/tools/redis-2.8.24/redis.conf ./conf/
[root@redis-m redis]# redis-server /application/redis/conf/redis.conf &
[6072] 22 Mar 05:00:51.373 # Server started, Redis version 2.8.24
[6072] 22 Mar 05:00:51.374 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

#内存不足的时候,数据加载到磁盘可能失效,可以使用命令解决或修改配置文件

[6072] 22 Mar 05:00:51.375 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
[6072] 22 Mar 05:00:51.375 * The server is now ready to accept connections on port 6379
[root@redis-m redis]# lsof -i :6379
COMMAND PID USER FD  TYPE DEVICE SIZE/OFF NODE NAME
redis-ser 6072 root 4u IPv6  24271 0t0  TCP *:6379 (LISTEN)
redis-ser 6072 root 5u IPv4 24273 0t0  TCP *:6379 (LISTEN)
vm.overcommit_memory

0表示用户空间请求更多内存时,内核尝试估算出余下可用内存

1表示内核允许最大限度的的使用内存

关闭服务命令

[root@redis-m redis]# redis-cli shutdown
[6072] 22 Mar 05:09:32.699 # User requested shutdown...
[6072] 22 Mar 05:09:32.699 * Saving the final RDB snapshot before exiting.
[6072] 22 Mar 05:09:32.710 * DB saved on disk
[6072] 22 Mar 05:09:32.711 # Redis is now ready to exit, bye bye...
[1]+  Done  redis-server /application/redis/conf/redis.conf

如果需要了解redis集群相关的知识可参考前面的文章

Redis集群生产环境高可用方案实战过程