redis学习看这一篇文章就够了

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

    第一章 redis简介

    第1节 NoSQL

    1.1 NoSQL简介

    NoSQL泛指非关系型的数据库NoSQL即Not-Only SQL它可以作为关系型数据库的良好补充。随着互联网web2.0网站的兴起非关系型的数据库现在成了一个极其热门的新领域非关系数据库产品的发展非常迅速。

    1.2 NoSQL类别

    • 键值(Key-Value)存储数据库
      1
      2
      3
      4
      5
      
      相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
      典型应用: 内容缓存主要用于处理大量数据的高访问负载
      数据模型: 一系列键值对
      优势: 快速查询
      劣势: 存储的数据缺少结构化
      
    • 列存储数据库
      1
      2
      3
      4
      
      相关产品:Cassandra, HBase, Riak 典型应用:分布式的文件系统 
      数据模型:以列簇式存储将同一列数据存在一起 
      优势:查找速度快可扩展性强更容易进行分布式扩展
      劣势:功能相对局限
      
    • 文档型数据库
      1
      2
      3
      4
      5
      
      相关产品:CouchDB、MongoDB 
      典型应用:Web应用(与Key-Value类似Value是结构化的) 
      数据模型: 一系列键值对
      优势:数据结构要求不严格
      劣势:查询性能不高而且缺乏统一的查询语法
      
    • 图形(Graph)数据库
      1
      2
      3
      4
      
      相关数据库:Neo4J、InfoGrid、Infinite Graph 典型应用:社交网络
      数据模型:图结构
      优势:利用图结构相关算法
      劣势:需要对整个图做计算才能得出结果不容易做分布式的集群方案
      

    1.3 redis简介

    2008年意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG然而没过多久该公司的创始人 Salvatore Sanfilippo(萨尔瓦托桑菲利波)便对MySQL的性能感到失望于是他决定亲自为LLOOGG量身定做一个数据库并于2009年开发完 成这个数据库就是Redis。不过Salvatore Sanfilippo并不满足只将Redis用于LLOOGG这一款产品而是希望更多的人使用它于是在同一年Salvatore Sanfilippo将Redis开源发布并开始和Redis的另一名主要的代码贡献者Pieter Noordhuis(皮耶特诺德休斯)一起继续着Redis的开发直到今天。

    1.4 redis支持的数据类型

    1
    2
    3
    4
    5
    6
    
    Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的 存储需求目前为止Redis支持的键值数据类型如下:
      字符串类型
      散列类型
      列表类型
      集合类型
      有序集合类型
    

    1.5 redis特点

    1
    2
    3
    4
    5
    
    Redis 与其他 key - value 缓存产品有以下三个特点:
    - Redis支持数据的持久化可以将内存中的数据保存在磁盘中重启的时候可以再次加载进行使用。
    - Redis不仅仅支持简单的key-value类型的数据同时还提供listsetzsethash等数据结构的存储。 
    - Redis支持数据的备份即master-slave模式的数据备份。
    Redis 提供的API支持:C、C++、C#、Clojure、Java、JavaScript、Lua、PHP、Python、Ruby、Go、Scala、 Perl等多种语言
    

    1.6 redis使用场景

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    1、缓存
    缓存现在几乎是所有中大型网站都在用的必杀技合理的利用缓存不仅能够提
    升网站访问速度还能大大降低数据库的压力。Redis提供了键过期功能也
    提供了灵活的键淘汰策略所以现在Redis用在缓存的场合非常多。
    
    2、排行榜
    很多网站都有排行榜应用的如京东的月度销量榜单、商品按时间的上新排行
    榜等。Redis提供的有序集合数据类构能实现各 种复杂的排行榜应用
    
    3、计数器
    什么是计数器如电商网站商品的浏览量、视频网站视频的播放数等。为了保
    证数据实时效每次浏览都得给+1并发量高时如果每次都请求数据库操作无
    疑是种挑战和压力。Redis提供的incr命令来实现计数器功能内存操作性
    能非常好非常适 用于这些计数场景。
    
    等等....
    

    1.7 redis的优缺点

    • 优点
      1
      2
      3
      4
      5
      
      性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s
      丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 
      及 Ordered Sets 数据类型操作
      原子 – Redis的所有操作都是原子性的同时Redis还支持对几个操作合并后的原子性执行(事务)
      丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性
      
    • 缺点
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      
      (一)缓存和数据库双写一致性问题
      分析:一致性问题是分布式常见问题还可以再分为最终一致性和强一致性。
      数据库和缓存双写就必然会存在不一致的问题。答这个问题先明白一个
      前提。就是如果对数据有强一致性要求不能放缓存。我们所做的一切只
      能保证最终一致性。另外我们所做的方案其实从根本上来说只能说降低
      不一致发生的概率无法完全避免。因此有强一致性要求的数据不能放
      缓存
      回答:《分布式之数据库和缓存双写一致性方案解析》给出了详细的分析在
      这里简单的说一说。首先采取正确更新策略先更新数据库再删缓存。
      其次因为可能存在删除缓存失败的问题提供一个补偿措施即可例如利
      用消息队列.
      
      (二)缓存雪崩问题、缓存穿透
      分析:这两个问题,一般中小型传统软件企业,很难碰到这个问题。如果有大
      并发的项目,日流量有KW级上。这两个问题一定要深刻考虑。缓存穿透,即
      黑客故意去请求缓存中不存在的数据,导致所有的请求都怼到数据库上,从
      而数据库连接异常.
      
      

      1.8 redis面向互联网的解决方案

      1
      2
      3
      4
      5
      6
      7
      
      - 主从:一主多从主机可写从机备份。类似于Mysql的读写分离存在问
      题是一但主节点down掉整个Redis不可用
      - 哨兵(2.x):启用一个哨兵程序(节点)监控其余节点的状态根据选举策
      略进行主从切换。缺点:每个节点的数据依旧是一致的仍无法实现分布式
      的数据库
      - 集群(3.x):结合上述两种模式多主多从实现高可用、分布式数据存储(
      绝大部分的使用集群)
      

      第二章 redis单机安装(linux)

    第1节 在linux安装

    第1步: 使用 wget 命令获取redis安装包

    wget http://download.redis.io/releases/redis-5.0.0.tar.gz

    如果wget命令不存在使用此命令安装 yum install wget

    第2步: 将下载的安装包解压到指定的位置 比如 /opt文件夹下

    tar -xzvf redis-5.0.0.tar.gz -C /opt

    第3步: 切换到解压之后的redis文件夹内然后执行编译命令

    make

    如果报没有gcc编译器使用此命令安装gcc编译器 yum install gcc

    第4步: 指定安装位置将redis安装到/usr/local/redis目录下方便我们以后查找

    make install PREFIX=/usr/local/redis

    第5步: 拷贝安装目录下配置文件到 /usr/local/redis/etc

    mkdir /usr/local/redis/etc/ 创建etc文件夹
    cp /opt/redis-5.0.0/redis.conf /usr/local/redis/etc/ 将redis配置文件拷贝到我们自己定义的文件夹下方便查找

    第6步: 修改配置文件 /usr/local/redis/etc/redis.conf

    vim /usr/local/redis/etc/redis.conf

    如果vim命令不存在可以使用此命令安装
    yum -y install vim*
    yum install vim

    配置文件简答修改:

    1、 protected-mode : yes/no 关闭保护模式(如果不关闭保护模式,外部机器访问此redis服务器时,必须指定bind属性绑定的主机才能访问) 外部网络可以直接访问

    2、daemonize: no/yes 开启守护进程(开启守护进程redis可以后台运行)

    3、bind 127.0.0.1绑定本机ip,当保护模式关闭以后可以不用指定具体主机IP,但是设置为 0.0.0.0

    4、pidfile /var/run/redis_6379.pid redis进程文件当开启守护进程之后会在本地生成一个pid文件

    5、logfile /var/log/redis_6379.log 配置redis服务器日志生成和保存位置

    6、dir /usr/local/redis/data/ 快照数据存放目录

    第7步: 启动redis服务器

    redis启动命令在我们的安装目录下,当我们使用make install PREFIX=/usr/local/redis命令进行安装时

    将redis安装到了/usr/local/redis目录下,在此目录下会自动生成一个bin目录,启动redis的脚本在这个目录下

    启动命令: /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

    ps aux | grep redis 命令查看redis服务器是否启动

    第8步: 连接适应redis自带的客户端连接redis服务器

    进入到我们redis安装目录下的bin目录,找到我们redis启动脚本

    启动redis服务器使用 redis-server脚本

    使用redis客户端连接redis服务器采用redis-cli脚本

    连接方式: ./redis-cli -h 127.0.0.1 -p 6379

    -h : 指定连接redis服务器主机地址

    -p : 指定连接应用(redis服务器应用)的端口号

    第三章 redis常用命令

    第1节 字符串(String)

    命令描述备注
    set key value想redis服务器中设置一个字符串set key01 value01
    get key通过key指从服务器中获取值get key01
    del key删除指定的keydel key01
    getset key value给指定的key赋值,并且返回旧值getset key01 value02
    mset key01 value01 key02 value02同时设置一个或多个 key-value 对mset key04 value04 key05 value05 key06 value06
    mget key01 key02 …获取多个key值mget key01 key02
    setnx key value给不存在的key赋值,如果存在赋值失败setnx key03 value03
    msetnx key01 value01 key02 value02同时设置一个或多个 key-value 对当且仅当所有给定 key 都不存在如果有一个key存在那么存储失败msetnx key04 value04 key07 value07
    setex key [时间以秒为单位] value给数据设置超时时间,如果key存在就覆盖setex key04 10 value04
    psetex key07 [毫秒值] value07给数据设置超时时间,如果key存在就覆盖psetex key07 10000 value07
    strlen key获取指定字符串的长度strlen key06

    第2节 哈希(Hash)

    Redis hash 是一个 string 类型的 field 和 value 的映射表hash 特别适合用于存储对象

    Redis 中每个 hash 可以存储 232 - 1 键值对40多亿

    命令描述备注
    hset hashname filed valuehset:设值命令;hashname:集合名称;field:集合中的属性名;value:集合中的属性值hset myhash hkey01 hvalue01
    hget hashname filedhget:获取值命令;hashname:获取哪一个hash集合;field:获取哪一个hash集合中的属性hget myhash hkey01
    hdel hashname filed1 [filed2]删除一个或多个哈希表字段hdel myhash hkey01 hkey02
    hexists hashname filed查看指定哈希表中指定的字段是否存在hexists myhash hkey01
    hgetall hashname获取指定哈希表中所有字段和值hgetall myhash
    hkeys hashname获取指定hash表中的所有fieldhkeys myhash
    hlen hashname获取哈希表中字段的数量hlen myhash
    hmget hashname filed1 filed2 filed3获取所有给定字段的值hmget myhash hkey01 hkey02 hkey03
    hmset hashname filed1 hvalue1 hkey2 hvalue2同时将多个 field-value 设置到哈希表中hmset myhash hkey03 hvalue03 hkey04 hvalue04 hkey05 hvalue05
    hsetnx hashname filed value只有在字段 field 不存在时设置哈希表字段的值hsetnx myhash hkey03 hvalue03
    hvals hashname获取哈希表中所有值hvals myhash

    第3节 列表(List)

    Redis列表是简单的字符串列表按照插入顺序排序。你可以添加一个元素到列表的头部左边或者尾部右边,一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)

    语法描述备注
    lpush key value [value …]将一个或多个值插入到列表头部lpush mylist lvalue01
    lpushx key value将一个值插入到已存在的列表头部lpushx mylist value03
    lset key index value通过索引设置列表元素的值lset mylist 0 lvalue001
    rpushx key value为已存在的列表添加值rpushx mylist lvalue03
    rpushx key value1 value2[value…]在列表中添加一个或多个值rpush mylist lvalue04 lvalue05
    blpop key01 key02 100移出并获取列表的第一个元素 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止blpop mylist 100
    brpop key01 key02 100移出并获取列表的最后一个元素 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止brpop mylist 200
    lindex key index通过索引获取列表中的元素lindex mylist 1
    llen key获取列表长度llen mylist
    lpop key移出并获取列表的第一个元素lpop mylist
    rpop key移除列表的最后一个元素返回值为移除的元素rpop mylist

    第4节 集合(Set)

    Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的这就意味着集合中不能出现重复的数据

    集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)

    命令描述备注
    sadd key value[value…]向集合添加一个或多个成员sadd myset1 myvalue01 myvalue02
    scard key获取集合的成员数scard myset1
    sinter key1 key2返回给定所有集合的交集sinter myset1 myset2
    sismember key member判断 member 元素是否是集合 key 的成员sismember myset1 myvalue01
    smembers key返回集合中的所有成员smembers myset1
    srem key value移除集合中一个或多个成员srem myset2 myvalue01
    sunion key1 key2返回所有给定集合的并集sunion myset1 myset2

    第5节 有序集合(sorted set)

    Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员

    不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序

    有序集合的成员是唯一的,但分数(score)却可以重复

    集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)

    语法描述备注
    ZADD key score1 zvalue01 score2 zvalue02向有序集合添加一个或多个成员或者更新已存在成员的分数ZADD zset 1 zvalue01 2 zvalue02
    ZCARD key获取有序集合的成员数ZCARD zset
    ZRANK key member返回有序集合中指定成员的索引ZRANK zset zvalue02
    ZREM key member [member …]移除有序集合中的一个或多个成员ZREM zset zvalue02
    ZSCORE key member返回有序集中成员的分数值ZSCORE zset zvalue01
    ZRANGE key start stop [WITHSCORES]通过索引区间返回有序集合指定区间内的成员ZRANGE zset 0 -1 WITHSCORES

    第6节 Redis HyperLogLog

    Redis 在 2.8.9 版本添加了 HyperLogLog 结构

    Redis HyperLogLog 是用来做基数统计的算法HyperLogLog 的优点是在输入元素的数量或者体积非常非常大时计算基数所需的空间总是固定 的、并且是很小的

    在 Redis 里面每个 HyperLogLog 键只需要花费 12 KB 内存就可以计算接近 2^64 个不同元素的基 数。这和计算基数时元素越多耗费内存就越多的集合形成鲜明对比

    6.1 什么是基数

    在数学上基数cardinal number是集合论中刻画任意集合大小的一个概念 (集合长度)

    比如数据集 {1, 3, 5, 7, 5, 7, 8} 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内快速计算基数

    语法描述备注
    PFADD key element [element …]添加指定元素到 HyperLogLog 中PFADD ploglog a b c d
    PFCOUNT key [key …]返回给定 HyperLogLog 的基数估算值PFCOUNT ploglog
    PFMERGE destkey sourcekey [sourcekey …]将多个 HyperLogLog 合并为一个 HyperLogLogPFMERGE hll3 hll1 hll2

    第四章 redis集群

    • redis的高级命令
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    keys * : 返回满足的所有键 ,可以模糊匹配 比如 keys abc* 代表 abc 开头的key
    exists key 是否存在指定的key存在返回1不存在返回0
    expire key second设置某个key的过期时间 时间为秒
    del key:删除某个key
    select : 选择数据库 数据库为0-15默认一共16个数据库 设计成多个数据库实际上是为了数据库安全和备份
    move key dbindex  将当前数据中的key转移到其他数据库
    echo打印命令
    dbsize查看数据库的key数量
    info查看数据库信息
    flushdb 清空当前数据库
    flushall 清空所有数据库
    
    

    第1节 主从模式

     

    1.1 优点

    • 高可靠性一方面采用双机主备架构能够在主库出现故障时自动进行主备切换从库提升为主库提供服
      务保证服务平稳运行另一方面开启数据持久化功能和配置合理的备份策略能有效的解决数据误操作和
      数据异常丢失的问题
    • 读写分离策略从节点可以扩展主库节点的读能力有效应对大并发量的读操作

    1.2 缺点

    • 故障恢复复杂
    • 当主库节点出现故障时需要手动将一个从节点晋升为主节点同时需要通知业务方变更配置并且需要让其它从库节点去复制新主库节点整个过程需要人为干预比较繁琐.
    • 应用较少

    1.3 配置方式

    • 配置文件master_6379

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      
      # 外部访问设置
      bind 0.0.0.0
      #端口号
      port 6379
      # 开启守护进程
      daemonize yes
      # 关闭保护模式可以被外部主机访问
      protected-mode no
      # 存储日志位置
      logfile "./log/master_6379.log"
      # 指定数据库文件名
      dbfilename master_dump_6379.rdb
      # 快照保存位置
      dir ./data
      #数据是否压缩
      rdbcompression yes
      
    • 配置文件slave_6380

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      
      # 外部访问设置
      bind 0.0.0.0
      #端口号
      port 6380
      # 开启守护进程
      daemonize yes
      # 关闭保护模式可以被外部主机访问
      protected-mode no
      # 存储日志位置
      logfile "./log/slave_6380.log"
      # 指定数据库文件名
      dbfilename salve_dump_6380.rdb
      # 快照保存位置
      dir ./data
      #数据是否压缩
      rdbcompression yes
      # 复制主机位置
      SLAVEOF 127.0.0.1 6379
      
    • 配置文件slave_6381

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      
      # 外部访问设置
      bind 0.0.0.0
      #端口号
      port 6381
      # 开启守护进程
      daemonize yes
      # 关闭保护模式可以被外部主机访问
      protected-mode no
      # 存储日志位置
      logfile "./log/slave_6381.log"
      # 指定数据库文件名
      dbfilename salve_dump_6381.rdb
      # 快照保存位置
      dir ./data
      #数据是否压缩
      rdbcompression yes
      # 复制主机位置
      SLAVEOF 127.0.0.1 6379
      

    第2节 哨兵模式

    Redis Sentinel是社区版本推出的原生高可用解决方案其部署架构主要包括两部分Redis Sentinel集群和Redis数据集群略

    第3节 集群模式

    3.1 配置方式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    步骤:
    第1步 创建一个文件夹取名为redis_cluster
    第2步 在redis_cluster文件夹下创建六个文件夹 redis_7000 ~ redis_7006 
    第3步 拷贝redis_server和redis_cli脚本到分别到redis_7000 ~ redis_7006文件夹中
    第4步 创建redis_7000.cnf~redis_7006.cnf配置文件 配置文件样例
    
    # 外部访问设置
    bind 0.0.0.0
    #端口号
    port 7001
    # 开启守护进程
    daemonize yes
    # 关闭保护模式可以被外部主机访问
    protected-mode no
    #数据是否压缩
    rdbcompression yes
    # 是否开启集群
    cluster-enabled yes
    # 群集节点每次发生更改时自动保留群集配置
    cluster-config-file "node_7001.conf"
    # 设置超时时间
    cluster-node-timeout 5000
    
    第5步 将6个节点全部运行起来
    

    3.2 启动集群

    1
    2
    
    现在6个节点已经启动完成,这是需要一条命令将6个节点关联起来
    redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1
    

    3.3 使用客户端连接任意一个服务节点即可

    1
    
    ./redis-cli -c -h [ip地址] -p [端口号]
    

    3.4 进行验证

    1
    2
    
    cluster info(查看集群信息)
    cluster nodes(查看节点列表)
    

    第五章 redis常见客户端

    官网介绍

    1
    
    http://www.redis.cn/
    
    • Redisson
    1
    
    Redisson实现了分布式和可扩展的Java数据结构
    
    • Jedis
    1
    
    Jedis是老牌的Redis的Java实现客户端提供了比较全面的Redis命令的支持
    
    • lettuce
    1
    
    Lettuce高级Redis客户端用于线程安全同步异步和响应使用支持集群Sentinel管道和编码器
    
    • 优点

      Jedis比较全面的提供了Redis的操作特性

      Redisson促使使用者对Redis的关注分离提供很多分布式相关操作服务例如分布式锁分布式集合可通过Redis支持延迟队列

      Lettuce基于Netty框架的事件驱动的通信层其方法调用是异步的。Lettuce的API是线程安全的所以可以操作单个Lettuce连接来完成各种操作

    第六章 redis在项目中的应用

    第1节 Jedis API操作

    官网地址:

    1
    
    https://github.com/xetorthio/jedis
    

    pom.xml

    1
    2
    3
    4
    5
    6
    7
    
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.1.0</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
    

    1.1 单个节点

    1
    2
    3
    
    Jedis jedis = new Jedis("localhost");
    jedis.set("foo", "bar");
    String value = jedis.get("foo");
    

    1.2 jedis连接池

    1
    2
    3
    4
    5
    6
    7
    
    //获取连接池
    JedisPool pool = new JedisPool();
    //获取jedis
    Jedis jedis = pool.getResource();
    //获取数据
    String foo = jedis.get("foo");
    System.out.println(foo);
    

    1.3 集群使用

    1
    2
    3
    4
    5
    
    Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
    jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7379));
    JedisCluster jc = new JedisCluster(jedisClusterNodes);
    jc.set("foo", "bar");
    String value = jc.get("foo");
    
    • 注意:使用集群模式一定要开启集群配置

    第2节 与Spring框架整合(Jedis)

    2.1 单节点连接池配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    <!--导入外部属性资源文件-->
    <context:property-placeholder location="classpath:redis.properties"></context:property-placeholder>
    <!--连接池配置-->
    <bean id="poolConfig" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig">
        <property name="maxTotal" value="${redis_max_total}"></property>
        <property name="maxIdle" value="${redis_max_idle}"></property>
        <property name="minIdle" value="${redis_min_idle}"></property>
    </bean>
    
    <!--配置jedis连接池jedispool-->
    <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
        <constructor-arg index="0" ref="poolConfig"></constructor-arg>
        <constructor-arg index="1" value="127.0.0.1" type="java.lang.String"></constructor-arg>
        <constructor-arg index="2" value="6379" type="int"></constructor-arg>
    </bean>
    

    2.2 集群配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    
    <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster"> 
    	<constructor-arg>
    		<set>
    			<bean class="redis.clients.jedis.HostAndPort">
    				<constructor-arg name="host" value="192.168.1.194"/>
    				<constructor-arg name="port" value="6011"/>
    			</bean>
    			<bean class="redis.clients.jedis.HostAndPort">
    				<constructor-arg name="host" value="192.168.1.194"/>
    				<constructor-arg name="port" value="6012"/>
    			</bean>
    			<bean class="redis.clients.jedis.HostAndPort">
    				<constructor-arg name="host" value="192.168.1.194"/>
    				<constructor-arg name="port" value="6013"/>
    			</bean>
    			<bean class="redis.clients.jedis.HostAndPort">
    				<constructor-arg name="host" value="192.168.1.194"/>
    				<constructor-arg name="port" value="6014"/>
    			</bean>
    			<bean class="redis.clients.jedis.HostAndPort">
    				<constructor-arg name="host" value="192.168.1.194"/>
    				<constructor-arg name="port" value="6015"/>
    			</bean>
    			<bean class="redis.clients.jedis.HostAndPort">
    				<constructor-arg name="host" value="192.168.1.194"/>
    				<constructor-arg name="port" value="6016"/>
    			</bean>			
    		</set>
    	</constructor-arg>
    </bean>
    
    • 注意: 在配置jedisPool时配置主机IP地址以及端口号要指定类型,否则可能报错.

    第3节 与SpringBoot框架整合Jedis

    • 添加依赖
    • 创建配置类
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      
      @Configuration
      public class jedisConfiguration {
          private static final Logger LOGGER = LoggerFactory.getLogger(jedisConfiguration.class);
          @Value("${redis_host}")
          private String host;
          @Value("${redis_port}")
          private int port;
          /**
           * 配置JedisPool
           */
          @Bean
          public JedisPool getJedisPool(){
              GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
              JedisPool jedisPool = new JedisPool(poolConfig,host,port);
              LOGGER.info("jedis pool 创建成功 地址={}==> 端口号={}",host,port);
              return jedisPool;
          }
      }
      
    • 测试是否配置成功

    第4节 SpringBoot中操作redis(lettuce)

    1
    
    官网: https://lettuce.io/
    
    • SpringBoot整合lettuce(Springboot2.x版本默认提供了redis客户端为lettuce)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      
      <!--默认是lettuce客户端-->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-redis</artifactId>
      </dependency>
      <!-- redis依赖commons-pool2 这个依赖一定要添加 -->
      <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-pool2</artifactId>
      </dependency>
      
    • 配置文件

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      
      # redis数据库索引
      spring.redis.database=0
      #redis服务器地址
      spring.redis.host=127.0.0.1
      #redis服务器端口号
      spring.redis.port=6379
      
      # lettuce基本配置
      # Lettuce连接池,最大连接数(如若为负值表示没有限制)
      spring.redis.lettuce.pool.max-active=8
      # 连接池最大阻塞等待时间(使用负值表示没有限制)
      spring.redis.lettuce.pool.max-wait=10000ms
      # 连接池中的最大空闲连接
      spring.redis.lettuce.pool.max-idle=8
      # 连接池中的最小空闲连接
      spring.redis.lettuce.pool.min-idle=0
      # 关闭超时时间
      spring.redis.lettuce.shutdown-timeout=100ms
      
    • lettuce使用

    spring-boot-starter-data-redis2.x提供的客户端默认是lettuce,SpringBoot redis提供了两个比较常用的操作redis数据库的模板工具分别为:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    1、RedisTemplate:
        1.1 操作对象的类 
        1.2 线程安全 
        1.3 使用Java自带的序列化方式(序列化和反序列化都采用Java再带的序列化/反序列化工具) 
        1.4 我们也可以自定义序列化方式
        1.5 默认采用jdk序列化工具,会将key和value序列化为我们不可读的数据
        
    2、StringRedisTemplate:
        1.1 是RedisTemplate的子类
        1.1 操作字符串
        1.2 线程安全
        1.3 存储数据易读(key value 不会序列化成用户不易读数据)
        
        
    3、RedisTemplate和StringRedisTemplate区别
        3.1 两者数据各自存各自取数据不互通。
            RedisTemplate不能取StringRedisTemplate存入的数据
            StringRedisTemplate不能取RedisTemplate存入的数据
        3.2 序列化策略不同
            RedisTemplate采用JDK的序列化策略
            StringRedisTemplate采用String的序列化策略
    4、使用
        4.1 如果你操作的是字符串类型那么使用StringRedisTemplate
        4.2 如果你操作的是复杂的对象类型,那么使用RedisTemplate
    

    4.1 使用StringRedisTemplate操作字符串

    1
    2
    3
    4
    5
    6
    7
    
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    
    StringRedisTemplate对象中提供了opsForValue()进行字符串操作
    
    当然也提供了其他数据结构类型的操作
    
    

    4.2 使用RedisTemplate操作对象

    步骤:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    第1步: 自定义RedisTemplate模板操作对象的类型
    
    /**
     * @Description: 配置需要保存的数据类型
     */
    @Configuration
    public class RedisConfig {
        @Bean
        public RedisTemplate<String, Serializable> redisTemplate(LettuceConnectionFactory connectionFactory) {
            RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();
            redisTemplate.setConnectionFactory(connectionFactory);
            //key的序列化方式,使用string类型的序列化方式
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            //value序列化方式 采用jackson
            redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
            return redisTemplate;
        }
    }
    
    第2步:操作redis数据库
    
    @Autowired
    private RedisTemplate<String,Serializable> redisTemplate;
    
  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
    标签: redis

    “redis学习看这一篇文章就够了” 的相关文章