分布式数据存储 之 Redis(二) —— spring中的缓存抽象

一、spring boot 中的 StringRedisTemplate

1.StringRedisTemplate Demo

第一步:引入redis依赖

最重要的依赖

compile('org.springframework.boot:spring-boot-starter-data-redis')

此依赖为springCloud 父项目 依赖(但已添加 redis 依赖)

buildscript {
ext {
springBootVersion = '2.1.2.RELEASE'
}
repositories {
mavenLocal() //maven本地仓库
maven {
url = "http://maven.aliyun.com/nexus/content/groups/public"
}
mavenCentral()//maven中心仓库
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
} subprojects {
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management' group = 'com.lichuang.kukri'
version = '1.0.0'
sourceCompatibility = 1.8 repositories {
mavenLocal() //maven本地仓库
maven {
url = "http://maven.aliyun.com/nexus/content/groups/public"
}
mavenCentral()//maven中心仓库
} ext {
springCloudVersion = 'Greenwich.RELEASE'
} dependencies {
compile('org.springframework.boot:spring-boot-starter-actuator')
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.cloud:spring-cloud-starter')
testCompile('org.springframework.boot:spring-boot-starter-test') //redis 依赖
compile('org.springframework.boot:spring-boot-starter-data-redis')
} dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
} }

第二步:创建 StringRedisTemplate 的 Bean

StringRedisTemplate 的构造函数可知需要 RedisConnectionFactory 的 Bean,又由 RedisConnectionFactory 可知需要 RedisStandaloneConfiguration 的 Bean, RedisStandaloneConfiguration 的构造函数中需要有 hostname 以及 port

@Configuration
@ComponentScan
public class AppConfig { //xxxTemplate -> 设计模式之一 模板方法设计模式 @Bean
public RedisStandaloneConfiguration redisStandaloneConfiguration(){
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration("hostname",6379);
return redisStandaloneConfiguration;
} @Bean
public RedisConnectionFactory redisConnectionFactory(){
LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration()); return connectionFactory;
} @Bean
public StringRedisTemplate stringRedisTemplate(){
StringRedisTemplate redisTemplate = new StringRedisTemplate(redisConnectionFactory()); return redisTemplate;
} }

第三步:获取 StringRedisTemplate 进行运用

  1. 添加数据至Redis: redisTemplate.opsForValue().set("name","test");
  2. 从Redis 获取数据: redisTemplate.opsForValue().get("name")
public class RedisServer {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); StringRedisTemplate redisTemplate = applicationContext.getBean(StringRedisTemplate.class); redisTemplate.opsForValue().set("name","test"); //System.out.println(redisTemplate.opsForValue().get("name")); /* redisTemplate.watch("name");
redisTemplate.multi();
redisTemplate.exec();*/
}
}

二、 Cache Abstraction

1.核心接口

CachManager

Spring's central cache manager SPI.

方法

​ Cache getCache(String name);

​ Collection getCacheNames();

Cache

Interface that defines common cache operations

常见实现类
  1. ConcurrentMapCache
  2. RedisCache
  3. EhCacheCache

KeyGenerator

​ SimpleKeyGenerator(默认实现类)

2. 常见注解

@Cacheable

如果缓存中有值,则使用缓存中的值;如果没有则执行业务方法并存入缓存中

属性
  1. condition

    判断

  2. unless

@CachePut

每次都会执行业务方法,并设置缓存

@CacheEvict

每次都会执行业务方法,并删除缓存

3. Cache Abstraction Demo

第一步:引入依赖

dependencies {
compile('org.springframework.boot:spring-boot-starter-data-redis')
compile group: 'org.projectlombok', name: 'lombok', version: '1.18.6'
compile group: 'com.alibaba', name: 'fastjson', version: '1.2.56'
}

第二步:创建 CacheManager 的 Bean

注:

​ 1. GenericFastJsonRedisSerializer 类 使 Value 的 储存方式 为 Josn

@Configuration
@ComponentScan
@MapperScan("com.lichuang.kukri.springcloudproject.config.dao")
@EnableCaching
public class AppConfig { //xxxTemplate -> 设计模式之一 模板方法设计模式 @Bean
public RedisStandaloneConfiguration redisStandaloneConfiguration(){
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration("hostname",6379);
return redisStandaloneConfiguration;
} @Bean
public CacheManager cacheManager(){
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory()); RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericFastJsonRedisSerializer())); RedisCacheManager redisCacheManager = new RedisCacheManager(redisCacheWriter,redisCacheConfiguration); return redisCacheManager;
} }

第三步:创建 Service

@Service
public class CacheService { @CachePut(cacheNames = "person")
public Person update(int age){
Person person = new Person();
person.setPersonName("admin");
person.setAge(age);
return person;
} @Cacheable(cacheNames = "person")
public Person selectP(int age){
Person person = new Person();
person.setPersonName("test");
person.setAge(age);
return person;
} @Cacheable(cacheNames = "cache")
public String selectC(int i){
System.out.println("select");
return "admin";
}
}

​ Person.java(实体类)

public class Person {

    private String personName;

    private int age;

