Springboot整合redis

  1. 注解方式使用Redis缓存

  • Pom.xml文件引入依赖

       org.springframework.boot

       spring-boot-starter-data-redis

  • application.properties中redis的配置

## Redis 配置

## Redis数据库索引(默认为0)

spring.redis.database=0

## Redis服务器地址

spring.redis.host=127.0.0.1

## Redis服务器连接端口

spring.redis.port=6379

## Redis服务器连接密码(默认为空)

spring.redis.password=

## 连接池最大连接数(使用负值表示没有限制)

spring.redis.jedis.pool.max-active=8

# 连接池最大阻塞等待时间(使用负值表示没有限制)

spring.redis.jedis.pool.max-wait=-1ms

# 连接池中的最大空闲连接

spring.redis.jedis.pool.max-idle=8

# 连接池中的最小空闲连接

spring.redis.jedis.pool.min-idle=0

# 连接超时时间(毫秒)

spring.redis.timeout=5000ms

  • 在启动类上加注解@EnableCaching

@SpringBootApplication

@EnableCaching

public class SellApplication {

    public static void main(String[] args) {

        SpringApplication.run(SellApplication.class, args);

    }

}

  • 在需要加缓存的方法上添加注解@Cacheable

@RequestMapping("getAllUsers")

@ResponseBody

@Cacheable(cacheNames = "user", key = "’allUsers’")

public List getAllUsers(){

  return userService.getAllUsers();

}

Ps:@Cacheable(cacheNames=”user”, key=”allUsers”)中的key=“allUsers”的双引号中需要加一个单引号key=”’allUsers’”

否则汇报错:Property or field 'allUsers' cannot be found on object of type 'org.springframework.cache.interceptor.CacheExpressionRootObject' - maybe not public or not valid?

  • pojo对象实现序列化

public class User implements Serializable {

    private static final long serialVersionUID = 2862072390536086881L;

    private Integer id;

    private String name;

    private String sex;

    private String phone;

    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 == null ? null : name.trim();

    }

    public String getSex() {

        return sex;

    }

    public void setSex(String sex) {

        this.sex = sex == null ? null : sex.trim();

    }

    public String getPhone() {

        return phone;

    }

    public void setPhone(String phone) {

        this.phone = phone == null ? null : phone.trim();

    }

}

 

Ps:idea使用GenerateSerialVersionUID插件的方法(pojo类实现Serializable接口后可快速生成serialVersionUID)

Springboot整合redis_第1张图片

如上图所示安装插件

Springboot整合redis_第2张图片

如上图所示,进入Default Settings,在Inspections设置页面中,勾选Serializable class without 'serialVersionUID',并且还可以在Severity中设置提示级别,如Warning、Error等,默认为Warning,也建议选择Warning级别的提示。

Springboot整合redis_第3张图片

如上图所示,创建一个类并实现Serializable接口,然后按alt+insert键,即可收到提示,然后选择SerialVersionUID:

2.RedisTemplate方式使用Redis缓存

  • Pom.xml引入依赖

Pom.xml引入的依赖和注解方式引入的依赖是一样的,如果已经引入这一步忽略。

       org.springframework.boot

       spring-boot-starter-data-redis

  • application.properties中redis的配置

 这一步和注解方式的一样,如果已经配置可以忽略。

## Redis 配置

## Redis数据库索引(默认为0)

spring.redis.database=0

## Redis服务器地址

spring.redis.host=127.0.0.1

## Redis服务器连接端口

spring.redis.port=6379

## Redis服务器连接密码(默认为空)

spring.redis.password=

## 连接池最大连接数(使用负值表示没有限制)

spring.redis.jedis.pool.max-active=8

# 连接池最大阻塞等待时间(使用负值表示没有限制)

spring.redis.jedis.pool.max-wait=-1ms

# 连接池中的最大空闲连接

spring.redis.jedis.pool.max-idle=8

# 连接池中的最小空闲连接

spring.redis.jedis.pool.min-idle=0

# 连接超时时间(毫秒)

spring.redis.timeout=5000ms

  • 配置RedisConfig

Spring帮助封装了RedisTemplate和StringRedisTemplate两个类链接reids,但是RedisTemplate的泛型是用着很不方便,手动配置一个RedisTemplate

@Configuration

public class RedisConfig {

    @Bean

    @SuppressWarnings("all")

