文章目录

  • 一、导入依赖
  • 二、redis相关配置
  • 三、案例
  • 3.1、定义redis基本操作接口
  • 3.2、定义功能实现类
  • 3.3、创建前端控制器
  • 四、项目中应用引导
  • 4.1、查询操作
  • 4.2、更新缓存
  • 4.2.1、添加广告
  • 4.2.2、修改广告
  • 4.2.3、删除广告



redis安装:


一、导入依赖

<!--redis依赖配置-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

二、redis相关配置

spring:
  redis:
    host: 192.168.209.136 # Redis服务器地址
    database: 0 # Redis数据库索引(默认为0)
    port: 6379 # Redis服务器连接端口
    password: 123456 # Redis服务器连接密码(默认为空)
    jedis:
      pool:
        max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
        max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-idle: 8 # 连接池中的最大空闲连接
        min-idle: 0 # 连接池中的最小空闲连接
    timeout: 3000ms # 连接超时时间(毫秒)

三、案例

3.1、定义redis基本操作接口

package com.redis.service;

import java.util.List;
import java.util.Map;

/**
 * redis操作Service,
 * 对象和数组都以json形式进行存储
 * @author GL
 * @create 2019-12-02 10:19
 */
public interface RedisService {

    /******************     值类型     *****************************/
    /**
     * 存储数据
     */
    void setValue(String key, String value);

    /**
     * 获取数据
     */
    String getValue(String key);

    /**
     * 设置超期时间
     */
    boolean expire(String key, long expire);

    /**
     * 删除数据
     */
    void remove(String key);

    /**
     * 自增操作
     * @param key key值
     * @param delta 自增长步数
     * @return
     */
    Long increment(String key, long delta);

    /******************     list集合类型     *****************************/
    /***
     * 右压栈
     * @param key key值
     * @param value value值
     */
    void rightListSetValue(String key,String ... value);

    /***
     * 显示右压栈
     * @param key key值
     * @param page 查询的页数
     * @param size 每页显示的条数
     * @return
     */
    Object rightListGetValue(String key,Integer page,Integer size);

    /**
     * 左压栈
     * @param key
     * @param value
     */
    void  leftListSetValue(String key,String ... value);

    /**
     * 显示左压栈
     * @param key key值
     * @param page 查询的页码数
     * @param size 每页吸显示的条数
     * @return
     */
    List<String> leftListGetValue(String key, Integer page, Integer size);

    /******************     Set集合类型     *****************************/
    /**
     * 添加值
     * @param key key值
     * @param value value值
     */
    Long setSave(String key, String ... value);

    /**
     * 根据key查询value
     * @param key
     * @return
     */
    Object getFind(String key);

    /**
     * 指定大key和小key删除
     * @param bigKey 大key
     * @param key 小key
     * @return
     */
    Long deleteValue(String bigKey,Object ... key);

    /**
     * 全部删除
     * @param key
     */
    Boolean deleteAllValue(String key);
    /******************     Hash集合类型     *****************************/

    /**
     * 保存hash值
     * @param key 大key
     * @param var1 小key
     * @param var2 小value
     */
    void setHashValue(String key, Object var1, Object var2);

    /***
     * 大key中保存map集合
     * @param key 大key
     * @param map map集合
     */
    void setHashMap(String key, Map<String,Object> map);
    /**
     * 根据大key获取所有的小key
     * <p>
     *     小key表示某个大key中保存着无数个key——value的值,
     *     例如:redisTemplate.boundHashOps("namehash").put("a", "abc");
     *     这里的namehash表示大key,而这个大key中保存着一个hash,key:a,value:abc,而小key就表示这里的a
     * </p>
     * @param key
     * @return
     */
    Object getHashKeys(String key);

    /**
     * 根据大key获取所有的小key值
     * @param key 大key
     * @return
     */
    Object getHashAllValue(String key);

    /**
     * 根据大key和小key获取小key的值。
     * <u>因为这里需要指定大的范围,才能够精确定位到具体小key的位置。</u>
     * @param bigKey 大key
     * @param key 小key
     * @return
     */
    Object getHashValueByKey(String bigKey,String key);

