NoSQL
摘自百度百科
NoSQL, 泛指非关系型的数据库. 随着互联网 web2.0 网站的兴起, 传统的关系数据库在应付 web2.0 网站, 特别是超大规模和高并发的 SNS 类型的 web2.0 纯动态网站已经显得力不从心, 暴露了很多难以克服的问题, 而非关系型的数据库则由于其本身的特点得到了非常迅速的发展. NoSQL 数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战, 尤其是大数据应用难题.
NoSQL 数据库的四大分类
1. 键值 (Key-Value) 存储数据库
这一类数据库主要会使用到一个哈希表, 这个表中有一个特定的键和一个指针指向特定的数据. Key/value 模型对于 IT 系统来说的优势在于简单, 易部署. 但是如果 DBA 只对部分值进行查询或更新的时候, Key/value 就显得效率低下了. 举例如: Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB.
2. 列存储数据库.
这部分数据库通常是用来应对分布式存储的海量数据. 键仍然存在, 但是它们的特点是指向了多个列. 这些列是由列家族来安排的. 如: Cassandra, HBase, Riak.
3. 文档型数据库
文档型数据库的灵感是来自于 Lotus Notes 办公软件的, 而且它同第一种键值存储相类似. 该类型的数据模型是版本化的文档, 半结构化的文档以特定的格式存储, 比如 JSON. 文档型数据库可 以看作是键值数据库的升级版, 允许之间嵌套键值. 而且文档型数据库比键值数据库的查询效率更高. 如: CouchDB, MongoDB. 国内也有文档型数据库 SequoiaDB, 已经开源.
4. 图形 (Graph) 数据库
图形结构的数据库同其他行列以及刚性结构的 SQL 数据库不同, 它是使用灵活的图形模型, 并且能够扩展到多个服务器上. NoSQL 数据库没有标准的查询语言(SQL), 因此进行数据库查询需要制定数据模型. 许多 NoSQL 数据库都有 REST 式的数据接口或者查询 API. 如: Neo4J, InfoGrid, Infinite Graph.
因此, 我们总结 NoSQL 数据库在以下的这几种情况下比较适用: 1, 数据模型比较简单; 2, 需要灵活性更强的 IT 系统; 3, 对数据库性能要求较高; 4, 不需要高度的数据一致性; 5, 对于给定 key, 比较容易映射复杂值的环境.
Redis 简介
Redis 是完全开源免费的, 遵守 BSD 协议, 是一个高性能的 key-value 数据库, 也是 NoSQL 数据库.
Redis 与其他 key - value 缓存产品有以下三个特点:
Redis 支持数据的持久化, 可以将内存中的数据保存在磁盘中, 重启的时候可以再次加载进行使用.
Redis 不仅仅支持简单的 key-value 类型的数据, 同时还提供 list,set,zset,hash 等数据结构的存储.
Redis 支持数据的备份, 即 master-slave 模式的数据备份.
Redis 优势
1. 性能极高 - 官方对 Redis 进行测试, 50 个并发执行 100000 个请求, Redis 读的速度是 110000 次 / s, 写的速度是 81000 次 / s .
2. 丰富的数据类型 Redis 是基于 key/value 形式进行存储 key 我们一般认为是 String 类型, value 有五种类型
* String 字符串
* Hash 哈希类型 类似 Java 中的 HashMap 类型
* List 链表
* Set 集合
* Sorted Set 有序集合 (也称 zset)
3. 原子 - Redis 的所有操作都是原子性的, 意思就是要么成功执行要么失败完全不执行. 单个操作是原子性的. 多个操作也支持事务, 即原子性, 通过 MULTI 和 EXEC 指令包起来.
4. 丰富的特性 - Redis 还支持 publish/subscribe, 通知, key 过期等等特性.
Redis 与其他 key-value 存储有什么不同?
Redis 有着更为复杂的数据结构并且提供对他们的原子性操作, 这是一个不同于其他数据库的进化路径. Redis 的数据类型都是基于基本数据结构的同时对程序员透明, 无需进行额外的抽象.
Redis 运行在内存中但是可以持久化到磁盘, 所以在对不同数据集进行高速读写时需要权衡内存, 因为数据量不能大于硬件内存. 在内存数据库方面的另一个优点是, 相比在磁盘上相同的复杂的数据结构, 在内存中操作起来非常简单, 这样 Redis 可以做很多内部复杂性很强的事情. 同时, 在磁盘格式方面他们是紧凑的以追加的方式产生的, 因为他们并不需要进行随机访问.
Redis 使用
Redis 的 Windows 客户端端使用
Redis 命令十分丰富, 包括的命令组有 Cluster,Connection,Geo,Hashes,HyperLogLog,Keys,Lists,Pub/Sub,Scripting,Server,Sets,Sorted Sets,Strings,Transactions 一共 14 个 Redis 命令组两百多个 Redis 命令, 如果您有兴趣请上 Redis 官网查看全部的 Redis 命令, 在这里我们只针对 Redis 的常用命令以及五种数据类型相关的命令进行操作
1. 启动 Redis-server.exe 服务器端
2. 打开 Redis-cli.exe 客户端
Redis 的常用命令(Redis 中的 key 和 value 都区分大小写)
String 类型的指令
1. 存储: set key value
- 127.0.0.1:6379> set username laowang
- OK
2. 获取: get key
- 127.0.0.1:6379> get username
- "laowang"
3. 删除: del key
- 127.0.0.1:6379> del username
- (integer) 1
Hash 类型的指令
1. 存储: hset key field value
- 127.0.0.1:6379> hset myhash address beijing
- (integer) 1
- 127.0.0.1:6379> hset myhash level one
- (integer) 1
2. 获取:
* hget key field: 获取指定的 field 对应的值
- 127.0.0.1:6379> hget myhash level
- "one"
* hgetall key: 获取所有的 field 和 value
- 127.0.0.1:6379> hgetall myhash
- 1) "address"
- 2) "beijing"
- 3) "level"
- 4) "one"
3. 删除: hdel key field
- 127.0.0.1:6379> hdel myhash level
- (integer) 1
List 类型的指令
1. 添加:
1. lpush key value: 将元素加入列表左侧
2. rpush key value: 将元素加入列表右侧
- 127.0.0.1:6379> lpush myList 1
- (integer) 1
- 127.0.0.1:6379> lpush myList 2
- (integer) 2
- 127.0.0.1:6379> rpush myList 2
- (integer) 3
- 127.0.0.1:6379> rpush myList 3
- (integer) 4
2. 获取: lrange key start end : 范围获取 (0 -1 指获取所有)
- 127.0.0.1:6379> lrange myList 0 -1
- 1) "2"
- 2) "1"
- 3) "2"
- 4) "3"
3. 删除:
1. lpop key: 删除列表最左边的元素, 并将元素返回
2. rpop key: 删除列表最右边的元素, 并将元素返回
- 127.0.0.1:6379> lpop myList
- "2"
- 127.0.0.1:6379> rpop myList
- "3"
Set 类型的指令 set 类型的 value 是唯一的
1. 存储: sadd key value
- 127.0.0.1:6379> sadd myset one
- (integer) 1
- 127.0.0.1:6379> sadd myset one
- (integer) 0
- 127.0.0.1:6379> sadd myset ONE
- (integer) 1
2. 获取: smembers key: 获取 set 集合中所有元素
- 127.0.0.1:6379> smembers myset
- 1) "one"
- 2) "ONE"
3. 删除: srem key value: 删除 set 集合中的某个元素
- 127.0.0.1:6379> srem myset ONE
- (integer) 1
Sorted Set 类型的指令
1. 存储: zadd key score value
- 127.0.0.1:6379> zadd mysort 666 laotie
- (integer) 1
- 127.0.0.1:6379> zadd mysort 66 meimaobing
- (integer) 1
- 127.0.0.1:6379> zadd mysort 6 chenduxiu
- (integer) 1
2. 获取: zrange key start end [withscores]
- 127.0.0.1:6379> zrange mysort 0 -1
- 1) "chenduxiu"
- 2) "meimaobing"
- 3) "laotie"
- 127.0.0.1:6379> zrange mysort 0 -1 withscores
- 1) "chenduxiu"
- 2) "6"
- 3) "meimaobing"
- 4) "66"
- 5) "laotie"
- 6) "666"
3. 删除: zrem key value
- 127.0.0.1:6379> zrem mysort laotie
- (integer) 1
其他常用的指令 :
1. dbsize : 返回当前数据库的 key 的数量.
- 127.0.0.1:6379> dbsize
- (integer) 2
2. Keys pattern: 查找所有符合给定模式 pattern 的 key .
在 Redis 中存值
- 127.0.0.1:6379> set One1 Redis
- OK
- 127.0.0.1:6379> set One2 MySQL
- OK
- 127.0.0.1:6379> set One3 oracle
- OK
- 127.0.0.1:6379> set One4 MongoDB
- OK
- 127.0.0.1:6379> keys One*
- 1) "One3"
- 2) "One4"
- 3) "One1"
- 4) "One2"
- 127.0.0.1:6379> keys * (该指令不建议使用)
- 1) "myhash"
- 2) "One3"
- 3) "One4"
- 4) "One1"
- 5) "One2"
- 6) "mysort"
3. del key [key ...] : 删除给定的一个或多个 key, 以及对应的 value, 不存在的 key 会被忽略, 该指令可以将任意数据类型删除
- 127.0.0.1:6379> del One1 One2
- (integer) 2
4. type key : 返回 key 所储存的值的类型.
- 127.0.0.1:6379> type mysort
- zset
- 127.0.0.1:6379> type myhash
- hash
- 127.0.0.1:6379> type One3
- string
5. exists key : 检查指定 key 是否存在
- 127.0.0.1:6379> exists hehe
- (integer) 0
- 127.0.0.1:6379> exists myhash
- (integer) 1
6. expire key seconds: 为给定 key 设置生存时间, 当 key 过期时(生存时间为 0 ), 它会被自动删除. seconds 的单位为秒.
- 127.0.0.1:6379> expire One3 20
- (integer) 1
- 127.0.0.1:6379> get One3
- "oracle"
- 127.0.0.1:6379> get One3
- "oracle"
- 127.0.0.1:6379> get One3
- "oracle"
- 127.0.0.1:6379> get One3
- (nil)
7. ttl key 以秒为单位, 返回给定 key 的剩余生存时间(TTL, time to live).
当 key 不存在时, 返回 -2 .
当 key 存在但没有设置剩余生存时间时, 返回 -1 .
否则, 以秒为单位, 返回 key 的剩余生存时间.
- 127.0.0.1:6379> set myTtl myRedis
- OK
- 127.0.0.1:6379> set myTtl2 myRedis2
- OK
- 127.0.0.1:6379> expire myTtl 30
- (integer) 1
- 127.0.0.1:6379> ttl myTtl
- (integer) 20
- 127.0.0.1:6379> ttl myRedis
- (integer) -2
- 127.0.0.1:6379> ttl myTtl2
- (integer) -1
8. flushall: 清空整个 Redis 服务器的数据(删除所有数据库的所有 key ), 此命令从不失败.
flushdb : 清空当前数据库中的所有 key, 此命令从不失败.
- 127.0.0.1:6379> flushdb
- OK
- 127.0.0.1:6379> flushall
- OK
- 127.0.0.1:6379> keys *
- (empty list or set)
来源: https://www.cnblogs.com/cpq1995/p/10734205.html