redis和Spring的整合
来源:互联网 发布:学通网络红尘ai教程 编辑:程序博客网 时间:2024/06/05 00:56
第一步:导入依赖
<dependency><span style="white-space:pre"></span><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.6.0</version></dependency>第二步:写applicationContext-redis.xml
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"><!-- 定义连接池配置 --><bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"><!-- 最大连接数 --><property name="maxTotal" value="${redis.maxTotal}"></property></bean><!-- 定义分片式连接池 --><bean class="redis.clients.jedis.ShardedJedisPool" destroy-method="close"><constructor-arg index="0" ref="jedisPoolConfig" /><constructor-arg index="1"><list><!-- 配置集群的节点信息 --><bean class="redis.clients.jedis.JedisShardInfo"><constructor-arg index="0" value="${redis.node1.ip}"/><constructor-arg index="1" value="${redis.node1.port}"/></bean><!-- <bean class="redis.clients.jedis.JedisShardInfo"><constructor-arg index="0" value="${redis.node2.ip}"/><constructor-arg index="1" value="${redis.node2.port}"/></bean> --></list></constructor-arg></bean></beans>第三步:写redis.properties
redis.maxTotal=100redis.node1.ip=127.0.0.1redis.node1.port=6379
第四步:spring配置文件了把redis.properties添加上
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><!-- 允许JVM参数覆盖 --><property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /><!-- 忽略没有找到的资源文件 --><property name="ignoreResourceNotFound" value="true" /><!-- 配置资源文件 --><property name="locations"><list><value>classpath:jdbc.properties</value><value>classpath:upload.properties</value><value>classpath:redis.properties</value></list></property></bean>
第五步:写个接口,用于拓展
public interface Function<E,T> { public T callback(E e);}第六步:写通用service
@Servicepublic class RedisService { @Autowired private ShardedJedisPool shardedJedisPool; private <T> T execute(Function<ShardedJedis, T> fun) { ShardedJedis shardedJedis = null; try { shardedJedis = shardedJedisPool.getResource(); return fun.callback(shardedJedis); } finally { if (null != shardedJedis) { // 关闭,检测连接是否有效,有效则放回到连接池中,无效则重置状态 shardedJedis.close(); } } } /** * 设置值 * * @param key * @param value * @return */ public String set(final String key, final String value) { return this.execute(new Function<ShardedJedis, String>() { @Override public String callback(ShardedJedis jedis) { return jedis.set(key, value); } }); } /** * 获取值 * * @param key * @return */ public String get(final String key) { return this.execute(new Function<ShardedJedis, String>() { @Override public String callback(ShardedJedis e) { return e.get(key); } }); } /** * 删除 * * @param key * @return */ public Long del(final String key) { return this.execute(new Function<ShardedJedis, Long>() { @Override public Long callback(ShardedJedis e) { return e.del(key); } }); } /** * 设置生存时间 * * @param key * @return */ public Long expire(final String key, final Integer seconds) { return this.execute(new Function<ShardedJedis, Long>() { @Override public Long callback(ShardedJedis e) { return e.expire(key, seconds); } }); } /** * 设置值以及生存时间,单位为秒 * * @param key * @param value * @param seconds * @return */ public String set(final String key, final String value, final Integer seconds) { return this.execute(new Function<ShardedJedis, String>() { @Override public String callback(ShardedJedis jedis) { String result = jedis.set(key, value); jedis.expire(key, seconds); return result; } }); }}
第七步:使用:注意添加缓存的原则:不能影响正常的业务逻辑执行
1.从缓存中命中,如果命中,直接返回,如果没有命中,程序继续往下执行
2.需要将执行的结果写入到缓存中
例子:
package com.taotao.manage.service;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.fasterxml.jackson.databind.ObjectMapper;import com.taotao.common.bean.ItemCatData;import com.taotao.common.bean.ItemCatResult;import com.taotao.manage.pojo.ItemCat;@Servicepublic class ItemCatService extends BaseService<ItemCat> { @Autowired private RedisService redisService; // ObjectMapper这里用于序列号和反序列化 private static final ObjectMapper MAPPER = new ObjectMapper(); // redis定义一个key,规则:项目名_模块名_业务名 private static final String REDIS_KEY = "TAOTAO_MANAGE_ITEMCAT_WEB_ALL"; // 定义缓存的时间,单位秒 private static final Integer REDIS_TIME = 60 * 60 * 24 * 30; /** * 全部查询,并且生成树状结构 */ public ItemCatResult queryAllToTree() { try { String cacheData = this.redisService.get(REDIS_KEY); if (StringUtils.isNotEmpty(cacheData)) { // 如果命中 // 反系列化 ItemCatResult itemCatResult = MAPPER.readValue(cacheData, ItemCatResult.class); return itemCatResult; } } catch (Exception e) { e.printStackTrace(); } ItemCatResult result = new ItemCatResult(); // 得到所有数据 List<ItemCat> itemCats = super.queryAll(); // 声明一个map,用于存储itemCats,key为parentId,value为数据集合 Map<Long, List<ItemCat>> itemCatMap = new HashMap<Long, List<ItemCat>>(); for (ItemCat itemCat : itemCats) { if (!itemCatMap.containsKey(itemCat.getParentId())) { itemCatMap.put(itemCat.getParentId(), new ArrayList<ItemCat>()); } itemCatMap.get(itemCat.getParentId()).add(itemCat); } // 封装一级对象 List<ItemCat> itemCatList1 = itemCatMap.get(0L); for (ItemCat itemCat : itemCatList1) { ItemCatData itemCatData = new ItemCatData(); itemCatData.setUrl("/products/" + itemCat.getId() + ".html"); itemCatData.setName("<a href='" + itemCatData.getUrl() + "'>" + itemCat.getName() + "</a>"); result.getItemCats().add(itemCatData); if (!itemCat.getIsParent()) { continue; } // 封装二级对象 List<ItemCat> itemCatList2 = itemCatMap.get(itemCat.getId()); List<ItemCatData> itemCatData2 = new ArrayList<ItemCatData>(); itemCatData.setItems(itemCatData2); for (ItemCat itemCat2 : itemCatList2) { ItemCatData id2 = new ItemCatData(); id2.setName(itemCat2.getName()); id2.setUrl("/products/" + itemCat2.getId() + ".html"); itemCatData2.add(id2); if (itemCat2.getIsParent()) { // 封装三级对象 List<ItemCat> itemCatList3 = itemCatMap.get(itemCat2.getId()); List<String> itemCatData3 = new ArrayList<String>(); id2.setItems(itemCatData3); for (ItemCat itemCat3 : itemCatList3) { itemCatData3.add("/products/" + itemCat3.getId() + ".html|" + itemCat3.getName()); } } } // 最多返回14个一级类目 if (result.getItemCats().size() >= 14) { break; } } try { // 将结果写入到缓存 this.redisService.set(REDIS_KEY, MAPPER.writeValueAsString(result), REDIS_TIME); } catch (Exception e) { e.printStackTrace(); } return result; }}
0 0
- spring和redis的整合
- redis和Spring的整合
- spring和redis的整合
- redis和spring整合
- redis和spring整合
- redis和spring整合
- Spring和redis的整合测试
- spring和redis集群的整合
- Spring+redis的整合
- spring和redis整合总结
- Spring整合redis的错误
- spring整合redis的错误
- spring-redis的整合配置
- spring整合redis的学习
- Spring与Redis的整合
- Redis的安装、部署和与Spring Cache整合
- 项目中使用spring和redis的整合
- redis安装,redis项目以来,redis和spring整合,redis的service,redis的service实现类
- 大数量级组合数的快速计算方法
- 10.jvm之保护域
- Android input上报*、#键值笔记
- 实习第一天
- Android面试题集锦(一)
- redis和Spring的整合
- Zygote 启动流程分析
- KernelHeaders 内核头文件
- lazarus实现dbgrid中的lookup字段好简单,随便点几下就实现了
- 在Spring中使用JOTM实现JTA事务管理
- 添加手势 swift
- 链表的增删改查
- 标准库
- BZOJ 1012 [JSOI2008]最大数maxnumber=听说是线段树