    public String getPersonName() {
return personName;
} public void setPersonName(String personName) {
this.personName = personName;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
}

第四步:运行

public class RedisServer {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); PersonDao personDao = applicationContext.getBean(PersonDao.class);
List<Person> people = personDao.select();
for (int i = 0; i < people.size(); i++) {
System.out.println(people.get(i).getPersonName() + "-" + people.get(i).getAge());
} /*CacheService cacheService = applicationContext.getBean(CacheService.class);
for (int i = 0; i < 2; i++) {
//System.out.println(cacheService.selectC(i)); cacheService.update(i);
}*/
}
}

第五步:在 Redis 中获取

127.0.0.1:6379> get cache::0
"\"admin\""
127.0.0.1:6379> get person::0
"{\"@type\":\"com.bean.Person\",\"age\":1,\"name\":\"test\"}"

分布式数据存储 之 Redis(二) —— spring中的缓存抽象的更多相关文章

  1. 分布式数据存储 之 Redis(一) —— 初识Redis

    分布式数据存储 之 Redis(一) -- 初识Redis 为什么要学习并运用Redis?Redis有什么好处?我们步入Redis的海洋,初识Redis. 一.Redis是什么 ​ Redis 是一个 ...

  2. 使用Spring提供的缓存抽象机制整合EHCache为项目提供二级缓存

      Spring自身并没有实现缓存解决方案,但是对缓存管理功能提供了声明式的支持,能够与多种流行的缓存实现进行集成. Spring Cache是作用在方法上的(不能理解为只注解在方法上),其核心思想是 ...

  3. redis在spring中的配置及java代码实现

    1.建一个redis.properties属性文件 # Redis Setting redis.addr = 127.0.0.1 redis.port = 6379 redis.auth = mast ...

  4. Redis整合Spring结合使用缓存实例

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文介绍了如何在Spring中配置redis,并通过Spring中AOP的思想,将缓存的 ...

  5. Redis整合Spring结合使用缓存实例(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文介绍了如何在Spring中配置redis,并通过Spring中AOP的思想,将缓存的 ...

  6. spring中使用缓存

    一.启用对缓存的支持 Spring 对缓存的支持最简单的方式就是在方法上添加@Cacheable和@CacheEvict注解, 再添加注解之前,必须先启用spring对注解驱动的支持,基于java的配 ...

  7. Redis学习总结(3)——Redis整合Spring结合使用缓存实例

    摘要:本文介绍了如何在Spring中配置redis,并通过Spring中AOP的思想,将缓存的方法切入到有需要进入缓存的类或方法前面. 一.Redis介绍 什么是Redis? redis是一个key- ...

  8. Redis整合Spring结合使用缓存实例(三)

    一.Redis介绍 什么是Redis? redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set( ...

  9. 使用Redis在Hibernate中进行缓存

    Hibernate是Java编程语言的开放源代码,对象/关系映射框架.Hibernate的目标是帮助开发人员摆脱许多繁琐的手动数据处理任务.Hibernate能够在Java类和数据库表之间以及Java ...

随机推荐

  1. 5.3linux下C语言socket网络编程简例

    原创文章,转载请注明转载字样和出处,谢谢! 这里给出在Linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后 ...

  2. js 中继承的几种方式

    继承的方式一共有三种: 一.原型继承 通过prototype   来实现继承. function Person(name,age) { this.name=name; this.age=age; } ...

  3. [RK3288]PMU配置(RK808)【转】

    本文转载自:http://www.javashuo.com/content/p-6398007.html 硬件原理 pmic 电路原理 平台概述 RK808 PWM 介绍 驱动分析 dts 驱动流程 ...

  4. hdu 4300 Clairewd’s message(kmp/扩展kmp)

    题意:真难懂.. 给出26个英文字母的加密表,明文中的'a'会转为加密表中的第一个字母,'b'转为第二个,...依次类推. 然后第二行是一个字符串(str1),形式是密文+明文,其中密文一定完整,而明 ...

  5. hdu 1043 Eight(双向bfs)

    题意:经典八数码问题 思路:双向bfs ps:还有a*算法(还不会)等解法. 代码: #include<iostream> #include<stdio.h> #include ...

  6. jsch上传文件功能

    转载:http://www.cnblogs.com/longyg/archive/2012/06/25/2556576.html JSch是Java Secure Channel的缩写.JSch是一个 ...

  7. [POI 2014] Couriers

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3524 [算法] 首先离线 , 将询问按右端点排序 如果我们知道[l , r]这个区间 ...

  8. limit的用法

    limit子句可以用于强制select语句返回指定的记录数.limit接受一个或两个数字参数,参数必须是整数常量.如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最 ...

  9. Linux网络编程笔记(修订版)

    我的网络编程笔记, 因为最近又要做Linux下的网络编程,故重新修订, 其中一些内容参考了文末的链接及文章 1.   基本概念 2.   基本接口 2.1.   打开一个socket 2.2.   将 ...

  10. laravel5.2数据库基本操作

    laravel5.2数据库基本操作 百牛信息技术bainiu.ltd整理发布于博客园 use Illuminate\Database\Eloquent\Model; use Illuminate\Da ...