采用Redis作为Web系统的缓存。用Spring的Cache整合Redis。

一、关于redis的相关xml文件的写法
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:cache="http://www.springframework.org/schema/cache"
  xmlns:c="http://www.springframework.org/schema/c"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

        http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">

    <!-- 开启缓存注解 -->

<cache:annotation-driven />

    <!-- jedis客户端连接工厂 -->

<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="192.168.1.200" p:port="6379"/>
        
  <!-- redisTemplate模板 -->
  <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnectionFactory"/>
  
  <!-- redis缓存管理器 -->

<bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager" c:template-ref="redisTemplate"/>

</beans>
二、实体类
 
public class Student implements Serializable{
    
    /**
     * 
     */
    private static final long serialVersionUID = -4676194082313592019L;
 
    private Integer id;
    
    private String name;
    
    private Integer age;
 
    public Integer getId() {
        return id;
    }
 
    public void setId(Integer id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Integer getAge() {
        return age;
    }
 
    public void setAge(Integer age) {
        this.age = age;
    }
 
    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
    }
    
    
 
}
 
三、数据访问层
public interface StudentMapper {
    
    @Insert("insert into student(id,name,age) values(#{id},#{name},#{age})")
    public void insert(Student student);
    
    @Delete("delete from student where id = #{id}")
    public void delete(@Param("id")Integer id);
    
    @Update("update student set name=#{name},age=#{age} where id=#{id}")
    public void update(Student student);
    
    @Select("select * from student where id=#{id}")
    public Student queryById(@Param("id")Integer id);
 

}

 
四、业务处理层(关键)
public interface IStudentService {
    
    public void add(Student student);
    
    public void delete(Integer id);
    
    public void update(Student student);
    
    public Student queryById(Integer id);
 

}

public class StudentServiceImpl extends BaseService implements IStudentService{
    
    private StudentMapper mapper;
 
    @CachePut(key="#student.id",value="student")
    @Override
    public void add(Student student) {
        mapper = writableSQLSession.getMapper(StudentMapper.class);
        mapper.insert(student);
    }
 
    @Override
    public void delete(Integer id) {
        mapper = writableSQLSession.getMapper(StudentMapper.class);
        mapper.delete(id);
    }
 
    @Override
    public void update(Student student) {
        mapper = writableSQLSession.getMapper(StudentMapper.class);
        mapper.update(student);
    }
    @Cacheable(key="#id",value="student")
    @Override
    public Student queryById(Integer id) {
        mapper = readonlySQLSession.getMapper(StudentMapper.class);
        return mapper.queryById(id);
    }
 

}

 
最重要的三个注解是@Cacheable()和@CacheEvict()和@CachePut()
 
对于缓存声明,缓存抽象类提供两个Java注解:@Cacheable和@CacheEvict,这两个注解可以允许方法触发缓存或者缓存抽取。

@Cacheable缓存

    应用到读取数据的方法上,即可缓存的方法,如查找方法。
    就像注解名字的含义一样,@Cacheable用于区别可缓存的方法,指的是方法运行的结果被装入缓存的方法,因此,在随后的方法调用中,在缓存的值被返回,在实际上没有执行这个方法。最简单的构成,注解声明需要和被缓存的方法有关系的缓存名字:
@Cacheable("books")
public Book findBook(ISBN isbn) {...}
    在上面的片段,findBook方法是和名字为books的缓存有关系的。方法每次被调用,这个缓存被检查去查看是否这个调用已经执行并且没有被重复。在大多数的情况下,只有一个缓存被声明,注解允许多个被指定的名字以至于不知一个缓存被正在使用。在这种情况下,每个缓存将会在执行方法之前被检查,如果至少一个缓存被选中,那么相关的值将被返回:
(注意:所有其他的没有包含这个方法的缓存将会被更新,即使这个被缓存的方法实际上没有被执行)
@Cacheable({ "books", "isbns" })
public Book findBook(ISBN isbn) {...}
    

