1.导入依赖

<properties>
<junit.version>4.12</junit.version>
<spring.version>4.2.4.RELEASE</spring.version>
</properties> <dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
<!--Redis依赖-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.7.2.RELEASE</version>
</dependency>
</dependencies>

2.在resources文件夹下添加配置文件

redis-config.properties

redis.host=192.168.200.128
redis.port=6379
#redis有验证添加,无验证不添加
redis.pass=
redis.database=0
redis.maxIdle=300
redis.maxWait=3000
redis.testOnBorrow=true

applicationContext-redis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache.xsd"> <context:property-placeholder location="classpath*:redis-config.properties" /> <!-- redis 相关配置 -->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="maxWaitMillis" value="${redis.maxWait}" />
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean> <bean id="JedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="JedisConnectionFactory" />
</bean> </beans>

3.测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/spring/applicationContext-redis.xml")
public class RedisTest {
@Autowired
private RedisTemplate redisTemplate; //1.redis简单数据类型
@Test
public void test01(){ redisTemplate.opsForValue().set("key1", "华为"); //向redis中添加数据
String key1 = (String) redisTemplate.opsForValue().get("key1"); //获取redis中的数据
System.out.println(key1); redisTemplate.delete("key1"); //删除redis中的数据
Object key2 = redisTemplate.opsForValue().get("key1"); //获取redis中的数据
System.out.println(key2); //若redis中无对应的值,则返回null
}
//2.redis值类型操作
@Test
public void test02(){
redisTemplate.boundValueOps("key").set("spring-data-redis"); //向redis中添加数据
Object key = redisTemplate.boundValueOps("key").get(); //获取redis中的数据
System.out.println(key); redisTemplate.delete("key"); //删除redis中的数据
Object key1 = redisTemplate.boundValueOps("key").get(); //获取redis中的数据
System.out.println(key1); //若redis中无对应的值,则返回null
} //3.redis Set类型操作
@Test
public void test03(){
redisTemplate.boundSetOps("set").add("华为");
redisTemplate.boundSetOps("set").add("苹果");
redisTemplate.boundSetOps("set").add("三星");
redisTemplate.boundSetOps("set").add("小米");
redisTemplate.boundSetOps("set").add("vivo");
redisTemplate.boundSetOps("set").add("魅族"); Set set = redisTemplate.boundSetOps("set").members();
System.out.println(set); //redisTemplate.boundSetOps("set").remove("魅族");
redisTemplate.delete("set");
Set set1 = redisTemplate.boundSetOps("set").members();
System.out.println(set1);
}
//4.redis List类型操作
@Test
public void test04(){
redisTemplate.boundListOps("list").leftPush("a"); //从左边添加数据
redisTemplate.boundListOps("list").leftPush("b");
redisTemplate.boundListOps("list").leftPush("c");
redisTemplate.boundListOps("list").rightPush("1"); //从右边添加数据
redisTemplate.boundListOps("list").rightPush("2");
redisTemplate.boundListOps("list").rightPush("3"); List list = redisTemplate.boundListOps("list").range(0, -1);
System.out.println(list); redisTemplate.delete("list");
List list1 = redisTemplate.boundListOps("list").range(0, -1);
System.out.println(list1); }
//5.Hash类型操作
@Test
public void test05(){
redisTemplate.boundHashOps("hash").put("name", "张三");
redisTemplate.boundHashOps("hash").put("sex", "男");
redisTemplate.boundHashOps("hash").put("age", "18"); Map map = redisTemplate.boundHashOps("hash").entries();
for (Object key : map.keySet()) {
System.out.println(key +" : " + map.get(key) );
}
redisTemplate.boundHashOps("hash").delete("sex");
Map map1 = redisTemplate.boundHashOps("hash").entries();
for (Object o : map1.entrySet()) {
Map.Entry entry = (Map.Entry) o;
System.out.println(entry.getKey()+":"+entry.getValue());
} }
}

4.项目中的使用

先从redis中查询数据,若为null,则表示redis中无数据,然后从mysql数据库中查找数据,再将数据存入redis缓存中。数据库进行增删改操作之后都要清除redis缓存,以防数据不一致。

