zoukankan      html  css  js  c++  java
  • 分布式缓存——Redis

    分布式缓存——Redis

    一、简介

    1、redis是什么?

    • REmote DIctionary Server(远程字典服务器)
    • 完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSQL数据库之一,也被人们称为数据结构服务器。
    • 能满足对海量数据的读写
    • redis的键只能是字符串
    • redis的值支持多种数据类型:
      • 字符串string
      • 哈希hash
      • 字符串列表list
      • 字符串集合set
      • 有序集合zset(sorted set)
      • HyperLogLog结构:redis2.8.9版本之后才有,用来做统计的算法
      • GEO结构:redis3.2版本之后才有,是地理位置相关的数据类型

    2、redis的优点?

    • 高性能(redis读的速度是11w次/s,写的速度是8.1w/s)
    • 原子性(保证数据的准确性)
    • 持久存储(两种方式RDB快照,AOF日志)
    • 主从结构,主机会自动将数据同步到从机,可以进行读写分离
    • 从3.0版本开始,支持集群

    3、redis的缺点?

    • 由于是内存数据库,所以,单台机器存储的数据量,跟机器本身的内存大小有关。虽然redis本身有key过期策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定期删除数据。
    • 修改配置文件,进行重启,将硬盘中的数据加载进内存,时间比较久。在这个过程中,redis不能提供服务。

    4、redis的主要功能?

    • 服务端的redis

      • 持久化(Persistence)

        redis的持久化指的是redis会把内存的中的数据写入到硬盘中,在redis重新启动的时候加载这些数据,从而最大限度的降低缓存丢失带来的影响。
        
      • 哨兵(Sentinel)和复制(Replication)

        Sentinel可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的功能;Replication则是负责让一个Redis服务器可以配备多个备份的服务器。Redis也是利用这两个功能来保证Redis的高可用的。此外,Sentinel功能则是对Redis的发布和订阅功能的一个利用。
        
      • 集群(Cluster)

        Redis Cluster的具体实现细节则是采用了Hash槽的概念,即预先分配出来16384个槽:在客户端通过对Key进行CRC16(key)% 16384运算得到对应的槽是哪一个;在redis服务端则是每个服务器负责一部分槽,当有新的服务器加入或者移除的时候,再来迁移这些槽以及其对应的数据,同时每个服务器都持有完整的槽和其对应的服务器的信息,这就使得服务器端可以进行对客户端的请求进行重定向处理。
        
    • 客户端的redis

      • 数据类型

        • string:最基本的数据类型,二进制安全的字符串,最大512M。
        • list:按照添加顺序保持顺序的字符串列表。
        • set:无序的字符串集合,不存在重复的元素。
        • sorted set:已排序的字符串集合。
        • hash:key-value对的一种集合。
        • bitmap:更细化的一种操作,以bit为单位。
        • hyperloglog:基于概率的数据结构。
      • 事务

        redis事务支持一次性按顺序执行多个命令的能力,并保证其原子性
        
      • Lua脚本

        在事务的基础上,如果我们需要在服务端一次性的执行更复杂的操作(包含一些逻辑判断),则lua就可以排上用场了(比如在获取某一个缓存的时候,同时延长其过期时间)。redis保证lua脚本的原子性,一定的场景下,是可以代替redis提供的事务相关的命令的。相当于基于网络应用的架构风格中介绍到的远程求值(Remote Evluation = REV)的具体实现。
        
      • 管道

        因为redis的客户端和服务器的连接时基于TCP的, 默认每次连接都时只能执行一个命令。管道则是允许利用一次连接来处理多条命令,从而可以节省一些tcp连接的开销。管道和事务的差异在于管道是为了节省通信的开销,但是并不会保证原子性。
        
      • 分布式锁

        官方推荐采用Redlock算法,即使用string类型,加锁的时候给的一个具体的key,然后设置一个随机的值;取消锁的时候用使用lua脚本来先执行获取比较,然后再删除key。
        

    5、redis的应用场景?

    • 主要应用在高并发和实时请求的场景
    • 关注列表、粉丝列表
    • 微博数、粉丝数
    • 热门微博

    6、redis版本下载?

    二、redis安装

    1、软件环境

    • Centos7
    • Redis3.0.4

    2、安装准备

    yum -y install cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc make tcl
    

    3、redis的Linux版安装

    • 1、下载安装包,并移植到/usr/local/下

      链接: https://pan.baidu.com/s/11XaG8kuy13QWyIdXFXz2Tg  密码: mojq
      
    • 2、解压压缩包

      [root@node01 local]# tar -zxvf redis-3.0.4.tar.gz
      
    • 3、进入解压目录,输入make编译

      [root@node01 redis-3.0.4]# pwd
      /usr/local/redis-3.0.4
      [root@node01 redis-3.0.4]# make
      
    • 4、输入make install安装

      [root@node01 redis-3.0.4]# make install
      
    • 5、安装后的redis命令默认在/usr/local/bin目录

      [root@node01 bin]# pwd
      /usr/local/bin
      [root@node01 bin]# ll
      

    4、redis的服务端(redis-server)启动

    • 输入redis-server

      [root@node01 bin]# redis-server
      
    • 可以修改配置文件,使之可以后台允许

      [root@node01 redis-3.0.4]# pwd
      /usr/local/redis-3.0.4
      [root@node01 redis-3.0.4]# vi redis.conf 
      
    • 搜索/daemon并修改配置

      /daemon
      
      daemonize  yes
      
    • 用修改之后的配置启动

      [root@node01 redis-3.0.4]# redis-server redis.conf 
      
    • 查看进程

      [root@node01 redis-3.0.4]# ps aux|grep redis
      root       2603  0.1  0.3 141004  7456 ?        Ssl  17:14   0:00 redis-server *:6379
      root       2607  0.0  0.0 112828   972 pts/0    S+   17:15   0:00 grep --color=auto redis
      

    5、redis的客户端(redis-cli)启动

    • 输入redis-cli

      [root@node01 redis-3.0.4]# redis-cli 
      127.0.0.1:6379> 
      
    • exit退出

      127.0.0.1:6379> exit
      

    6、redis测试

    [root@node01 redis-3.0.4]# redis-cli 
    127.0.0.1:6379> ping
    PONG
    127.0.0.1:6379> set username root
    OK
    127.0.0.1:6379> get username
    "root"
    127.0.0.1:6379> keys *
    1) "username"
    127.0.0.1:6379> 
    

    7、redis服务器停止

    • 输入redis-cli shutdown

      [root@node01 redis-3.0.4]# redis-cli shutdown
      
    • 查看进程

      [root@node01 redis-3.0.4]# ps aux|grep redis
      root       2631  0.0  0.0 112828   972 pts/0    S+   17:19   0:00 grep --color=auto redis
      

    三、redis其他知识

    1、性能测试

    • 启动服务端

      [root@node01 redis-3.0.4]# redis-server redis.conf 
      
    • 测试get和set的性能

      [root@node01 redis-3.0.4]# redis-benchmark -t get,set
      ====== SET ======
        100000 requests completed in 0.44 seconds
        50 parallel clients
        3 bytes payload
        keep alive: 1
      
      100.00% <= 0 milliseconds
      226757.36 requests per second
      
      ====== GET ======
        100000 requests completed in 0.43 seconds
        50 parallel clients
        3 bytes payload
        keep alive: 1
      
      100.00% <= 0 milliseconds
      234192.05 requests per second
      
      

    2、默认16个库,切库

    [root@node01 redis-3.0.4]# redis-cli
    127.0.0.1:6379> select 1
    OK
    127.0.0.1:6379[1]> 
    

    3、判断某个key是否存在

    127.0.0.1:6379[1]> select 0
    OK
    127.0.0.1:6379> EXISTS username
    (integer) 1
    

    4、为key设置过期时间

    127.0.0.1:6379> set k k
    OK
    127.0.0.1:6379> EXPIRE k 10
    (integer) 1
    
    10意思就是10秒
    

    5、查看key过期时间,-2代表已经过期,-1表示不过期

    127.0.0.1:6379> ttl k
    (integer) -2
    

    6、查看key的类型

    127.0.0.1:6379> set k k
    OK
    127.0.0.1:6379> type k
    string
    

    7、将key移动到其他库

    127.0.0.1:6379> move k 2
    (integer) 1
    127.0.0.1:6379> EXISTS k
    (integer) 0
    127.0.0.1:6379> SELECT 2
    OK
    127.0.0.1:6379[2]> EXISTS k
    (integer) 1
    

    四、redis.conf配置文件解析

    1、redis.conf在哪?

    2、Units单位,redis配置文件单位不区分大小写

    3、INCLUDES包含,可以加入其它自定义配置文件

    4、GENERAL通用,一些基本设置,包括端口号,守护进程等

    5、NETWORK网络配置,配置一些超时时间等

    6、SNAPSHOTTING快照,配置RDB持久化策略的位置

    7、REPLICATION复制,配置主从复制的

    8、SECURITY安全,设置redis密码

    9、LIMITS限制,做一些连接和内存等的限制

    10、APPEND ONLY MODE追加,配置AOF的位置

  • 相关阅读:
    为什么要使用MQ消息中间件?
    趣图:这是招聘超神级别的程序员?
    基于redis的分布式锁的分析与实践
    我的java问题排查工具单
    趣图:看到这些窗户,我想插上几根网线
    SpringBoot+MyBatis+MySQL读写分离(实例)
    IntelliJ IDEA 常用快捷键
    ex3 多分类和神经网络
    9、神经网络的学习
    神经网络--反向传播详细推导过程
  • 原文地址:https://www.cnblogs.com/ghh520/p/13226547.html
Copyright © 2011-2022 走看看