默认键的生成

    由于缓存实际上是键值对存贮的,一个被缓存的方法每一次的调用需要被转换成一个合适的键为了缓存访问。在这个盒子之外,缓存抽象类用一个简单的KeyGenerator(键生成器)基于以下的算法:
    1.如果没有给参数,返回SimpleKey.EMPTY。
    2.如果仅仅给了一个参数,返回那个实例。
    3.如果不只一个参数被指定,返回一个SimpleKey包含所有参数。
    只要参数具有natural keys并且实现有效的hashCode()和equals()方法,这种处理方式对于大多数用例运行完美;如果这不符合这种场景,键的生成策略需要改变。
    提供一个不同的默认键生成器,需要实现org.springframework.cache.KeyGenerator接口。一旦配置,这个生成器将会用于每个没有特殊指定它自己的键生成策略的声明中。

用户自定义键生成器声明

    因为缓存是一个通用类,它非常像有多种不能简单映射在缓存结构的顶部的签名的目标方法。当目标方法有多个超出了适用于缓存的参数时,这将变得明显。例如:
@Cacheable("books")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
    第一眼看去,两个布尔型的参数影响找书的方式,他们对于缓存是没用的。
    对于这种场景,@Cacheable注解允许用户通过key属性指定键的生成策略。开发和可以用SpEL去获取参数(或者他们包含的属性),执行的方式甚至不用写任何代码或者实现任何借口调用不同的方法。这是在默认生成器之外推荐的方法。

@CachePut

应用到写数据的方法上,如新增/修改方法

@CacheEvict

即应用到移除数据的方法上,如删除方法

提供的SpEL上下文数据

spring Cache提供了一些供我们使用的SpEL上下文数据,下表直接摘自Spring官方文档:

名字 位置 描述 示例

methodName

root对象

当前被调用的方法名

#root.methodName

method

root对象

当前被调用的方法

#root.method.name

target

root对象

当前被调用的目标对象

#root.target

targetClass

root对象

当前被调用的目标对象类

#root.targetClass

args

root对象

当前被调用的方法的参数列表

#root.args[0]

caches

root对象

当前方法调用使用的缓存列表(如@Cacheable(value={"cache1", "cache2"})),则有两个cache

#root.caches[0].name

argument name

执行上下文

当前被调用的方法的参数,如findById(Long id),我们可以通过#id拿到参数

#user.id

result

执行上下文

方法执行后的返回值(仅当方法执行之后的判断有效,如‘unless’,'cache evict'的beforeInvocation=false)

#result

 
 

条件缓存

    有时,一个方法不总是适用于缓存。缓存注解通过带有SpEL表达式的conditional参数来评估是true或者false能够达到这种功能。如果返回时true,那么这个方法被缓存,如果不是,这个方法不会被缓存。一个例子,下面的方法将会被缓存,仅当参数name的长度小于32的时候:
@Cacheable(value="book", condition="#name.length < 32")
public Book findBook(String name)
 
 
本博文转载自http://blog.csdn.net/qinsihang/article/details/22722253
 

