键值存储数据库:主要使用哈希表,这个表中有一个特定的键和一个指针指向特定的数据。如Redis,Voldemort,Oracle BDB
列存储数据库:通常用来应对分布式存储的海量数据。键仍然存在,但是他们的特点是指向了多个列,如HBase,Rlak
文档型数据库:数据模型是版本化的文档,半结构化的文档已特定的格式存储,比如JSON.文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。如:CouchDB,MongoDB(基于分布式文件存储的数据库)
图形数据库:图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST格式的数据接口或者查询API,如Neo4J,InfoGrid,Infinite Graph
小结:NOSQL的数据模型:KV键值、BSON、列族 和 图形
C
: Consistency 一致性A
: Availability 可用性P
:Partition Tolerance分区容错性CA :满足一致性,可用性的系统,通常在可扩展性上不太强大:传统关系型数据库。
CP: 满足一致性,分区容忍必的系统,通常用户操作响应上不太稳定:Redis、MongoDB、HBase等
AP: 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些:使用在DNS上
分区容忍性是我们必须要实现的。也就是只能在一致性和可用性之间权衡。没有NOSQL系统能同时保证这三点。
传统关系型数据库系统的事务都有ACID的属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)
Redis
是以key-value
store存储,data structure service 数据结构服务器。键可以包含String字符串,哈希,list链表,set集合,zset有序集合。这些数据集合都支出push/pop、add/remove及取交集以及更丰富的操作,redis支持各种不同方式排序,为了保证效率,数据都是缓存在内存中,它可以周期性的把更新的数据写入磁盘或者把修改操作写入追加到文件里
可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
RDB
:定期将数据刷入硬盘;AOF
:以日志的形式来记录每个写操作,AOF实时性较高MULTI
和EXEC
指令包起来# 使用wget 下载redis安装包
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
# 通过 -C 指定到安装的目录
tar -zxvf redis-4.0.10.tar.gz -C /usr/local/
#进入指定目录
cd /usr/local/redis-4.0.10.tar.gz/
#执行mark命令
make
如果取消监听,可以去掉bind这一行。同时设置一个密码 requirepass 密码
vim /usr/local/redis-4.0.10/redis.conf
/usr/local/redis-4.0.10/src/redis-server /usr/local/redis-4.0.10/redis.conf &
# Redis服务端的默认连接端口是6379
在【】里面的内容只是简化安装过程。可以忽略
以上步骤就基本完成安装了:http://www.redis.cn/download.html
启动服务:
/usr/local/redis-4.0.10/src/redis-server
redis-cli
进行使用:/usr/local/redis-4.0.10/src/redis-cli
#退出客户端quit
#启动时指定配置文件
/usr/local/redis-4.0.10/src/redis-server /usr/local/redis-4.0.10/redis.conf
#如果觉得命令太长,则可以将拷贝和移动文件。
(注意要使用后台启动,所以修改redis.conf里的 daemonize
改为yes
)
#修改配置文件
vim /usr/local/redis-4.0.10/redis.conf
#daemonize=yes
ps -ef | grep redis 查看是否有redis服务 或者 查看端口:
netstat -tunpl | grep 6379
pkill redis-server 、
kill 进程号、
/usr/local/redis-4.0.10/src/redis-cli shutdown
Redis支持五种数据类型:string
(字符串),hash
(哈希),list
(列表),set
(集合)及zset
(sorted set:有序集合)。
Redis 命令参考:http://redisdoc.com/
redis 的索引都是从0开始; 默认有16个数据库
命令 | 描述 |
---|---|
select 0 |
redis 默认开启16个database 。select index 选择数据库 |
dbsize |
数据库key的大小 |
keys * |
获取所有的key |
flushdb |
清空当前库 |
flushall |
清空所有库 |
exists key |
判断某个key是否存在 |
move key db |
将当前数据库的 key 移动到给定的数据库 db 当中 。例如 move name 1 将name 移动到db 1 |
EXPIRE key seconds |
为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除 |
TTL key |
以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live); 当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间 |
TYPE key |
返回 key 所储存的值的类型 |
string 是 redis 最基本的类型,一个 key 对应一个 value,string 类型是 redis 最基本的数据类型,string 类型的值最大能存储 512MB
[root@101 src]# ./redis-cli
127.0.0.1:6379> set name "redis"
OK
127.0.0.1:6379> get name
"redis"
127.0.0.1:6379>
使用命令: set
和 get
命令 | 描述 |
---|---|
SET key value [EX seconds] [PX milliseconds] [NX|XX] |
将字符串值 value 关联到 key;如果 key 已经持有其他值, SET 就覆写旧值,无视类型NX :只在键不存在时,才对键进行设置操作 SET key value NX 效果等同于SETNX key value 。XX :只在键已经存在时,才对键进行设置操作 |
GET key |
返回 key 所关联的字符串值。 如果 key 不存在那么返回特殊值 nil 。 假如 key 储存的值不是字符串类型,返回一个错误,因为 GET 只能用于处理字符串值 |
DEL key [key ...] |
删除给定的一个或多个 key 。不存在的 key 会被忽略 |
APPEND key value |
如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。 如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。 |
STRLEN key |
返回 key 所储存的字符串值的长度。当 key 储存的不是字符串值时,返回一个错误。 |
SETEX key seconds value |
将值 value 关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位)。如果 key 已经存在, SETEX 命令将覆写旧值 |
MGET key [key ...] |
返回所有(一个或多个)给定 key 的值。如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。因此,该命令永不失败 |
更多命令查看参考链接 | …… |
Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
#语法格式如下:
HMSET key field value [field value ...]
同时将多个 field-value (域-值)对设置到哈希表 key 中。
此命令会覆盖哈希表中已存在的域。
如果 key 不存在,一个空哈希表被创建并执行 HMSET 操作
redis> HMSET website google www.google.com yahoo www.yahoo.com
OK
redis> HGET website google
"www.google.com"
redis> HGET website yahoo
"www.yahoo.com"
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
#语法格式如下:
LPUSH key value [value ...]
127.0.0.1:6379> lpush language redis python java
(integer) 3
127.0.0.1:6379> lrange language 0 3
1) "java"
2) "python"
3) "redis"
127.0.0.1:6379>
set集合是string类型的无效集合,set是通过hashtable实现的,对集合我们可以取交集、并集、差集
#sadd 添加一个 string 元素到 key 对应的 set 集合中,成功返回1,如果元素已经在集合中返回 0,
#如果 key 对应的 set 不存在则返回错误
127.0.0.1:6379> sadd books jianai biancheng
(integer) 2
127.0.0.1:6379> smembers books
1) "biancheng"
2) "jianai"
127.0.0.1:6379>
#语法格式:
ZADD key score member [[score member] [score member] ...]
将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。
127.0.0.1:6379> zadd page_rank 1 google.com 2 baidu.com 3 bing.com
(integer) 3
127.0.0.1:6379> zrange page_rank 0 -1 withscores
1) "google.com"
2) "1"
3) "baidu.com"
4) "2"
5) "bing.com"
6) "3"
127.0.0.1:6379>
redis.conf 配置项说明如下:
Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes
启用守护进程
daemonize no
当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid
文件,可以通过pidfile指定
pidfile /var/run/redis.pid
指定Redis监听端口,默认端口为6379,
绑定的主机地址
bind 127.0.0.1
当 客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
timeout 300
指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning
,默认为verbose
日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
logfile stdout
设置数据库的数量,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id
指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
maxmemory
指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendonly no
设置密码,requirepass 增加一个行
例如:增加密码参数:requirepass 密码
详细内容参见:http://www.runoob.com/redis/redis-conf.html
http://blog.51cto.com/cuchadanfan/1700711
http://www.runoob.com/redis/redis-intro.html
http://redisdoc.com/