redis

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集群进入宕机状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值