文章目录
- 一、导入依赖
- 二、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);
}