我是靠谱客的博主 雪白便当,最近开发中收集的这篇文章主要介绍随笔:RedisRedis,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Redis

一.Redis概念

1.NOSQL

1.1.什么是NOSQL

NoSql(Not only Sql)泛指非关系型数据库用于超大型和高并发量的网站

1.2.NOSQL分类

在这里插入图片描述

2.Redis

2.1.什么是Redis

是一个开源免费C语言编写的一种非关系型数据库 ,支持key-value存储方式,数据存储在内存,由于其为非关系型数据库,就不一定遵循传统数据库的标准,例如不遵循sql标准,事务,表结构等.

2.2.Redis的优点

1.数据保存在内存,存取速度快,并发能力强

2.它支持存储的value类型相对更多,包括string(字符串)、list(列表)、set(集合)、 zset(sorted set --有序集合)和hash(哈希类型 - map)。

3.redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库(如MySQL)起到很好的补充作用。

4.它提供了Java,C/C++,C#,PHP,JavaScript等客户端,使用很方便。

5.Redis支持集群(主从同步)。数据可以主服务器向任意数量从的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。

6.支持持久化,可以将数据保存在硬盘的文件中

7.支持订阅/发布(subscribe/publish)功能 订阅,群发,订阅频道过后,通过频道可以向所有订阅客户端发送消息

2.3.Redis的使用场景

中央缓存:经常查询数据,放到读速度很快的空间(内存),以便下次访问减少时间。减轻数据库压力,减少访问时间.而redis就是存放在内存中的。

计数器应用:网站通常需要统计注册用户数,网站总浏览次数等等

设定有效期的应用:vip,session等 设定一个数据,到一定的时间失效

自动去重:Uniq 操作,获取某段时间所有数据排重值 这个使用 Redis 的 set 数据结构最合适了,只需要不断地将数据往 set 中扔就行了,set 意为 集合,所以会自动排重。

二.Redis使用

2.1redis结构

在这里插入图片描述

2.2Redis操作

  • String
    keys * :查看所有key
    del key :删除某个key
    expire key : 设置key的过期时间
    ttl key:查看key的过期时间
    flushall :删除所有库的数据
    flushdb:删除当前数据库
    select 1 :选择第索引为1的数据库,默认有16个 ,索引 0 - 15

  • List
    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的值自减去多少

  • 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

Java操作Redis—>Jedis

@Test
public void test()throws Exception{
    //创建连接
    String host ="127.0.0.1";
    int port = 6379;
    int timeout = 1000;//超时时间,1秒超时
    Jedis jedis = new Jedis(host,port,timeout);
    jedis.auth("admin");
    //执行操作
    jedis.set("yhptest","yhptest dbl!");
    System.out.println(jedis.get("yhptest"));
    //关闭连接
    jedis.close();
}

连接池

public void test()throws Exception{
    //1 创建jedispool配置对象
    JedisPoolConfig config = new JedisPoolConfig();
    //2 做配置-四个
    config.setMaxIdle(2);
    config.setMaxTotal(10);
    config.setMaxWaitMillis(1*1000); //创建连接超时
    config.setTestOnBorrow(true);//获取连接是测试连接是否畅通
    //3 创建jedispool
    //1*1000 获取连接超时时间
    JedisPool pool = new JedisPool(config,
            "127.0.0.1",6379,1*1000,"admin");
    //4 通过jedispool获取连接
    Jedis jedis = pool.getResource();
    //5 执行操作
    jedis.set("jedispooltest","dbldblddzt.....");
    System.out.println(jedis.get("jedispooltest"));
    // 6 释放连接
    jedis.close(); //底层做了兼容,如果是连接池操作就是释放,如果是连接操作就是关闭
    // 7 摧毁连接池-如果是真正项目中它应该是一个受spring管理的单例
    pool.destroy();
}

连接池工具类

public class RedisUtil {
    private static JedisPool pool=null;
    static {
        JedisPoolConfig config = new JedisPoolConfig();
        //2 做配置-四个
        config.setMaxIdle(2);
        config.setMaxTotal(10);
        config.setMaxWaitMillis(5000); //创建连接超时
        config.setTestOnBorrow(true);//获取连接是测试连接是否畅通
        //3 创建jedispool
        //1*1000 获取连接超时时间
        pool = new JedisPool(config,
                "127.0.0.1",6379,1000);
    }
    public static Jedis getRedis(){
        return pool.getResource ();
    }
}

其余操作方法和redis命令基本一致

Redis持久化配置

redis提供了两种持久化配置方式RDB,AOF,以通过修改redis.conf来进行配置.

  • RDB

RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照,默认开启该模式.
如何关闭 rdb 模式:
save “”
save 900 1 //至少在900秒的时间段内至少有一次改变存储同步一次
save xxx
save 60 10000

  • AOF
    AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集,默认关闭该模式。
    如何开启aof模式:
    appendonly yes //yes 开启,no 关闭
    appendfsync always //每次有新命令时就执行一次fsync
    这里我们启用 everysec
    appendfsync everysec //每秒 fsync 一次
    appendfsync no //从不fsync(交给操作系统来处理,可能很久才执行一次fsync)
  • redis是怎么保存数据?
    redis为了考虑效率,保存数据在内容中.并且考虑数据安全性,还做数据持久化,如果满足保存策略,就会把内存的数据保存到数据rdb文件,还来不及保存那部分数据存放到aof更新日志中。在加载时,把两个数据做一个并集。

Redis淘汰策略

淘汰一些数据,达到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集群

  • 分布式:分布式是指将不同的业务分布在不同的地方. web应用和数据库服务分开.,将不同业务分布到不同集群.
  • 集群:集群指的是将多台服务器集中在一起,实现同一业务。 数据库集群和应用集群和功能集群

集群的目的

  • 防止单点故障,防止一台服务器挂掉整个应用完全挂掉
  • 实现高可用,提高作业能力和可用性
  • 处理大量数据,redis数据存储在内存当中,集群可以提高redis数据存储量
  • 处理高并发

集群的特性

两大关键特性
集群提供了以下两个关键特性:
1、可扩展性--集群的性能不限于单一的服务实体,新的服务实体可以动态地加入到集群,从而增强集群的性能。动态添加服务器
2、高可用性--集群通过服务实体冗余使客户端免于轻易遇到out of service的警告。在集群中,同样的服务可以由多个服务实体提供。如果一个服务实体失败了,另一个服务实体会接管失败的服务实体。集群提供的从一个出错的服务实体恢复到另一个服务实体的功能增强了应用的可用性
当访问的服务器挂了时,集群要有能力找可以正常使用额服务器继续提供服务器。
2)两大能力
为了具有可扩展性和高可用性特点,集群的必须具备以下两大能力:
1、负载均衡--负载均衡能把任务比较均衡地分布到集群环境下的计算和网络资源。
2、错误恢复--由于某种原因,执行某个任务的资源出现故障,另一服务实体中执行同一任务的资源接着完成任务。这种由于一个实体中的资源不能工作,另一个实体中的资源透明的继续完成任务的过程叫错误恢复。
当访问的服务器挂了时,集群要有能力找可以正常使用额服务器继续提供服务器。

负载均衡和错误恢复都要求各服务实体中有执行同一任务的资源存在,而且对于同一任务的各个资源来说,执行任务所需的信息视图(信息上下文)必须是一样的

  • 分布式和集群的区别
    都是处理高并发,而且都需要多台服务器协同.一把在一个系统中同时存在分布式和集群.
    不同点:
    分布式中不同服务器处理是不同业务.而集群处理时同一业务.
Redis三种模式
主从复制模式(又叫读取分离)

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

写请求到主Redis,读请求到从Redis ,读/写的路由需要负载均衡器(主Twemproxy/从Twemproxy) ,而主从Redis的负载均衡器需要做主备切换(keeplived)
在这里插入图片描述

  • 优点 :
    数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

故障恢复:当主节点出现问题时可以由从节点提供服务实现快速的故障恢复;实际上是一种服务的冗余

负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

读写分离:可以用于实现读写分离,主库写、从库读,读写分离不仅可以提高服务器的负载能力,同时可根据需求的变化,改变从库的数量。

高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

  • 缺点
    不具备自动容错和恢复功能 :主从宕机会影响前端的部分请求失败,需要重启机器或者手动切换前端IP才能恢复
    主机宕机数据丢失:宕机前部分有部分数据未同步到从机,切换IP后会引入数据不一致降低系统可用性
    数据大的问题:并没有解决无法存储海量数据问题
哨兵模式

哨兵的作用就是监控Redis的运行状况,其包括两个功能
(1).监控主从节点是否正常运行
(2).当主节点出现故障,自动将从节点提升为主节点,保证正常运行在这里插入图片描述优点:其拥有主从复制的所有优点,并且可以自动检查完成故障保障功能
但其仍没有实现海量数据存储

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

最后

以上就是雪白便当为你收集整理的随笔:RedisRedis的全部内容,希望文章能够帮你解决随笔:RedisRedis所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部