    /**
     * 指定大key和小key删除小key的值
     * @param bigKey
     * @param key
     */
    Long removeValueByKey(String bigKey,String ... key);
}

3.2、定义功能实现类

package com.redis.service.impl;

import com.redis.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * redis操作Service的实现类
 * @author GL
 * @create 2019-12-02 10:20
 */
@Service
public class RedisServiceImpl implements RedisService {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /******************     值类型     *****************************/
    /**
     * 存储数据
     */
    @Override
    public void setValue(String key, String value) {
        stringRedisTemplate.opsForValue().set(key, value);
    }

    /**
     * 获取数据
     */
    @Override
    public String getValue(String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }

    /**
     * 设置超期时间
     */
    @Override
    public boolean expire(String key, long expire) {
        return stringRedisTemplate.expire(key, expire, TimeUnit.SECONDS);
    }

    /**
     * 删除数据
     */
    @Override
    public void remove(String key) {
        stringRedisTemplate.delete(key);
    }

    /**
     * 自增操作
     * @param key key值
     * @param delta 自增长步数
     * @return
     */
    @Override
    public Long increment(String key, long delta) {
        return stringRedisTemplate.opsForValue().increment(key,delta);
    }

    /******************     list集合类型     *****************************/
    /***
     * 右压栈
     * @param key key值
     * @param value value值
     */
    @Override
    public void rightListSetValue(String key, String ... value) {
        stringRedisTemplate.boundListOps(key).rightPushAll(value);
    }

    /***
     * 显示右压栈
     * @param key key值
     * @param page 查询的页数
     * @param size 每页显示的条数
     * @return
     */
    @Override
    public Object rightListGetValue(String key, Integer page, Integer size) {
        return stringRedisTemplate.boundListOps(key).range(page,size);
    }

    /**
     * 左压栈
     * @param key
     * @param value
     */
    @Override
    public void leftListSetValue(String key, String ... value) {
        stringRedisTemplate.boundListOps(key).leftPushAll(value);
    }

    /**
     * 显示左压栈
     * @param key key值
     * @param page 查询的页码数
     * @param size 每页吸显示的条数
     * @return
     */
    @Override
    public List<String> leftListGetValue(String key, Integer page, Integer size) {
        return stringRedisTemplate.boundListOps(key).range(page,size);
    }

    /******************     Set集合类型     *****************************/
    /**
     * 添加值
     * @param key key值
     * @param value value值
     */
    @Override
    public Long setSave(String key, String ... value) {
        return stringRedisTemplate.boundSetOps(key).add(value);
    }

    /**
     * 根据key查询value
     * @param key
     * @return
     */
    @Override
    public Set<String> getFind(String key) {
        return stringRedisTemplate.boundSetOps(key).members();
    }

    /**
     * 根据key删除
     * @param key
     */
    @Override
    public Long deleteValue(String bigKey, Object ... key) {
        return stringRedisTemplate.boundSetOps(bigKey).remove(key);
    }

    /**
     * 全部删除
     */
    @Override
    public Boolean deleteAllValue(String key) {
        return stringRedisTemplate.delete(key);
    }

    /******************     Hash集合类型     *****************************/
    /**
     * 保存hash值
     * @param key 大key
     * @param var1 小key
     * @param var2 小value
     */
    @Override
    public void setHashValue(String key, Object var1, Object var2) {
        stringRedisTemplate.boundHashOps(key).put(var1,var2);
    }

    /***
     * 大key中保存map集合
     * @param key 大key
     * @param map map集合
     */
    @Override
    public void setHashMap(String key, Map<String,Object> map){
        stringRedisTemplate.boundHashOps(key).putAll(map);
    }

