Spring Boot學習筆記(十四)Spring Boot Redis 數據緩存實例

Spring Boot Redis 數據緩存實例

  • 這節我就不逼逼了, 直接上代碼

  • 訪問 https://start.spring.io/ 生成項目壓縮包在這裏插入圖片描述

  • 解壓後用IDEA打開, 項目結構如下
    在這裏插入圖片描述

  • pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.8.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>wen</groupId>
        <artifactId>datacache</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>datacache</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-cache</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.47</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-redis</artifactId>
            </dependency>
    
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
            </dependency>
    
            <dependency>
                <groupId>io.lettuce</groupId>
                <artifactId>lettuce-core</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-pool2</artifactId>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    
  • 配置文件:logback.xml

    <configuration scan="true">
        <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
            <encoder charset="UTF-8">
                <pattern>
                    [%thread] %highlight(%-5level) %cyan(%logger{15}) - %highlight(%msg) %n
                </pattern>
            </encoder>
        </appender>
        <root level="INFO">
            <appender-ref ref="stdout"/>
        </root>
        <logger name="wen.datacache" level="DEBUG"/>
    </configuration>
    
  • application.properties

    logging.config=classpath:logback.xml
    server.port=8080
    server.servlet.session.timeout=1800
    server.max-http-header-size=20971520
    # redis
    # Redis數據庫索引(默認爲0)
    spring.redis.database=0
    # Redis服務器地址
    spring.redis.host=localhost
    # Redis服務器連接端口
    spring.redis.port=6379
    # Redis服務器連接密碼(默認爲空)
    spring.redis.password=
    # 連接池最大連接數(使用負值表示沒有限制)
    spring.redis.jedis.pool.max-active=8
    # 連接池最大阻塞等待時間(使用負值表示沒有限制)
    spring.redis.jedis.pool.max-wait=-1
    # 連接池中的最大空閒連接
    spring.redis.jedis.pool.max-idle=8
    # 連接池中的最小空閒連接
    spring.redis.jedis.pool.min-idle=0
    # 連接超時時間(毫秒)
    spring.redis.timeout=6000
    # 連接池最大連接數(使用負值表示沒有限制) 默認 8
    spring.redis.lettuce.pool.max-active=8
    # 連接池最大阻塞等待時間(使用負值表示沒有限制) 默認 -1
    spring.redis.lettuce.pool.max-wait=-1
    # 連接池中的最大空閒連接 默認 8
    spring.redis.lettuce.pool.max-idle=8
    # 連接池中的最小空閒連接 默認 0
    spring.redis.lettuce.pool.min-idle=0
    
  • 啓動類:

    package wen.datacache;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
    import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
    import org.springframework.cache.annotation.EnableCaching;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.EnableScheduling;
    
    @Configuration
    @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
    @ComponentScan("wen.datacache")
    @EnableCaching
    @EnableScheduling
    public class DatacacheApplication {
    
        public static void main(String[] args) throws Exception {
            SpringApplication.run(DatacacheApplication.class, args);
        }
    
    }
    
    
  • 實體類:CityInfo.java

    package wen.datacache.entity;
    
    import java.io.Serializable;
    
    public class CityInfo implements Serializable {
    
        private int id;
    
        private String city;
    
        public CityInfo() {
    
        }
    
        public CityInfo(int id, String city) {
            this.id = id;
            this.city = city;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getCity() {
            return city;
        }
    
        public void setCity(String city) {
            this.city = city;
        }
    }
    
    
  • 定義接口 RedisMapper.java

    package wen.datacache.mapper;
    
    import org.springframework.data.redis.core.ListOperations;
    import java.util.List;
    import java.util.Set;
    
    public interface RedisMapper {
    
        boolean cacheValue(String k, String v, Long time);
    
        boolean cacheValue(String k, String v);
    
        boolean containsValueKey(String k);
    
        boolean containsSetKey(String k);
    
        boolean containsListKey(String k);
    
        boolean containsKey(String k);
    
        String getValue(String k);
    
        boolean removeValue(String k);
    
        boolean removeSet(String k);
    
        boolean removeList(String k);
    
        boolean cacheSet(String k, String v, long time);
    
        boolean cacheSet(String k, String v);
    
        boolean cacheSet(String k, Set<String> v, long time);
    
        boolean cacheSet(String k, Set<String> v);
    
        Set<String> getSet(String k);
    
        boolean cacheList(String k, String v, long time);
    
        boolean cacheList(String k, String v);
    
        boolean cacheList(String k, List<String> v, long time);
    
        boolean cacheList(String k, List<String> v);
    
        List<String> getList(String k, long start, long end);
    
        long getListSize(String k);
    
        long getListSize(ListOperations<String, String> listOps, String k);
    
        boolean removeOneOfList(String k);
    }
    
    
  • RedisMapperImpl.java, 實現類記得加上@Repository 註解

    package wen.datacache.mapper.impl;
    
    import wen.datacache.mapper.RedisMapper;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.ListOperations;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.SetOperations;
    import org.springframework.data.redis.core.ValueOperations;
    import org.springframework.stereotype.Repository;
    
    import java.util.List;
    import java.util.Set;
    import java.util.concurrent.TimeUnit;
    
    @Repository
    public class RedisMapperImpl implements RedisMapper {
    
        private static final String KEY_PREFIX_VALUE = "wen:datacache:value:";
        private static final String KEY_PREFIX_SET = "wen:datacache:set:";
        private static final String KEY_PREFIX_LIST = "wen:datacache:list:";
    
        private final RedisTemplate<String, String> redisTemplate;
    
        private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
    
        @Autowired
        public RedisMapperImpl(RedisTemplate<String, String> redisTemplate) {
            this.redisTemplate = redisTemplate;
        }
    
        @Override
        public boolean cacheValue(String k, String v, Long time) {
            String key = KEY_PREFIX_VALUE + k;
            try {
                ValueOperations<String, String> valueOps = redisTemplate.opsForValue();
                valueOps.set(key, v);
                if (time > 0) {
                    redisTemplate.expire(key, time, TimeUnit.SECONDS);
                }
                return true;
            } catch (Throwable t) {
                LOGGER.error("緩存[" + key + "]失敗, value[" + v + "]", t);
            }
            return false;
        }
    
        @Override
        public boolean cacheValue(String k, String v) {
            return cacheValue(k, v, -1L);
        }
    
        @Override
        public boolean containsValueKey(String k) {
            return containsKey(KEY_PREFIX_VALUE + k);
        }
    
        @Override
        public boolean containsSetKey(String k) {
            return containsKey(KEY_PREFIX_SET + k);
        }
    
        @Override
        public boolean containsListKey(String k) {
            return containsKey(KEY_PREFIX_LIST + k);
        }
    
        @Override
        public boolean containsKey(String k) {
            try {
                return redisTemplate.hasKey(k);
            } catch (Throwable t) {
                LOGGER.error("判斷緩存存在失敗key[" + k + ", Code or[" + t + "]");
            }
            return false;
        }
    
        @Override
        public String getValue(String k) {
            try {
                ValueOperations<String, String> valueOps = redisTemplate.opsForValue();
                return valueOps.get(KEY_PREFIX_VALUE + k);
            } catch (Throwable t) {
                LOGGER.error("獲取緩存失敗key[" + KEY_PREFIX_VALUE + k + ", Code or[" + t + "]");
            }
            return null;
        }
    
        @Override
        public boolean removeValue(String k) {
            return remove(KEY_PREFIX_VALUE + k);
        }
    
        @Override
        public boolean removeSet(String k) {
            return remove(KEY_PREFIX_SET + k);
        }
    
        @Override
        public boolean removeList(String k) {
            return remove(KEY_PREFIX_LIST + k);
        }
    
        @Override
        public boolean cacheSet(String k, String v, long time) {
            String key = KEY_PREFIX_SET + k;
            try {
                SetOperations<String, String> setOps = redisTemplate.opsForSet();
                setOps.add(key, v);
                if (time > 0) {
                    redisTemplate.expire(key, time, TimeUnit.SECONDS);
                }
                return true;
            } catch (Throwable t) {
                LOGGER.error("緩存[" + key + "]失敗, value[" + v + "]", t);
            }
            return false;
        }
    
        @Override
        public boolean cacheSet(String k, String v) {
            return cacheSet(k, v, -1);
        }
    
        @Override
        public boolean cacheSet(String k, Set<String> v, long time) {
            String key = KEY_PREFIX_SET + k;
            try {
                SetOperations<String, String> setOps = redisTemplate.opsForSet();
                setOps.add(key, v.toArray(new String[v.size()]));
                if (time > 0) {
                    redisTemplate.expire(key, time, TimeUnit.SECONDS);
                }
                return true;
            } catch (Throwable t) {
                LOGGER.error("緩存[" + key + "]失敗, value[" + v + "]", t);
            }
            return false;
        }
    
        @Override
        public boolean cacheSet(String k, Set<String> v) {
            return cacheSet(k, v, -1);
        }
    
        @Override
        public Set<String> getSet(String k) {
            try {
                SetOperations<String, String> setOps = redisTemplate.opsForSet();
                return setOps.members(KEY_PREFIX_SET + k);
            } catch (Throwable t) {
                LOGGER.error("獲取set緩存失敗key[" + KEY_PREFIX_SET + k + ", Codeor[" + t + "]");
            }
            return null;
        }
    
        @Override
        public boolean cacheList(String k, String v, long time) {
            String key = KEY_PREFIX_LIST + k;
            try {
                ListOperations<String, String> listOps = redisTemplate.opsForList();
                listOps.rightPush(key, v);
                if (time > 0) {
                    redisTemplate.expire(key, time, TimeUnit.SECONDS);
                }
                return true;
            } catch (Throwable t) {
                LOGGER.error("緩存[" + key + "]失敗, value[" + v + "]", t);
            }
            return false;
        }
    
        @Override
        public boolean cacheList(String k, String v) {
            return cacheList(k, v, -1);
        }
    
        @Override
        public boolean cacheList(String k, List<String> v, long time) {
            String key = KEY_PREFIX_LIST + k;
            try {
                ListOperations<String, String> listOps = redisTemplate.opsForList();
                listOps.rightPushAll(key, v);
                if (time > 0) {
                    redisTemplate.expire(key, time, TimeUnit.SECONDS);
                }
                return true;
            } catch (Throwable t) {
                LOGGER.error("緩存[" + key + "]失敗, value[" + v + "]", t);
            }
            return false;
        }
    
        @Override
        public boolean cacheList(String k, List<String> v) {
            return cacheList(k, v, -1);
        }
    
        @Override
        public List<String> getList(String k, long start, long end) {
            try {
                ListOperations<String, String> listOps = redisTemplate.opsForList();
                return listOps.range(KEY_PREFIX_LIST + k, start, end);
            } catch (Throwable t) {
                LOGGER.error("獲取list緩存失敗key[" + KEY_PREFIX_LIST + k + ", Code or[" + t + "]");
            }
            return null;
        }
    
        @Override
        public long getListSize(String k) {
            try {
                ListOperations<String, String> listOps = redisTemplate.opsForList();
                return listOps.size(KEY_PREFIX_LIST + k) + 1;
            } catch (Throwable t) {
                LOGGER.error("獲取list長度失敗key[" + KEY_PREFIX_LIST + k + "], Code or[" + t + "]");
            }
            return 0;
        }
    
        @Override
        public long getListSize(ListOperations<String, String> listOps, String k) {
            try {
                return listOps.size(KEY_PREFIX_LIST + k);
            } catch (Throwable t) {
                LOGGER.error("獲取list長度失敗key[" + KEY_PREFIX_LIST + k + "], Code or[" + t + "]");
            }
            return 0;
        }
    
        @Override
        public boolean removeOneOfList(String k) {
            String key = KEY_PREFIX_LIST + k;
            try {
                ListOperations<String, String> listOps = redisTemplate.opsForList();
                listOps.rightPop(key);
                return true;
            } catch (Throwable t) {
                LOGGER.error("移除list緩存失敗key[" + KEY_PREFIX_LIST + k + ", Code or[" + t + "]");
            }
            return false;
        }
    
        private boolean remove(String k) {
            try {
                redisTemplate.delete(k);
                return true;
            } catch (Throwable t) {
                LOGGER.error("獲取緩存失敗key[" + k + ", Code or[" + t + "]");
            }
            return false;
        }
    }
    
    
  • CityService.java

    package wen.datacache.service;
    
    import org.springframework.cache.annotation.CacheConfig;
    import org.springframework.cache.annotation.Cacheable;
    import org.springframework.stereotype.Component;
    import wen.datacache.entity.CityInfo;
    
    @Component
    @CacheConfig(cacheNames = "CityService")
    public class CityService {
    
        @Cacheable
        public CityInfo getCity(int id, String city) {
            return new CityInfo(id, city);
        }
    }
    
    
  • CityInfoController.java

    package wen.datacache.web;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    import wen.datacache.mapper.RedisMapper;
    
    @RestController
    @RequestMapping("/redis")
    public class CityInfoController {
    
        private RedisMapper redisMapper;
    
        @Autowired
        public CityInfoController(RedisMapper redisMapper) {
            this.redisMapper = redisMapper;
        }
    
        @RequestMapping(value = "get/{key}", method = RequestMethod.GET)
        public String find(@PathVariable("key") String key) {
            return redisMapper.getValue(key);
        }
    
        @RequestMapping(value = "add/{key}/{value}", method = RequestMethod.GET)
        public Boolean add(@PathVariable("key") String key, @PathVariable("value") String value) {
            return redisMapper.cacheValue(key, value);
        }
    
        @RequestMapping(value = "del/{key}", method = RequestMethod.GET)
        public Boolean del(@PathVariable("key") String key) {
            return redisMapper.removeValue(key);
        }
    
        @RequestMapping(value = "count/{key}", method = RequestMethod.GET)
        public Long count(@PathVariable("key") String key) {
            return redisMapper.getListSize(key);
        }
    }
    
    
  • 開啓項目
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述

  • 項目源碼:https://github.com/StephaineWYT/datacache
    下一篇:Spring Boot學習筆記(十五)Spring Boot Session共享實例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章