(转)Spring整合Redis作为缓存的更多相关文章

  1. Spring整合Redis&JSON序列化&Spring/Web项目部署相关

    几种JSON框架用法和效率对比: https://blog.csdn.net/sisyphus_z/article/details/53333925 https://blog.csdn.net/wei ...

  2. 网站性能优化小结和spring整合redis

    现在越来越多的地方需要非关系型数据库了,最近网站优化,当然从页面到服务器做了相应的优化后,通过在线网站测试工具与之前没优化对比,发现有显著提升. 服务器优化目前主要优化tomcat,在tomcat目录 ...

  3. spring配置redis注解缓存

    前几天在spring整合Redis的时候使用了手动的方式,也就是可以手动的向redis添加缓存与清除缓存,参考:http://www.cnblogs.com/qlqwjy/p/8562703.html ...

  4. mybatis 高级映射和spring整合之查询缓存(5)

    mybatis 高级映射和spring整合之查询缓存(5) 2.0 查询缓存 2.0.1 什么是查询缓存 mybatis提供缓存,用于减轻数据压力,提高数据库性能. mybatis提供一级缓存和二级缓 ...

  5. spring整合redis之hello

    1.pom.xml文件 <dependencies> <!-- spring核心包 --> <dependency> <groupId>org.spri ...

  6. Spring整合Redis时报错:java.util.NoSuchElementException: Unable to validate object

    我在Spring整合Redis时报错,我是犯了一个很低级的错误! 我设置了Redis的访问密码,在Spring的配置文件却没有配置密码这一项,配置上密码后,终于不报错了!

  7. Redis的安装以及spring整合Redis时出现Could not get a resource from the pool

    Redis的下载与安装 在Linux上使用wget http://download.redis.io/releases/redis-5.0.0.tar.gz下载源码到指定位置 解压:tar -xvf ...

  8. Spring整合redis实现key过期事件监听

    打开redis服务的配置文件   添加notify-keyspace-events Ex  如果是注释了,就取消注释 这个是在以下基础上进行添加的 Spring整合redis:https://www. ...

  9. spring整合redis客户端及缓存接口设计(转)

    一.写在前面 缓存作为系统性能优化的一大杀手锏,几乎在每个系统或多或少的用到缓存.有的使用本地内存作为缓存,有的使用本地硬盘作为缓存,有的使用缓存服务器.但是无论使用哪种缓存,接口中的方法都是差不多. ...

随机推荐

  1. php学习,一个简单的Calendar(2) 一个简单的活动页面

    有了前面的基础,后面就是将页面展示出来. 预览图如下:1号和31号分别有活动,会一并显示出来   这里需要搞定几个问题,一个就是数据库的连接,我们用\sys\class\class.db_connec ...

  2. delphi发送html带附件邮件

    var html: TIdText; begin if not SMTP.Connected then SMTP.Disconnect(); try SMTP.Connect; try if SMTP ...

  3. Object.defineProperty

    属性类型ECMA-262第5版在定义只有内部才用的特性(attribute)时,描述了属性(property)的各种特征.ECMA-262定义这些特性是为了实现JavaScript引擎用的,因此在Ja ...

  4. hibernate的formula如何使用

    之前用过hibernate的formula记得很好用,但是这次用到想不起来怎么用了,结果去网上查结果发现大多都是无用信息. 最终搞定了,还是在这里记录一下,省的忘记. 我用formula的目的在于字典 ...

  5. bzoj 2482: [Spoj GSS2] Can you answer these queries II 线段树

    2482: [Spoj1557] Can you answer these queries II Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 145 ...

  6. [原博客] POI系列(4)

    正规.严谨.精妙. -POI BZOJ 1531 : [POI2005]Bank notes 裸的背包,可以二进制拆分一下.一个物品比如说有n个,可以拆成 1,2,4,8,16...个. OJ上没有样 ...

  7. UCS-2和UTF8的四个新知识点和新的疑问

    最初的unicode编码是固定长度的,16位,也就是2两个字节代表一个字符,这样一共可以表示65536个字符.显然,这样要表示各种语言中所有的字符是远远不够的.Unicode4.0规范考虑到了这种情况 ...

  8. DLL导出与调用约定

    一般来说,从DLL导出函数有两种方法.一种是使用.def文件:另一种是使用__declspec(dllexport). 使用上面两种方法各有优缺点.使用.def文件就是需要额外维护,当导出函数更改名字 ...

  9. 转:三十一、Java图形化界面设计——布局管理器之GridLayout(网格布局)

    http://blog.csdn.net/liujun13579/article/details/7772491 网格布局特点: l  使容器中的各组件呈M行×N列的网格状分布. l  网格每列宽度相 ...

  10. oracle命中率模型计算

    命中率模型是在owi之前比较常用的一种诊断性能问题的方法,通过命中率的计算,发现系统中的一些设置是否合理,当命中率不高的时候,通过调整一些参数和设置,提高命中率,有效的提高系统的性能和吞吐量.但当系统 ...