zoukankan      html  css  js  c++  java
  • Redis

      一、Redis简介

    1.1 什么是Redis

      Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

      Redis 与其他 key - value 缓存产品有以下三个特点:

        Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

        Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

        Redis支持数据的备份,即master-slave模式的数据备份。

    1.2 为什么要用Redis,应用到什么场景

      作用:减轻数据库访问压力

      场景:短信验证码时间有效期、session共享解决方案

    1.3 Redis的优势

      性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。

      丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。

      原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。

      丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

    1.4 Redis与其他的key-value存储有什么不同

      Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。

      Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

    二、Redis的安装

    2.1 Linux下安装Redis

      Redis的官方下载网址是:http://redis.io/download  (这里下载的是Linux版的Redis源码包),Redis服务器端的默认端口是6379。

      2.1.1 将下载的源码包上传到服务器,一般上传到 /opt 目录下,新建文件夹 redis

      2.1.2 解压缩 tar -zxvf xxx.tar.gz

      2.1.3 进入解压后的目录,编译 :make

      (注意,编译需要C语言编译器gcc的支持,如果没有,需要先安装gcc。可以使用rpm -q gcc查看gcc是否安装)

      (利用yum在线安装gcc的命令    yum -y install gcc )

      (如果编译出错,请使用make clean清除临时文件。之后,找到出错的原因,解决问题后再来重新安装。 )

      2.1.4 进入到 src 目录,执行安装:make install

      2.1.5 到此安装完成,可以将可执行文件和配置文件,复制到习惯的 /usr/local 目录下。

      2.1.6 在 /usr/local 下新建 redis,里面创建 etc(配置文件)、bin(可执行文件)

        cp ./redis.conf /usr/local/redis/etc

        cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server redis-sentinel /usr/local/redis/bin

      2.1.7 开放 6379 端口

      1)编辑 /etc/sysconfig/iptables 文件:vi /etc/sysconfig/iptables,加入内容并保存:-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 6379 -j ACCEPT
      2)重启服务:/etc/init.d/iptables restart
      3)查看端口是否开放:/sbin/iptables -L -n

    2.2 Redis的常用命令

      启动:./redis-server /usr/local/redis/etc/redis.conf    为redis-server指定配置文

      进入客户端:./redis-cli

      查询所有数据:keys *

    2.3 修改redis.conf文件

      daemonize yes --- 修改为yes 后台启动

      requirepass 123456  ----注释取消掉设置账号密码

      ps aux | grep '6379'  --- 查询端口

      service iptables stop 停止防火墙

    2.4 Redis的连接方式

      ./redis-cli -h 127.0.0.1 -p 6379 -a "123456"  --- redis 使用账号密码连接

      PING结果表示成功

    2.5 停止Redis

      redis-cli shutdown  或者 kill redis进程的pid

    三、Redis的基本数据类型

    3.1 字符串类型(string)

      redis 127.0.0.1:6379> SET mykey "redis"

      OK

      redis 127.0.0.1:6379> GET mykey

      "redis"

    编号

    命令

    描述说明

    1

    SET key value

    此命令设置指定键的值。

    2

    GET key

    获取指定键的值。

    3

    GETRANGE key start end

    获取存储在键上的字符串的子字符串。

    4

    GETSET key value

    设置键的字符串值并返回其旧值。

    5

    GETBIT key offset

    返回在键处存储的字符串值中偏移处的位值。

    6

    MGET key1 [key2..]

    获取所有给定键的值

    7

    SETBIT key offset value

    存储在键上的字符串值中设置或清除偏移处的位

    8

    SETEX key seconds value

    使用键和到期时间来设置值

    9

    SETNX key value

    设置键的值,仅当键不存在时

    10

    SETRANGE key offset value

    在指定偏移处开始的键处覆盖字符串的一部分

    11

    STRLEN key

    获取存储在键中的值的长度

    12

    MSET key value [key value …]

    为多个键分别设置它们的值

    13

    MSETNX key value [key value …]

    为多个键分别设置它们的值,仅当键不存在时

    14

    PSETEX key milliseconds value

    设置键的值和到期时间(以毫秒为单位)

    15

    INCR key

    将键的整数值增加1

    16

    INCRBY key increment

    将键的整数值按给定的数值增加

    17

    INCRBYFLOAT key increment

    将键的浮点值按给定的数值增加

    18

    DECR key

    将键的整数值减1

    19

    DECRBY key decrement

    按给定数值减少键的整数值

    20

    APPEND key value

    将指定值附加到键

    3.2 列表类型(list)

      

    3.3 集合(set)

      

    3.4 有序集合(sorted set)

    redis127.0.0.1:6379> ZADD runoobkey 1 redis
    (integer)1
    redis127.0.0.1:6379> ZADD runoobkey 2 mongodb
    (integer)1
    redis127.0.0.1:6379> ZADD runoobkey 3 mysql
    (integer)1
    redis127.0.0.1:6379> ZADD runoobkey 3 mysql
    (integer)0
    redis127.0.0.1:6379> ZADD runoobkey 4 mysql
    (integer)0
    redis127.0.0.1:6379> ZRANGE runoobkey 010 WITHSCORES
     
    1)"redis"
    2)"1"
    3)"mongodb"
    4)"2"
    5)"mysql"
    6)"4"
     
     
     
     
     
     
     
     

    3.5 哈希(Hash)
    127.0.0.1:6379>  HMSET runoobkey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
    OK
    127.0.0.1:6379>  HGETALL runoobkey
    1)"name"
    2)"redis tutorial"
    3)"description"
    4)"redis basic commands for caching"
    5)"likes"
    6)"20"
    7)"visitors"
    8)"23000"
    四、Redis与Jedis
    4.1 引入依赖
    <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
    <dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
    </dependency>

    4.2 Java代码

    public class RedisTool {
        private Jedis jedis;
        public  void setup() {
            //连接redis服务器,192.168.0.100:6379
            jedis = new Jedis("192.168.0.100", 6379);
            //权限认证
            jedis.auth("admin");
        }
    }

    五、SpringBoot集成Redis

    5.1 引入依赖

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>

    5.2 配置信息

    ########################################################
    ###Redis (RedisConfiguration)
    ########################################################
    spring.redis.database=0
    spring.redis.host=127.0.0.1
    spring.redis.port=6379
    spring.redis.password=123456
    spring.redis.pool.max-idle=8
    spring.redis.pool.min-idle=0
    spring.redis.pool.max-active=8
    spring.redis.pool.max-wait=-1
    spring.redis.timeout=5000

    5.3 Java代码

    @Service
    publicclass RedisService {
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
        publicvoid setStr(String key, String value) {
            setStr(key, value, null);
        }
        publicvoid setStr(String key, String value, Long time) {
            stringRedisTemplate.opsForValue().set(key, value);
            if (time != null)
                stringRedisTemplate.expire(key, time, TimeUnit.SECONDS);
        }
        public Object getKey(String key) {
            returnstringRedisTemplate.opsForValue().get(key);
        }
        publicvoid delKey(String key) {
            stringRedisTemplate.delete(key);
        }
    }

    六、Redis主从复制

    6.1 为什么要做Redis主从复制,集群?

             提高性能,高可用(当部分服务器出现问题时,有其他可以使用)

    6.2 Redis如何实现高可用?

             利用Redis的哨兵机制,哨兵机制会定时监听主从服务器,如果监听到主服务器宕机了,会在从服务器中选个当做主服务器。

    6.3 克隆虚拟机

      

    6.4 生成新的Mac地址

      

    6.5 主从复制概述

      1)redis的复制功能是支持多个数据库之间的数据同步。一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库。

      2)通过redis的复制功能可以很好的实现数据库的读写分离,提高服务器的负载能力。主数据库主要进行写操作,而从数据库负责读操作。

      

      过程:

      1)当一个从数据库启动时,会向主数据库发送sync命令,

      2)主数据库接收到sync命令后会开始在后台保存快照(执行rdb操作),并将保存期间接收到的命令缓存起来

      3)当快照完成后,redis会将快照文件和所有缓存的命令发送给从数据库。

      4)从数据库收到后,会载入快照文件并执行收到的缓存的命令。

    6.6 修改redis.conf 

      #主服务器地址

      slaveof 192.168.33.130 6379  

      masterauth 123456---主redis服务器配置了密码,则需要配置

    七、哨兵机制

    7.1 什么是哨兵机制

      Redis的哨兵(sentinel) 系统用于管理多个 Redis 服务器,该系统执行以下三个任务:
        • 监控(Monitoring): 哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常。
        • 提醒(Notification):当被监控的某个 Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。
        • 自动故障迁移(Automatic failover):当一个Master不能正常工作时,哨兵(sentinel) 会开始一次自动故障迁移操作,它会将失效Master的其中一个Slave升级为新的Master, 并让失效Master的其他Slave改为复制新的Master; 当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用Master代替失效Master。
      哨兵(sentinel) 是一个分布式系统,你可以在一个架构中运行多个哨兵(sentinel) 进程,这些进程使用流言协议(gossipprotocols)来接收关于Master是否下线的信息,并使用投票协议(agreement protocols)来决定是否执行自动故障迁移,以及选择哪个Slave作为新的Master.
      每个哨兵(sentinel) 会向其它哨兵(sentinel)、master、slave定时发送消息,以确认对方是否”活”着,如果发现对方在指定时间(可配置)内未回应,则暂时认为对方已挂(所谓的”主观认为宕机” Subjective Down,简称sdown).
      若“哨兵群”中的多数sentinel,都报告某一master没响应,系统才认为该master"彻底死亡"(即:客观上的真正down机,Objective Down,简称odown),通过一定的vote算法,从剩下的slave节点中,选一台提升为master,然后自动修改相关配置.
      虽然哨兵(sentinel) 释出为一个单独的可执行文件 redis-sentinel ,但实际上它只是一个运行在特殊模式下的 Redis 服务器,你可以在启动一个普通 Redis 服务器时通过给定 --sentinel 选项来启动哨兵(sentinel).
      哨兵(sentinel) 的一些设计思路和zookeeper非常类似。

    7.2 哨兵机制配置修改

      1.将Redis解压目录下的sentinel.conf拷贝到etc目录

        cp sentinel.conf  /usr/local/redis/etc

      2.修改sentinel.conf配置文件

        sentinel monitor mymast  192.168.110.133 6379 1 #主节点名称IP 端口号选举次数

      3. 修改心跳检测 5000毫秒

        sentinel down-after-milliseconds mymaster 5000

      4.sentinel parallel-syncs mymaster 2 ---最多多少合格(从)节点

      5. 启动哨兵模式

        ./redis-server /usr/local/redis/etc/sentinel.conf --sentinel &

    八、Redis事物

      先以 MULTI 开始一个事务,然后将多个命令入队到事务中,最后由 EXEC 命令触发事务,一并执行事务中的所有命令。

    序号

    命令及描述

    1

    DISCARD 
    取消事务,放弃执行事务块内的所有命令。

    2

    EXEC 
    执行所有事务块内的命令。

    3

    MULTI 
    标记一个事务块的开始。

    4

    UNWATCH 
    取消 WATCH 命令对所有 key 的监视。

    5

    WATCH key [key ...] 
    监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

     九、Redis持久化

      Redis的持久化,就是将内存数据保存到硬盘。有RDB(默认)和AOF两种模式

    9.1 RDB持久化

      RDB 是在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。
      优点:使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能
      缺点:RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候

      RDB默认开启,redis.conf配置下只需要修改定时备份参数即可:

      # 900秒,修改一次存储则保存。

      save 900 1

      save 300 10

      save 60 10000

    9.2 AOF持久化

      Append-only file,将“操作 + 数据”以格式化指令的方式追加到操作日志文件的尾部,在 append 操作返回后(已经写入到文件或者即将写入),才进行实际的数据变更,“日志文件”保存了历史所有的操作过程;当 server 需要数据恢复时,可以直接 replay 此日志文件,即可还原所有的操作过程。AOF 相对可靠,它和 mysql 中 bin.log、apache.log、zookeeper 中 txn-log 简直异曲同工。AOF 文件内容是字符串,非常容易阅读和解析。
      优点:可以保持更高的数据完整性,如果设置追加 file 的时间是 1s,如果 redis 发生故障,最多会丢失 1s 的数据;且如果日志写入不完整支持 redis-check-aof 来进行日志修复;AOF 文件没被 rewrite 之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的 flushall)。
      缺点:AOF 文件比 RDB 文件大,且恢复速度慢。

      AOF默认关闭,需要修改配置:

    ##此选项为aof功能的开关,默认为“no”,可以通过“yes”来开启aof功能
    ##只有在“yes”下,aof重写/文件同步等特性才会生效
    appendonly yes
    
    ##指定aof文件名称
    appendfilename appendonly.aof  
    
    ##指定aof操作中文件同步策略,有三个合法值:always everysec no,默认为everysec  
    appendfsync everysec  
    ##在aof-rewrite期间,appendfsync是否暂缓文件同步,"no"表示“不暂缓”,“yes”表示“暂缓”,默认为“no”  
    no-appendfsync-on-rewrite no
    
    ##aof文件rewrite触发的最小文件尺寸(mb,gb),只有大于此aof文件大于此尺寸是才会触发rewrite,默认“64mb”,建议“512mb”  
    auto-aof-rewrite-min-size 64mb  
    
    ##相对于“上一次”rewrite,本次rewrite触发时aof文件应该增长的百分比。
    ##每一次rewrite之后,redis都会记录下此时“新aof”文件的大小(例如A),那么当aof文件增长到A*(1 + p)之后
    ##触发下一次rewrite,每一次aof记录的添加,都会检测当前aof文件的尺寸。
    auto-aof-rewrite-percentage 100

    9.3 RDB和AOF的区别

      1) AOF 更加安全,可以将数据更加及时的同步到文件中,但是 AOF 需要较多的磁盘 IO 开支,AOF 文件尺寸较大,文件内容恢复数度相对较慢。
      2) RDB,安全性较差,它是“正常时期”数据备份以及 master-slave 数据同步的最佳手段,文件尺寸较小,恢复数度较快。

      在架构良好的环境中,master 通常使用 AOF,slave 使用 RDB,主要原因是 master 需要首先确保数据完整性,它作为数据备份的第一选择;slave 提供只读服务(目前 slave 只能提供读取服务),它的主要目的就是快速响应客户端 read 请求。

      redis 运行在网络稳定性差 / 物理环境糟糕情况下,建议你 master 和 slave 均采取 AOF。

    十、Redis的发布订阅

      Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

      Redis 客户端可以订阅任意数量的频道。

      创建了订阅频道名为 redisChat:

      redis127.0.0.1:6379> SUBSCRIBE redisChat
      Reading messages...(pressCtrl-C to quit)
      1)"subscribe"
      2)"redisChat"
      3)(integer)1

      现在,我们先重新开启个 redis 客户端,然后在同一个频道 redisChat 发布两次消息,订阅者就能接收到消息。

      redis127.0.0.1:6379> PUBLISH redisChat "Redis is a great caching technique"
      (integer)1
      redis127.0.0.1:6379> PUBLISH redisChat "Learn redis by runoob.com"
      (integer)1
      # 订阅者的客户端会显示如下消息
      1)"message"
      2)"redisChat"
      3)"Redis is a great caching technique"
      1)"message"
      2)"redisChat"
      3)"Learn redis by runoob.com"
  • 相关阅读:
    Hibernate整合Druid数据库连接池遇到的问题整合
    Spring 整合quartz 时 定时任务被调用两次以及quartz 的配置
    BigDecimal divide:Non-terminating decimal expansion; no exact representable decimal result.
    Hibernate: Encountered a duplicated sql alias [] during auto-discovery of a native-sql
    oracle与mysql的区别
    搜索评价指标——NDCG
    java 动态修改注解值
    eclipse 取消置顶
    Xiangqi
    All in All
  • 原文地址:https://www.cnblogs.com/woniusky/p/10812454.html
Copyright © 2011-2022 走看看