关于NoSQL数据库
NoSQL = Not Only SQL,它的最大特点就是:
- 以简单的键值对存储数据
- 不遵循SQL标准
- 不支持ACID
- 性能远超SQL数据库且非常稳定
典型的NoSQL数据库
Memcache:
- 数据都在内存中,一般不持久化。通过多线程+锁的方式实现其高性能。
- 支持键值对
- 常被用做数据库的缓存
Redis: 几乎具备了MemCache的所有功能,同时在其之上,支持持久化,支持多种数据结构。
MongoDB:文档数据库,支持存储文档及二进制文件。
DynamoDB: AWS家的主打NoSQL数据库,用于保存JSON数据。
安装和启动
我这里直接使用docker来启动Redis:
bash
docker run -d redis
进入Redis容器:
bash
docker exec -it REDIS_CONTAINER_ID /bin/bash
Redis介绍
在Redis中,默认有16个数据库(0-15号),进入Redis之后,默认使用0号数据库。比如:
bash
127.0.0.1:6379> set k '123'
OK
127.0.0.1:6379> KEYS *
1) "k"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> KEYS *
(empty array)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> KEYS *
1) "k"
可以把Redis中的数据库看作是传统数据库中的Schema,对于不同的应用:
- 如果把数据都放在同一个Redis数据库中,则数据会非常杂乱,不易管理
- 如果开启多个Redis服务器,则会导致运维成本增加
Redis中的多个数据库方式则完美的解决了这个问题,对于不同应用,可以使用不同的Redis数据库。
Redis通过单线程+多路IO复用技术实现了其高性能。注意很多Redis的操作都是原子性的,一旦开始,就不会被打断。
Redis中的数据类型
- String:Redis的String是类似ArrayList的一个动态字符串(Simple Dynamic String),其中可以包含任何数据,包括二进制数据(图片,声音,序列化对象等)。但要注意,一个String类型中能够存储的值最多为512MB。
- List: Redis中的List是一个双向字符串列表。
- Set:Set的最大特点就是没有重复数据。其内部实现采用的是哈希表。
- Hash:是一个键值对集合,极适合存储对象。
- Zset(有序集合):在这种类型中,元素同样不重复,但每个单元都关联了一个评分。成员的值唯一,但评分(score)不唯一。由于其有序性,因此访问中间位置的成员同样时非常快的。
- Bitmaps: 通过这个类型实现位操作。其实它本身也是一个字符串。和其他方式相比,Bitmaps的最大优势就是其占据内存空间小(每个值只占据一个bit)。
- HyperLogLog: 主要针对和基数相关的统计,比如:Unique Visitors
- Geospatial: 专门针对GPS的数据类型
对发布/订阅的支持
在Redis中还支持消息的发布和订阅。比如在客户端中进行订阅指定频道的消息:
bash
127.0.0.1:6379> subscribe news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news"
3) (integer) 1
在另一个客户端中发布消息到该频道:
bash
127.0.0.1:6379> publish news "breaking news"
(integer) 1
在第一个客户端中可以收到消息通知:
bash
3) "breaking news"