public class ContentServiceImpl implements ContentService {
@Autowired
private ContentMapper contentMapper;
@Autowired
private RedisTemplate redisTemplate;
@Override
public void insert(Content content) { //redis缓存
contentMapper.insertSelective(content);
//清楚缓存
redisTemplate.boundHashOps(RedisConst.CONTENT).delete(content.getCategoryId());
} @Override
public void delete(Long[] ids) {
//清空缓存
for (Long id : ids) {
Long categoryId = contentMapper.selectByPrimaryKey(id).getCategoryId();
redisTemplate.boundHashOps(RedisConst.CONTENT).delete(categoryId);
} //从数据库删除记录
List<Long> list = Arrays.asList(ids);
ContentExample example = new ContentExample();
example.createCriteria().andIdIn(list);
contentMapper.deleteByExample(example);
} @Override
public void update(Content content) {
//查询修改前的分类id
Long oldCategoryId = contentMapper.selectByPrimaryKey(content.getId()).getCategoryId();
redisTemplate.boundHashOps(RedisConst.CONTENT).delete(oldCategoryId); //清除缓存
contentMapper.updateByPrimaryKeySelective(content); //如果修改后的分类id发生修改,清除修改后的分类id的缓存
if(oldCategoryId.longValue() != content.getCategoryId().longValue()){
redisTemplate.boundHashOps(RedisConst.CONTENT).delete(content.getCategoryId());
}
}
//根据广告分类id查询广告列表
@Override
public List<Content> findByCategoryId(long categoryId) { //redis缓存机制
//1.从redis中取数据
List<Content> contents = (List<Content>) redisTemplate.boundHashOps(RedisConst.CONTENT).get(categoryId);
//2.判断redis中是否有数据
if(contents == null){
//3.从mysql数据库中查找数据
ContentExample example = new ContentExample();
ContentExample.Criteria criteria = example.createCriteria();
criteria.andCategoryIdEqualTo(categoryId);
criteria.andStatusEqualTo("1");//开启状态
example.setOrderByClause("sort_order");
contents = contentMapper.selectByExample(example);
//4.将查询到的数据库保存到Redis数据库中
redisTemplate.boundHashOps(RedisConst.CONTENT).put(categoryId, contents);
}
return contents;
} }

spring-data-redis的使用/redis缓存的更多相关文章

  1. 使用Spring Data Redis时,遇到的几个问题

    需求: 1,保存一个key-value形式的结构到redis 2,把一个对象保存成hash形式的结构到redis 代码如下: // 保存key-value值         pushFrequency ...

  2. hibernate、mybatis、spring data 的对比

    转: 1.概念: Hibernate :Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库.着力 ...

  3. ORM--------Hibernate、Mybatis与Spring Data的区别

    1.概念: Hibernate :Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库.着力点对象 ...

  4. 使用 Spring data redis 结合 Spring cache 缓存数据配置

    使用 JavaConfig 方式配置 依赖 jar 包: jedis.spring-data-redis 首先需要进行 Redis 相关配置 @Configuration public class R ...

  5. 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)

    本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...

  6. spring + redis 实现数据的缓存

    1.实现目标 通过redis缓存数据.(目的不是加快查询的速度,而是减少数据库的负担) 2.所需jar包 注意:jdies和commons-pool两个jar的版本是有对应关系的,注意引入jar包是要 ...

  7. spring data redis RedisTemplate操作redis相关用法

    http://blog.mkfree.com/posts/515835d1975a30cc561dc35d spring-data-redis API:http://docs.spring.io/sp ...

  8. Spring data redis的一个bug

    起因 前两天上线了一个新功能,导致线上业务的缓存总是无法更新,报错也是非常奇怪,redis.clients.jedis.exceptions.JedisConnectionException: Unk ...

  9. Spring Data操作Redis详解

    Spring Data操作Redis详解 Redis是一种NOSQL数据库,Key-Value形式对数据进行存储,其中数据可以以内存形式存在,也可以持久化到文件系统.Spring data对Redis ...

  10. Spring Data Redis 让 NoSQL 快如闪电(2)

    [编者按]本文作者为 Xinyu Liu,文章的第一部分重点概述了 Redis 方方面面的特性.在第二部分,将介绍详细的用例.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 把 Redis ...

随机推荐

  1. java 分页对象以及数据库分页查询

    import java.util.List; public class Pager<T> { private Integer pageSize; private Integer total ...

  2. 高并发-原子性-AtomicInteger

    线程不安全: //请求总次数private static int totalCount = 10000;//最大并发数private static int totalCurrency = 100;// ...

  3. STM32 JTAG接口SWD下载接线图

  4. Python重写父类方法__len__

    class Liar(list): def __len__(self): return super().__len__() + 3 # 直接写 super().__len__() 而没有 return ...

  5. c++ printf和cout的性能

    今天做了一道编程题,仔细检查了算法并没有错误,但是结果显示时间超时,但仍有80%的案例通过了,很奇怪. 通过将cin换成scanf,cout换成printf结果AC,实验发现二者性能差了很多,在输出1 ...

  6. Java面试之基础篇(2)

    11.是否可以从一个static方法内部发出对非static方法的调用? 不可以.因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用 ...

  7. SonarQube规则之坏味道类型

    1.Abbreviation As Word In Name (默认 关闭)坏味道 主要检查验证标识符名称中的缩写(连续大写字母)长度,还允许执行骆驼案例命名allowedAbbreviationLe ...

  8. 封装通用的 ajax, 基于 jQuery。

    在前端异步获取数据时候每次都是使用 ajax:为了通用性更好,然而封装通用的 ajax 是一个一劳永逸的办法. 本次基于 jQuery 封装实现: 第一步: 引入 jQuery: <script ...

  9. android 小游戏 ---- 数独(二)

    > 首先创建一个自己的View类   -->继承SurfaceView并实现SurfaceHolder.Callback接口    --> SurfaceView.getHolder ...

  10. UNR#3 Day1——[ 堆+ST表+复杂度分析 ][ 结论 ][ 线段树合并 ]

    地址:http://uoj.ac/contest/45 第一题是鸽子固定器. 只会10分.按 s 从小到大排序,然后 dp[ i ][ j ][ k ] 表示前 i 个元素.已经选了 j 个.最小值所 ...