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

news2024/9/22 7:22:08

第一章 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类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 
- 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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/177258.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Stable-Diffusion生成视频的完整教程

本文是关于如何使用cuda和Stable-Diffusion生成视频的完整指南&#xff0c;将使用cuda来加速视频生成&#xff0c;并且可以使用Kaggle的TESLA GPU来免费执行我们的模型。 #install the diffuser package#pip install --upgrade pip!pipinstall--upgradediffuserstransformerssc…

JUC并发编程(1.Java线程)

博客指南&#x1f4a1; JUC并发编程博客将持续更新&#xff0c;内容将参考黑马程序员深入学习Java并发编程以及相关阅读的书籍&#xff0c;内容包括进程&#xff0c;线程&#xff0c;并发和并行。 学习的路上永远不是一个人&#xff0c;相信努力会有所收获&#xff01; 希望我的…

【自步课程学习】 Paced-Curriculum Learning

引入: Confidence-Aware Paced-Curriculum Learning by Label Smoothing for Surgical Scene Understanding 【Code:https://github.com/XuMengyaAmy/P-CBLS】 先说

JavaEE初阶第二课:文件操作与IO

欢迎来到javaee初阶的第二课&#xff0c;这节课我会带大家了解文件的概念和java中如何操作文件。 这里写目录标题1.了解文件1.1文件概念1.2文件存储1.3文件路径2.Java中的文件操作&#xff08;文件系统操作&#xff09;2.1File类2.1.1方法实践3.Java的文件操作&#xff08;文件…

字节青训前端笔记 | Webpack入门

本节课将重点围绕「 Webpack 」这一核心话题展开。简述前端工程化的常用工具webpack 的原理和使用 webpack的作用 webpack的作用是把很多文件打包整合到一起, 缩小项目体积, 提高加载速度&#xff0c;常用的场景是&#xff1a; 代码压缩 将JS、CSS代码混淆压缩&#xff0c;…

25. 迭代器和生成器的详解

1. 迭代器 (1) 迭代是Python最强大的功能之一&#xff0c;是访问集合元素的一种方式。 (2) 迭代器是一个可以记住遍历的位置的对象。 (3) 迭代器对象从集合的第一个元素开始访问&#xff0c;直到所有的元素被访问完结束。迭代器只能往前不会后退。 (4) 迭代器有两个基本的方法…

Tkinter的Canvas控件

Canvas控件是Tkinter界面设计的一个画图工具&#xff0c;也可以用它导入外部图案到界面中 创建画布 import tkinter as tk roottk.Tk() #创建界面 root.title(Canvas) #界面命名 root.geometry(500x300) #设置界面大小 canvastk.Canvas(root) …

03_class创建device创建_kobject_uevent发送

总结 根据之前的kobject知道 /sys/目录下的每个文件夹都是一个 kobject的对象 使用class_create() 创建 /sys/class/xxx目录 同时返回class对象 使用device_create() 创建/sys/class/xxx/yyy目录 和创建/dev/yyy的文件节点 同时返回device对象 class和device 都间接继承于kobj…

【老卫搞机】135期:华为开发者联盟社区2022年牛人之星奖品开箱!

首先祝大家兔年大吉&#xff0c;身体安康&#xff0c;钱兔似锦&#xff01;今天咱们来开箱一件特殊的奖品&#xff0c;来自华为开发者联盟社区的新年祝福——2022年牛人之星。 华为有钱&#xff01;惯例用的是顺丰快递&#xff0c;各位看一下这里面是有很多件的 有这两件。第一…

三、TCP/IP---ARP和ICMP协议

ARP协议 简介&#xff1a;号称TCP/IP中最不安全的协议&#xff0c;安全工具&#xff0c;黑客工具大多数基于ARP协议。它是地址解析协议&#xff0c;用于实现从IP到MAC地址的映射&#xff0c;即询问目标Ip对应的MAC地址是多少&#xff0c;局域网通信不仅需要源目地址封装&#…

学习率衰减、局部最优、Batch归一化、Softmax回归

目录1.学习率衰减(Learning rate decay)在训练初期&#xff0c;梯度下降的步伐大一点&#xff0c;开始收敛的时候&#xff0c;小一些的学习率能让步伐小一些。1 epoch 遍历一遍训练集学习率衰减公式&#xff1a;例&#xff1a;假设衰减率decayrate 1&#xff0c;0.2epochNumα…

蓝桥杯-刷题-补基础

十道入门题 题目来源,题目,简单解析,代码,输入输出 目录 前言 一,汉诺塔 二,判断闰年 三,大写变小写 四&#xff0c;破译密码 五&#xff0c;反向数相加 六&#xff0c;Excel表中的列号 七&#xff0c;饮料兑换 八&#xff0c;角谷猜想 九&#xff0c;数字统计…

小喵2022年的年度总结,啊滴妈呀,开了眼了。

宝子&#xff0c;你不点个赞吗&#xff1f;不评个论吗&#xff1f;不收个藏吗&#xff1f; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的很重…

Qt扫盲- QUdpSocket 类理论总结

QUdpSocket 类理论总结一、概述二、使用流程三、QNetworkDatagram 简述一、概述 UDP (User Datagram Protocol)是一种轻量级的、不可靠的、面向数据报的、无连接的协议。当可靠性不重要时&#xff0c;可以使用它。QUdpSocket是QAbstractSocket的子类&#xff0c;允许发送和接收…

SpringBoot+Vue--token,vue导航守卫,axios拦截器-笔记3

自己学习记录,写的不详细,没有误导,不想误导 大概的登录逻辑,前后端完整实现: 1.用户名,密码验证成功后,后端签发token返回给前端 2.前端把token保存到本地存储 3.每次请求前,通过axios请求拦截器,统一发送token 4.通过Vue导航守卫,和axios响应拦截器,统一保护页面 新建个…

【华为上机真题 2023】事件推送

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

机制设计原理与应用(四)预算可行的拍卖机制

文章目录4 预算可行的拍卖机制4.1 特征4.2 使用案例4.3 拍卖设计问题4.4 单调次模函数&#xff08;Monotone Submodular Function&#xff09;4.4.1 分配算法4.4.2 关键支付计划4.4.3 特性4.5 在线预算可行的拍卖机制4.5.1 Secretary Problem(A Optimal Stopping Problem)4.5.2…

如何与他人交流-第5期

上期我们讲了打破预期,顺应主体这期我们来讲讲如何建立亲和关系(关系侧)我的别人交流,只有在不把别人当成对象(工具人),而是把对方当成主体的情况下(让别人感受到尊重),这是相互尊重的终极本质,也是唯一方法.把别人当人看.认同对方,对方也会认同你.自信从何而来自信本意为相信自…

信息论复习—连续信源、信道及容量

目录 连续信源的熵&#xff1a; 连续信源离散化后的概率空间&#xff1a; 连续信源离散化后的熵&#xff1a; 连续信源的绝对熵&#xff1a; 连续信源的相对熵&#xff1a; 连续信源的条件熵&#xff1a; 连续信源的相对条件熵&#xff1a; 连续信源相对熵的最大化&#…

李宏毅ML-卷积神经网络CNN

李宏毅ML-卷积神经网络CNN 文章目录李宏毅ML-卷积神经网络CNNImage ClassificationConvolutional Layer1. Neural Version StoryReceptive FieldParameter Sharing2. Filter Version StoryFilterParameter Sharing3. Summary of Two VersionsPooling LayerThe Whole CNNDrawbac…