    public RedisTemplate redisTemplate(RedisConnectionFactory factory) {

        RedisTemplate template = new RedisTemplate();

        template.setConnectionFactory(factory);

        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper om = new ObjectMapper();

        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

        jackson2JsonRedisSerializer.setObjectMapper(om);

        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

        // key采用String的序列化方式

        template.setKeySerializer(stringRedisSerializer);

        // hash的key也采用String的序列化方式

        template.setHashKeySerializer(stringRedisSerializer);

        // value序列化方式采用jackson

        template.setValueSerializer(jackson2JsonRedisSerializer);

        // hash的value序列化方式采用jackson

        template.setHashValueSerializer(jackson2JsonRedisSerializer);

        template.afterPropertiesSet();

        return template;

    }

  • 工具类RedisUtil

直接用RedisTemplate操作Redis,需要很多行代码,因此直接封装好一个RedisUtil,这样写代码更方便点。这个RedisUtil交给Spring容器实例化,使用时直接注解注入。

@Component

public class RedisUtil {

    @Autowired

    private RedisTemplate redisTemplate;

// =============================common============================

 

    /**

     * 指定缓存失效时间

     *

     * @param key  键

     * @param time 时间(秒)

     * @return

     */

    public boolean expire(String key, long time) {

        try {

            if (time > 0) {

                redisTemplate.expire(key, time, TimeUnit.SECONDS);

            }

            return true;

        } catch (Exception e) {

            e.printStackTrace();

            return false;

        }

    }

 

    /**

     * 根据key 获取过期时间

     *

     * @param key 键 不能为null

     * @return 时间(秒) 返回0代表为永久有效

     */

    public long getExpire(String key) {

        return redisTemplate.getExpire(key, TimeUnit.SECONDS);

    }

 

    /**

     * 判断key是否存在

     *

     * @param key 键

     * @return true 存在 false不存在

     */

    public boolean hasKey(String key) {

        try {

            return redisTemplate.hasKey(key);

        } catch (Exception e) {

            e.printStackTrace();

            return false;

        }

    }

 

    /**

     * 删除缓存

     *

     * @param key 可以传一个值 或多个

     */

    @SuppressWarnings("unchecked")

    public void del(String... key) {

        if (key != null && key.length > 0) {

            if (key.length == 1) {

                redisTemplate.delete(key[0]);

            } else {

                redisTemplate.delete(CollectionUtils.arrayToList(key));

            }

        }

    }

// ============================String=============================

 

    /**

     * 普通缓存获取

     *

     * @param key 键

     * @return 值

     */

    public Object get(String key) {

        return key == null ? null : redisTemplate.opsForValue().get(key);

    }

 

    /**

     * 普通缓存放入

     *

     * @param key   键

     * @param value 值

     * @return true成功 false失败

     */

    public boolean set(String key, Object value) {

        try {

            redisTemplate.opsForValue().set(key, value);

            return true;

        } catch (Exception e) {

            e.printStackTrace();

            return false;

        }

    }

 

    /**

     * 普通缓存放入并设置时间

     *

     * @param key   键

     * @param value 值

     * @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期

     * @return true成功 false 失败

     */

    public boolean set(String key, Object value, long time) {

        try {

            if (time > 0) {

                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);

            } else {

                set(key, value);

            }

            return true;

        } catch (Exception e) {

            e.printStackTrace();

            return false;

        }

    }

 

    /**

     * 递增

     *

     * @param key   键

     * @param delta 要增加几(大于0)

     * @return

     */

    public long incr(String key, long delta) {

        if (delta < 0) {

            throw new RuntimeException("递增因子必须大于0");

        }

        return redisTemplate.opsForValue().increment(key, delta);

    }

 

    /**

     * 递减

     *

     * @param key   键

     * @param delta 要减少几(小于0)

     * @return

     */

    public long decr(String key, long delta) {

        if (delta < 0) {

            throw new RuntimeException("递减因子必须大于0");

        }

        return redisTemplate.opsForValue().increment(key, -delta);

    }

// ================================Map=================================

 

    /**

     * HashGet

     *

     * @param key  键 不能为null

     * @param item 项 不能为null

     * @return 值

     */

    public Object hget(String key, String item) {

        return redisTemplate.opsForHash().get(key, item);

    }

 

    /**

     * 获取hashKey对应的所有键值

     *

     * @param key 键

     * @return 对应的多个键值

     */

    public Map hmget(String key) {

        return redisTemplate.opsForHash().entries(key);

    }

 

    /**

     * HashSet

     *

     * @param key 键

     * @param map 对应多个键值

     * @return true 成功 false 失败

     */

    public boolean hmset(String key, Map map) {

        try {

            redisTemplate.opsForHash().putAll(key, map);

            return true;

        } catch (Exception e) {

            e.printStackTrace();

            return false;

        }

    }

 