    /**
     * 根据大key获取所有的小key
     * <p>
     *     小key表示某个大key中保存着无数个key——value的值,
     *     例如:redisTemplate.boundHashOps("namehash").put("a", "abc");
     *     这里的namehash表示大key,而这个大key中保存着一个hash,key:a,value:abc,而小key就表示这里的a
     * </p>
     * @param key
     * @return
     */
    @Override
    public Set<Object> getHashKeys(String key) {
        return stringRedisTemplate.boundHashOps(key).keys();
    }

    /**
     * 根据大key获取所有的小key值
     * @param key 大key
     * @return
     */
    @Override
    public List<Object> getHashAllValue(String key) {
        return stringRedisTemplate.boundHashOps(key).values();
    }

    /**
     * 根据大key和小key获取小key的值。
     * <u>因为这里需要指定大的范围,才能够精确定位到具体小key的位置。</u>
     * @param bigKey 大key
     * @param key 小key
     * @return
     */
    @Override
    public Object getHashValueByKey(String bigKey, String key) {
        return stringRedisTemplate.boundHashOps(bigKey).get(key);
    }

    /**
     * 指定大key和小key删除小key的值
     * @param bigKey
     * @param key
     */
    @Override
    public Long removeValueByKey(String bigKey, String ... key) {
        return stringRedisTemplate.boundHashOps(bigKey).delete(key);
    }
}

3.3、创建前端控制器

package com.redis.controller;

import com.redis.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author GL
 * @create 2019-12-02 10:23
 */
@RestController
public class RedisController {

    @Autowired
    private RedisService redisService;

    /******************     值类型     *****************************/

    @PostMapping("/save")
    public void save(String key,String value){
        redisService.setValue(key,value);
    }
    @GetMapping("/get")
    public Object KeyGetValue(String key){
        return redisService.getValue(key);
    }
    @DeleteMapping("/delete")
    public void remove(String  key){
        redisService.remove(key);
    }
    /******************     list集合类型     *****************************/
    //略
    /******************     Set集合类型     *****************************/
    //略
    /******************     Hash集合类型     *****************************/
}

不要让懒惰限制你的想象,这是简单的使用,还有可以更深层的封装,可以redis分布式锁实现等等。

四、项目中应用引导

该项目引导将广告表作为案例

4.1、查询操作

思路:先查询redis,没有查询到数据在去查询数据库。

@Autowired
private RedisTemplate redisTemplate;
@Override
public List<TbContent> findByCategoryId(Long categoryId) {
    //根据key查询value值
    List<TbContent> contentList= (List<TbContent>) redisTemplate.boundHashOps("content").get(categoryId);
    //判断redis中是否查询到数据
    if(contentList==null){
        //根据广告分类ID查询广告列表
        TbContentExample contentExample=new TbContentExample();
        Criteria criteria2 = contentExample.createCriteria();
        criteria2.andCategoryIdEqualTo(categoryId);
        contentList = contentMapper.selectByExample(contentExample);//获取广告列表
        
        //将id作为key
        redisTemplate.boundHashOps("content").put(categoryId, contentList);//存入缓存 
    }
    return  contentList;
}

4.2、更新缓存

当广告数据发生变更时,需要将缓存数据清除,这样再次查询才能获取最新的数据

4.2.1、添加广告

添加广告或清楚缓存

/**
 * 增加
 */
@Override
public void add(TbContent content) {
    contentMapper.insert(content);
    //清除缓存,添加缓存的时候,是将id作为key值存储的,现在删除缓存key值也是id
    redisTemplate.boundHashOps("content").delete(content.getCategoryId());
}

4.2.2、修改广告

修改广告也需要清空缓存,否则查询到的同样是缓存中的数据。

/**
 * 修改
 */
@Override
public void update(TbContent content){
    //根据key删除缓存,因为修改数据id是不会修改的
    redisTemplate.boundHashOps("content").delete(content.getId());
    //修改数据库中的数据
    contentMapper.updateByPrimaryKey(content);
}

4.2.3、删除广告

删除广告时,需要清空缓存

/**
 * 批量删除
 */
@Override
public void delete(Long[] ids) {
    //清除缓存
    redisTemplate.boundHashOps("content").delete(ids);
    contentMapper.deleteByPrimaryKey(id);
}