Redis的使用--(二)与Spring的整合
时间:2022-07-25
本文章向大家介绍Redis的使用--(二)与Spring的整合,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
主题词:使用Jedis、项目整合Redis
- 项目中整合jedis和spring框架:
- 设计一个相关接口(把String和Hash类型常用方法进行封装)
- 完成两个相关实现类(jedisPool的实现和jedisCluster的实现:属性注入)
- 完成spring-jedis.xml(将jedisPool的实现和jedisCluster的实现进行注入操作)
- 具体内容参看代码实现
- 需求:在tt-common工程的src/test/java中完成Jedis的简单使用
- 在tt-common工程引入jedis的依赖
xml
<!--redis客户端-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
- Jedis的三种使用方法
java
@Test
public void testJedis1(){
Jedis jedis = new Jedis("10.31.152.30",6379);
jedis.set("key","value");
System.out.println(jedis.get("key"));
jedis.close();
}
java
@Test
public void testJedis2(){
//获取jedis池
JedisPool jedisPool = new JedisPool("10.31.152.30",6379);
//获取Jedis对象
Jedis jedis = jedisPool.getResource();
jedis.set("key1","value1");
System.out.println(jedis.get("key1"));
//关闭连接
jedis.close();
jedisPool.close();
}
java
@Test
public void testJedis3(){
//创建集群节点集合
Set<HostAndPort> nodes = new HashSet<HostAndPort>();
//将6个节点加入到集合中
nodes.add(new HostAndPort("10.31.152.30",7001));
nodes.add(new HostAndPort("10.31.152.30",7002));
nodes.add(new HostAndPort("10.31.152.30",7003));
nodes.add(new HostAndPort("10.31.152.30",7004));
nodes.add(new HostAndPort("10.31.152.30",7005));
nodes.add(new HostAndPort("10.31.152.30",7006));
//创建集群对象
JedisCluster jedisCluster = new JedisCluster(nodes);
//存入数据
jedisCluster.set("key2","value2");
System.out.println(jedisCluster.get("key2"));
//关闭连接
jedisCluster.close();
}
- 完成上述三种方法的使用后,将三种方法的工具类添加tt-common中
- 在tt-common中添加com.dhc.common.jedis包
- 添加三个工具类
java
JedisClient.java
JedisClientCluster.java
JedisClientPool.java
JsonUtils.java
- 需求:Spring项目整合Redis
- 创建spring-jedis.xml文件
xml
<!-- 连接池版本 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大连接数 -->
<property name="maxTotal" value="30"/>
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="10"/>
<!-- 每次释放连接的最大数目 -->
<property name="numTestsPerEvictionRun" value="1024"/>
<!-- 释放连接的扫描间隔(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="30000"/>
<!-- 连接最小空闲时间 -->
<property name="minEvictableIdleTimeMillis" value="1800000"/>
<!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
<property name="softMinEvictableIdleTimeMillis" value="10000"/>
<!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
<property name="maxWaitMillis" value="1500"/>
<!-- 在获取连接的时候检查有效性, 默认false -->
<property name="testOnBorrow" value="true"/>
<!-- 在空闲时检查有效性, 默认false -->
<property name="testWhileIdle" value="true"/>
<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
<property name="blockWhenExhausted" value="false"/>
</bean>
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="poolConfig" ref="jedisPoolConfig"/>
<constructor-arg name="host" value="192.168.31.117"/>
<constructor-arg name="port" value="6379"/>
</bean>
<bean id="jedisClientPool" class="com.dhc.common.jedis.JedisClientPool">
<property name="jedisPool" ref="jedisPool"/>
</bean>
<!--集群版本-->
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg name="nodes">
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.31.117"/>
<constructor-arg name="port" value="7001"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.31.117"/>
<constructor-arg name="port" value="7002"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.31.117"/>
<constructor-arg name="port" value="7003"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.31.117"/>
<constructor-arg name="port" value="7004"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.31.117"/>
<constructor-arg name="port" value="7005"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.31.117"/>
<constructor-arg name="port" value="7006"/>
</bean>
</set>
</constructor-arg>
<constructor-arg name="poolConfig" ref="jedisPoolConfig"/>
</bean>
<bean id="jedisClientCluster" class="com.dhc.common.jedis.JedisClientCluster">
<property name="jedisCluster" ref="jedisCluster"/>
</bean>
- 使用时将类型注入可以选择其中一个版本
- 单机版的注入时,将spring-jedis.xml中的集群版本注释,注入接口JedisClient.java
- 集群版本注入时,将spring-jedis.xml中的单机版本注释,注入接口JedisClient.java
- 作业:完成首页门户的轮播图效果(redis集群)
- 需求:解决查询缓存问题与同步缓存问题
- 读数据规则(查询缓存问题):先判断缓存中是否有要的数据
- 若有,则直接加载
- 若无,则去DB加载,并存入缓存中
- 实际代码举例
java
public List<TbContent> getContentListByCid(Long cid){
try{
//查询缓存,如果存在直接加载
String json = jedisClient.hget("CONTENT_LIST",Long.toString(cid));
if(StringUtils.isNotBlank(json)){
List<TbContent> list = JsonUtils.jsonToList(json,TbContent.class);
return list;
}
}catch(Exception e){
e.printStackTrace();
}
//如果缓存中没有
TbContentExample example = new TbContentExample();
TbContentExample.Criteria criteria = example.createCriteria();
criteria.andCategoryIdEqualTo(cid);
List<TbContent> clist = contentMapper.selectByExample(example);
try{
//将查询出的数据存放到缓存中
jedisClient.hset("CONTENT_LIST",Long.toString(cid),JsonUtils.objectToJson(clist));
return clist;
}catch(Exception e){
e.printStackTrace();
}
}
- 改数据规则(缓存同步问题):
- 直接失效缓存数据,再修改DB内容
- 避免突发情况:避免DB修改成功,但由于网络或者其他问题导致缓存数据没有清理,造成了脏数据
- 实际代码举例
java
public int addContent(TbContent content){
try{
//缓存同步,删除缓存中对应的数据
jedisClient.hdel("CONTENT_LIST",content.getId().toString());
}catch(Exception e){
e.printStackTrace();
}
content.setCreated(new Date());
content.setUpdated(new Date());
int count = contentMapper.insert(content);
return count;
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- reduce学习笔记
- 【python实现卷积神经网络】开始训练
- django实战(五)--增加数据
- 实战django(一)--(你也能看懂的)注册与登录(带前端模板)
- 【python-leetcode23-多路归并】合并k个排序链表
- 实战django(二)--登录实现记住我
- org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.gong.mybatis.da
- 【python-leetcode378-二分查找】有序矩阵中的第k小元素
- 使用cookie来记录用户登录次数,为何次数不更新
- (二)golang--windows下vscode的安装以及go环境的配置
- mybatis文件映射之使用#取值时的一些规则
- 【论文笔记】Improved Residual Networks for Image and Video Recognition(ResNet新变体:IResNet)
- SQL语句在MYSQL中的运行过程和各个组件的介绍
- (五)golang--常用的一些玩意
- 关于MYSQL 的日志系统