    /**

     * HashSet 并设置时间

     *

     * @param key  键

     * @param map  对应多个键值

     * @param time 时间(秒)

     * @return true成功 false失败

     */

    public boolean hmset(String key, Map map, long time) {

        try {

            redisTemplate.opsForHash().putAll(key, map);

            if (time > 0) {

                expire(key, time);

            }

            return true;

        } catch (Exception e) {

            e.printStackTrace();

            return false;

        }

    }

 

    /**

     * 向一张hash表中放入数据,如果不存在将创建

     *

     * @param key   键

     * @param item  项

     * @param value 值

     * @return true 成功 false失败

     */

    public boolean hset(String key, String item, Object value) {

        try {

            redisTemplate.opsForHash().put(key, item, value);

            return true;

        } catch (Exception e) {

            e.printStackTrace();

            return false;

        }

    }

 

    /**

     * 向一张hash表中放入数据,如果不存在将创建

     *

     * @param key   键

     * @param item  项

     * @param value 值

     * @param time  时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间

     * @return true 成功 false失败

     */

    public boolean hset(String key, String item, Object value, long time) {

        try {

            redisTemplate.opsForHash().put(key, item, value);

            if (time > 0) {

                expire(key, time);

            }

            return true;

        } catch (Exception e) {

            e.printStackTrace();

            return false;

        }

    }

 

    /**

     * 删除hash表中的值

     *

     * @param key  键 不能为null

     * @param item 项 可以使多个 不能为null

     */

    public void hdel(String key, Object... item) {

        redisTemplate.opsForHash().delete(key, item);

    }

 

    /**

     * 判断hash表中是否有该项的值

     *

     * @param key  键 不能为null

     * @param item 项 不能为null

     * @return true 存在 false不存在

     */

    public boolean hHasKey(String key, String item) {

        return redisTemplate.opsForHash().hasKey(key, item);

    }

 

    /**

     * hash递增 如果不存在,就会创建一个 并把新增后的值返回

     *

     * @param key  键

     * @param item 项

     * @param by   要增加几(大于0)

     * @return

     */

    public double hincr(String key, String item, double by) {

        return redisTemplate.opsForHash().increment(key, item, by);

    }

 

    /**

     * hash递减

     *

     * @param key  键

     * @param item 项

     * @param by   要减少记(小于0)

     * @return

     */

    public double hdecr(String key, String item, double by) {

        return redisTemplate.opsForHash().increment(key, item, -by);

    }

// ============================set=============================

 

    /**

     * 根据key获取Set中的所有值

     *

     * @param key 键

     * @return

     */

    public Set sGet(String key) {

        try {

            return redisTemplate.opsForSet().members(key);

        } catch (Exception e) {

            e.printStackTrace();

            return null;

        }

    }

 

    /**

     * 根据value从一个set中查询,是否存在

     *

     * @param key   键

     * @param value 值

     * @return true 存在 false不存在

     */

    public boolean sHasKey(String key, Object value) {

        try {

            return redisTemplate.opsForSet().isMember(key, value);

        } catch (Exception e) {

            e.printStackTrace();

            return false;

        }

    }

 

    /**

     * 将数据放入set缓存

     *

     * @param key    键

     * @param values 值 可以是多个

     * @return 成功个数

     */

    public long sSet(String key, Object... values) {

        try {

            return redisTemplate.opsForSet().add(key, values);

        } catch (Exception e) {

            e.printStackTrace();

            return 0;

        }

    }

 

    /**

     * 将set数据放入缓存

     *

     * @param key    键

     * @param time   时间(秒)

     * @param values 值 可以是多个

     * @return 成功个数

     */

    public long sSetAndTime(String key, long time, Object... values) {

        try {

            Long count = redisTemplate.opsForSet().add(key, values);

            if (time > 0)

                expire(key, time);

            return count;

        } catch (Exception e) {

            e.printStackTrace();

            return 0;

        }

    }

 

    /**

     * 获取set缓存的长度

     *

     * @param key 键

     * @return

     */

    public long sGetSetSize(String key) {

        try {

            return redisTemplate.opsForSet().size(key);

        } catch (Exception e) {

            e.printStackTrace();

            return 0;

        }

    }

 

    /**

     * 移除值为value的

     *

     * @param key    键

     * @param values 值 可以是多个

     * @return 移除的个数

     */

    public long setRemove(String key, Object... values) {

        try {

            Long count = redisTemplate.opsForSet().remove(key, values);

            return count;

        } catch (Exception e) {

            e.printStackTrace();

            return 0;

        }

    }

// ===============================list=================================

 

