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


    分布式数据存储 之 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"}"
    
    把曾经失去的全部补回来! ---一位在“生死边缘”徘徊的JAVA程序猿
  • 相关阅读:
    java 使用jsch 远程链接linux执行命令
    Scott Mitchell 的ASP.NET 2.0数据教程之十三:在DetailsView控件中使用TemplateField
    Scott Mitchell 的ASP.NET 2.0数据教程之二十二:为删除数据添加客户端确认
    左边有个treeviwe控件,点击tree控件的一个节点右面进入相应的网页
    Scott Mitchell 的ASP.NET 2.0数据教程之二十三:基于用户对修改数据进行限制
    Scott Mitchell 的ASP.NET 2.0数据教程之十九:给新增、编辑界面增加验证控件 (翻译)
    Scott Mitchell 的ASP.NET 2.0数据教程之十二:在GridView控件中使用TemplateField
    Scott Mitchell 的ASP.NET 2.0数据教程之二十定制数据修改界面
    Scott Mitchell 的ASP.NET 2.0数据教程之十四:使用FormView 的模板
    Scott Mitchell 的ASP.NET 2.0数据教程之二十一:: 实现开放式并发
  • 原文地址:https://www.cnblogs.com/shi-tian/p/10827591.html
Copyright © 2020-2023  润新知