NoSql
NoSql泛指非关-----系型的数据库,出现是为了解决MySql的不足。
关系型的数据库是以关系(由行和列组成的二维表)模型为核心的数据库,有表的存储系统。
Redis
Redis是一个高性能的NoSql,数据保存在内存中(以key-value的形式)。
Redis严格讲是一种数据结构化存储方法的集合。
Redis的特点
1.数据保存在内存并支持持久化,存取速度快、并发能力强、数据安全性高。
2.支持value类型、支持多个语言客户端、支持集群(高并发、海量数据)。
MySql、Memcached和Redis的区别
MySql:关系型数据库,存储在磁盘中,不支持存储过期,读写性能低。
Memcached:非关系型数据库,存储在内存中,支持存储过期,读写性能高。
Redis:非关系型数据库,存储在磁盘和内存中,支持存储过期,读写性能高。
Redis的使用场景
1.中央缓存
2.计数器应用
3.实时放攻击系统
4.排行榜
5.自动去重
6.设定有效期(如vip、红包等)
7.队列
8.消息订阅系统
redis-cli客户端操作redis
key的操作
- keys * :查看所有key
- del key :删除某个key
- expire key : 设置key的过期时间
- ttl key:查看key的过期时间
- flushall :删除所有库的数据
- flushdb:删除当前数据库
- select 1 :选择第索引为1的数据库,默认有16个 ,索引 0 - 15
String的操作
- set key value :存储一个键值对
- get key :获取某个值
- mset key value key value :设置多个键值对
- mget key key :获取多个key的值
- incr key :key的值加 1
- decr key :key的减去 1
- incrBy key number:key的值自增多少
- decrBy key number: key的值自减去多少
List的操作
- lpush key value value value :从左边存
- rpush key value value value :从右边存
- lrange key start end :取范围内的元素 0 -1 查询所有
- lpop key : 从左边移出一个并返回
- rpop key :从右边移出一个并返回
- lrem key count value :删除 ,key中的value,count > 0从左边删除count个元素,count< 0 从右边删除count个 ,count == 0删除所有
- lindex key index :返回列表 key 中,下标为 index 的元素
- ltrim key start stop :对一个列表进行修剪,把范围外的删除,保留范围内的元素
Set的操作
- sadd key member member member:将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略
- srem key member :移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略
- smembers key :返回集合 key 中的所有成员。
ZSet的操作
- zadd key score member score member : 添加 score是member的分数
- zcard key: 成员数量
- zcount key start end :范围内的元素个数
- zrange:分数排序从小到大
- zrevrange:分数从大到小排序
Hash的操作
- hset 大key 小key value
- hget 大key 小key
- hmset 大key 小key value 小key value
- hmget 大key 小key 小key
- hkeys :获取所有key
- hvals:获取所有值
- hgetall :获取所有的key和value
存储对象的方式
方式一(String):set user:1 {“id”:1,username:“zs”}
方式二(hash) : hmset user:1 id 1 username zs
java操作redis
简单配置
public void test(){
//ip、端口、毫秒
Jedis jedis = new Jedis("127.0.0.1", 6379, 1000);
jedis.auth("123456");//密码
jedis.set("name","zs");
String name = jedis.get("name");
System.out.println(name);
jedis.close();
}
工具类
public class JedisUnit {
//连接池对象
private static JedisPool pool = null;
static {
//创建jedispool配置对象
JedisPoolConfig config = new JedisPoolConfig();
//配置最大空闲连接数
config.setMaxIdle(2);
//配置最大活动连接数
config.setMaxTotal(10);
//从连接池获得一个连接时
config.setMaxWaitMillis(1*1000);
//获取连接时测试连接是否畅通
config.setTestOnBorrow(true);
pool = new JedisPool(config,"127.0.0.1",6379,1*1000,"682611");
}
//获取连接对象
public static Jedis getJedis(){
return pool.getResource();
}
}
Redis持久化配置
Redis提供了两种不同级别的持久化方式:RDB和AOF,可以通过修改redis.conf来进行配置。
RDB:RDB持久化可以在指定的时间间隔内生成数据集的时间点快照,默认开启该模式。
AOF:AOF持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集,默认关闭该模式。
淘汰策略
淘汰一些数据,达到redis数据都是有效的。
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰。
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰。
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰。
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰。
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰。
no-enviction(驱逐):禁止驱逐数据。
redis 确定驱逐某个键值对后,会删除这个数据并,并将这个数据变更消息发布到本地(AOF 持久化)和从机(主从连接)。
Redis的集群和分布式
集群
集群就是多个服务器做相同的事情,他们的所有代码,处理的业务都是一样的, 每个服务器都是一个完整的应用。
集群的原因
- 防止单点故障: 不做集群,一但服务器挂了,那么整个应用就挂了。
- 实现高可用(作业能力) :一个服务器的能力有限,多个服务器可以提升作业能力和提升可用性。
集群的特性
- 可扩展性:灵活的动态增加/减少服务器
- 高可用性:(防止单点故障)一个服务器挂了,还有另外的服务器顶着。一个请求过来,总会有相应结果。
集群的能力
- 负载均衡
把请求根据某种算法分发(路由)到集群的应用 - 错误恢复
集群下的某个应用挂了需要找到能用的服务继续处理请求 , 并且挂掉的服务可以根据没挂服务做(数据)恢复 - 主备切换 - Redis
对于应用的集群,某个应用挂掉了,集群中需要有其他的应用顶上以处理请求。
分布式
多个服务器做不同的事情,每个服务的代码处理的业务都是不一样的,所有的服务器组成一个完整的应用。
集群和分布式的区别
集群是多个节点处理相同的任务,分布式是多个节点处理不同的任务。
Redis主从复制
主从复制是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
写请求到主Redis,读请求到从Redis ,读/写的路由需要负载均衡器(主Twemproxy/从Twemproxy) ,而主从Redis的负载均衡器需要做主备切换(keeplived)
主从复制的作用
数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
故障恢复:当主节点出现问题时可以由从节点提供服务实现快速的故障恢复;实际上是一种服务的冗余。
负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
读写分离:可以用于实现读写分离,主库写、从库读,读写分离不仅可以提高服务器的负载能力,同时可根据需求的变化,改变从库的数量。
高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
主从的缺点
不具备自动容错和恢复功能:主从宕机会影响前端的部分请求失败,需要重启机器或者手动切换前端IP才能恢复。
主机宕机数据丢失:宕机前部分有部分数据未同步到从机,切换IP后会引入数据不一致降低系统可用性。
数据大:数据量特别大一个主是存储不了。
Redis哨兵模式
当主服务器中断服务后,可以将一个从服务器升级为主服务器,以便继续提供服务,但是这个过程需要人工手动来操作。
哨兵模式的优缺点
优点:拥有主从的所有有点,可以自动的检查,实现故障恢复功能(从提升为主)。
缺点:不能存储大量数据。
Redis-Cluster集群
拥有主从和哨兵的所有优点并解决了数据存储的问题。
为什么要Redis-Cluster
redis的哨兵模式基本已经可以实现高可用,读写分离,但是在这种模式下每台redis服务器都存储相同的数据,很浪费内存,所以在redis3.0上加入了cluster模式,实现的redis的分布式存储,也就是说每台redis节点上存储不同的内容。
什么是Redis-Cluster
Redis-Cluster采用无中心结构,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。
数据分散存储
Redis集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)的方式来分配的。redis cluster默认分配了16384个slot,当我们set一个key时,会用CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。
容错机制-投票
为了防止主节点数据丢失,可以为每个主节点可以准备特点数目的备节点,主节点挂掉从节点可以升级为主节点(哨兵模式) 。
容错机制指的是,如果半数以上master节点与故障节点通信超过(cluster-node-timeout),认为该节点故障,自动触发故障转移操作,故障节点对应的从节点自动升级为主节点,如果某个主挂掉,而没有从节点可以使用,那么整个Redis集群进入宕机状态。