    /**

     * 获取list缓存的内容

     *

     * @param key   键

     * @param start 开始

     * @param end   结束 0 到 -1代表所有值

     * @return

     */

    public List lGet(String key, long start, long end) {

        try {

            return redisTemplate.opsForList().range(key, start, end);

        } catch (Exception e) {

            e.printStackTrace();

            return null;

        }

    }

 

    /**

     * 获取list缓存的长度

     *

     * @param key 键

     * @return

     */

    public long lGetListSize(String key) {

        try {

            return redisTemplate.opsForList().size(key);

        } catch (Exception e) {

            e.printStackTrace();

            return 0;

        }

    }

 

    /**

     * 通过索引 获取list中的值

     *

     * @param key   键

     * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推

     * @return

     */

    public Object lGetIndex(String key, long index) {

        try {

            return redisTemplate.opsForList().index(key, index);

        } catch (Exception e) {

            e.printStackTrace();

            return null;

        }

    }

 

    /**

     * 将list放入缓存

     *

     * @param key   键

     * @param value 值

     * @return

     */

    public boolean lSet(String key, Object value) {

        try {

            redisTemplate.opsForList().rightPush(key, value);

            return true;

        } catch (Exception e) {

            e.printStackTrace();

            return false;

        }

    }

 

    /**

     * 将list放入缓存

     *

     * @param key   键

     * @param value 值

     * @param time  时间(秒)

     * @return

     */

    public boolean lSet(String key, Object value, long time) {

        try {

            redisTemplate.opsForList().rightPush(key, value);

            if (time > 0)

                expire(key, time);

            return true;

        } catch (Exception e) {

            e.printStackTrace();

            return false;

        }

    }

 

    /**

     * 将list放入缓存

     *

     * @param key   键

     * @param value 值

     * @return

     */

    public boolean lSet(String key, List value) {

        try {

            redisTemplate.opsForList().rightPushAll(key, value);

            return true;

        } catch (Exception e) {

            e.printStackTrace();

            return false;

        }

    }

 

    /**

     * 将list放入缓存

     *

     * @param key   键

     * @param value 值

     * @param time  时间(秒)

     * @return

     */

    public boolean lSet(String key, List value, long time) {

        try {

            redisTemplate.opsForList().rightPushAll(key, value);

            if (time > 0)

                expire(key, time);

            return true;

        } catch (Exception e) {

            e.printStackTrace();

            return false;

        }

    }

 

    /**

     * 根据索引修改list中的某条数据

     *

     * @param key   键

     * @param index 索引

     * @param value 值

     * @return

     */

    public boolean lUpdateIndex(String key, long index, Object value) {

        try {

            redisTemplate.opsForList().set(key, index, value);

            return true;

        } catch (Exception e) {

            e.printStackTrace();

            return false;

        }

    }

 

    /**

     * 移除N个值为value

     *

     * @param key   键

     * @param count 移除多少个

     * @param value 值

     * @return 移除的个数

     */

    public long lRemove(String key, long count, Object value) {

        try {

            Long remove = redisTemplate.opsForList().remove(key, count, value);

            return remove;

        } catch (Exception e) {

            e.printStackTrace();

            return 0;

        }

    }

 

}

  • Controller代码

写个controller方法进行测试

@RequestMapping("save")

    @ResponseBody

    public String save() {

        //保存字符串

        stringRedisTemplate.opsForValue().set("用户", "小明");

        redisUtil.set("哈哈", "嘿嘿");

        // 保存对象

        User user = new User("钢铁侠", "134");

//        redisTemplate.opsForValue().set(user.getName(), user);

        redisUtil.set(user.getName(), user);

 

        user = new User("美国队长", "136");

//        redisTemplate.opsForValue().set(user.getName(), user);

        redisUtil.set(user.getName(), user);

 

        user = new User("斯嘉丽", "138");

//        redisTemplate.opsForValue().set(user.getName(), user);

        redisUtil.set(user.getName(), user);

        return "success";

    }

 

    @RequestMapping("delete")

    @ResponseBody

    public String delete(){

//        stringRedisTemplate.delete("用户");

        redisUtil.del("哈哈");

        // 保存对象

        User user = new User("钢铁侠", "134");

//        redisTemplate.delete(user.getName());

        redisUtil.del(user.getName());

        user = new User("美国队长", "136");

//        redisTemplate.delete(user.getName());

        redisUtil.del(user.getName());

        user = new User("斯嘉丽", "138");

//        redisTemplate.delete(user.getName());

        redisUtil.del(user.getName());

        return "success";

    }

 

你可能感兴趣的:(springcloud)