NoSQL
NoSQL(Not Only SQL):非关系型数据库。有些数据的数据类型不需要固定的模式,无需多余操作就可以横向扩展。NoSQL无需为事先为要存储的数据建立字段,随时可以存储自定义的数据格式。
- KV键值对:Redis
- 文档型数据库:MongoDB
- 列存储数据库
- 图关系数据库
分布式数据库的CAP和BASE
概述
- 一个Redis实例存在16个数据库,默认连接的是0号数据库,使用select num选择连接的数据库。
- move key db:将某个key移动到某个数据库。
- ping:返回PONG则连接成功
- keys pattern
- del key [key …]
- exists key [key …]
- type key
- dbsize: 查看当前数据库key数量
- flushdb
- flushall
数据结构
string
- set key value [EX seconds] [PX milliseconds] [NX|XX]
- get key
list
- 有排序的字符串集合,允许重复元素
- llen list
- lpush key value [value …]
- rpush key value [value …]
- lrange key start stop (从0开始)
- lpop key
- rpop key
set
- 无排序的字符串集合,不允许重复元素
- sadd key member [member …]
- smembers:获取所有元素
- scard:获取集合中元素个数
- spop key:随机出栈
- smove key1 key2 key1中某个值:将key1中某个值移到key2
- sismember:是否为set中的元素
hash
- hset key field value
- hget key field
- hdel key field [field …]
sorted-set(Zset)
- zadd key [NX|XX] [CH] [INCR] score member [score member …]
事务
- multi:开始事务
- discard:取消事务
- exec:执行事务
- watch key [key …]:如果事务开始前这些key被其他命令修改过,那么事务被打断
- unwatch
- 正常执行
- 放弃事务
- 全体连坐:当某条命令不等执行EXEC便报错,则全部命令放弃执行。
- 冤头债主:当某条命令在EXEC后才报错,则只会影响它自己的执行。
- Watch监控:执行了exec或unwatch后所有监控锁都会被清除。
持久化
RDB方式(Redis DataBase)
- 在指定的时间间隔内将内存中的数据集快照写入磁盘,恢复时直接将快照文件恢复到内存。
- 保存在dump.rdb文件中。
- 优势:只有一个文件,时间间隔的数据,可以归档为一个文件,方便压缩转移(就一个文件)
- 劣势:如果宕机,数据损失比较大,因为它是没一个时间段进行持久化操作的。也就是积攒的数据比较多,一旦懵逼,就彻底懵逼了。另外,fork的时候内存中的数据被克隆了一份,大致两倍的膨胀性。
- 默认打开。
AOF方式(Append only file)
- 以日志的形式来记录每个写操作,不记录读操作,只能追加文件而不能修改,redis启动之初会根据日志来恢复。
- 保存在appendonly.aof文件中。
- 优势:即使宕机,也不会损失数据,也不会破坏原有日志文件,保证数据的安全性。
- 劣势:文件比rdb大,效率更低。
- 在redis.conf文件中,默认关闭。
主从复制,读写分离
Master以写为主,Slave以读为主。
哨兵模式:
- 6379带着6380和6381
- conf文件所在目录下新建sentinel.conf文件(名字不能错)。
- 配置哨兵:在sentinel文件中填写:sentinel monitor 被监控数据库名字(自己起) 127.0.0.1 6379 1(1表示主机挂掉以后slave投票决定下一个master是谁)
- 启动哨兵:Reids-sentinel …/sentinel.conf。
- 若哨兵监控到master挂了,则投票使某个slave成为master(假设是6380),当6379重新启动后,它将成为6380的slave。
集群
Jedis
连接
直接连接:
1 | Jedis jedis = new Jedis("127.0.0.1", 6379); |
连接池方式:
1 | JedisPoolConfig config = new JedisPoolConfig(); |
事务
1 | Transaction transaction = jedis.multi(); |
主从复制
1 | Jedis jedis_M = new Jedis("127.0.0.1",6379); |
连接池
1 | public class JedisPoolUtil { |
Redisson
概述
Redisson是架设在Redis基础上的一个Java驻内存数据网格。
Jedis和Redisson对比
- Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;
- Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。
- Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。
- Jedis中的方法调用是比较底层的暴露的Redis的API,也即Jedis中的Java方法基本和Redis的API保持着一致,了解Redis的API,也就能熟练的使用Jedis。
- Redisson中的方法则是进行比较高的抽象,每个方法调用可能进行了一个或多个Redis方法调用。
- 在分布式开发中,Redisson可提供更便捷的方法。