1
SpringBoot 中操作 Redis 及工具类的封装
作者:做梦都在改BUG
- 2023-05-06 湖南
本文字数:3838 字
阅读完需:约 13 分钟
在我们项目开发中总是免不了会使用缓存,Redis 现在基本是我们公司中非常常见的缓存方案,包括在用户 token 的缓存,热点信息的缓存等,这篇文章主要讲讲在 SpringBoot 项目中如何去操作 Redis,及最后工具类的封装。
一、引入依赖及进行配置
maven依赖的引入(继承了SpringBoot的父模块,所以不需要再声明版本)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency>复制代码
application.yml配置
spring: redis: host: localhost port: 6379 password: database: 0 # 指定redis的分库(共16个,0-15)复制代码
二、使用
使用示例:
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.web.bind.annotation.*;
@RestController@RequestMapping("/user")public class UserController { @Autowired private RedisTemplate redisTemplate; @GetMapping("/get") public Object getUser() { return redisTemplate.opsForValue().get("user"); } @GetMapping("/set") public String setUser(String user) { redisTemplate.opsForValue().set("user", user); return "success"; }}复制代码
主要是自动装配好redis依赖提供给我们的RedisTemplate,然后通过redisTemplate来进行get和set的操作。
RedisTemplate Api(部分展示)
三、Redis 操作工具类的封装
redis相应的工具类封装,主要是对各种数据类型操作更方便,设置缓存过期时间等。
utils.RedisCache:
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.BoundSetOperations;import org.springframework.data.redis.core.HashOperations;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.ValueOperations;import org.springframework.stereotype.Component;
import java.util.*;import java.util.concurrent.TimeUnit;
@Componentpublic class RedisCache { @Autowired public RedisTemplate redisTemplate;
/** * 缓存基本的对象,Integer、String、实体类等 * * @param key 缓存的键值 * @param value 缓存的值 */ public <T> void setCacheObject(final String key, final T value) { redisTemplate.opsForValue().set(key, value); }
/** * 缓存基本的对象,Integer、String、实体类等 * * @param key 缓存的键值 * @param value 缓存的值 * @param timeout 时间 * @param timeUnit 时间颗粒度 */ public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) { redisTemplate.opsForValue().set(key, value, timeout, timeUnit); }
/** * 设置有效时间 * * @param key Redis键 * @param timeout 超时时间 * @return true=设置成功;false=设置失败 */ public boolean expire(final String key, final long timeout) { return expire(key, timeout, TimeUnit.SECONDS); }
/** * 设置有效时间 * * @param key Redis键 * @param timeout 超时时间 * @param unit 时间单位 * @return true=设置成功;false=设置失败 */ public boolean expire(final String key, final long timeout, final TimeUnit unit) { return redisTemplate.expire(key, timeout, unit); }
/** * 获得缓存的基本对象。 * * @param key 缓存键值 * @return 缓存键值对应的数据 */ public <T> T getCacheObject(final String key) { ValueOperations<String, T> operation = redisTemplate.opsForValue(); return operation.get(key); }
/** * 删除单个对象 * * @param key */ public boolean deleteObject(final String key) { return redisTemplate.delete(key); }
/** * 删除集合对象 * * @param collection 多个对象 * @return */ public long deleteObject(final Collection collection) { return redisTemplate.delete(collection); }
/** * 缓存List数据 * * @param key 缓存的键值 * @param dataList 待缓存的List数据 * @return 缓存的对象 */ public <T> long setCacheList(final String key, final List<T> dataList) { Long count = redisTemplate.opsForList().rightPushAll(key, dataList); return count == null ? 0 : count; }
/** * 获得缓存的list对象 * * @param key 缓存的键值 * @return 缓存键值对应的数据 */ public <T> List<T> getCacheList(final String key) { return redisTemplate.opsForList().range(key, 0, -1); }
/** * 缓存Set * * @param key 缓存键值 * @param dataSet 缓存的数据 * @return 缓存数据的对象 */ public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet) { BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key); Iterator<T> it = dataSet.iterator(); while (it.hasNext()) { setOperation.add(it.next()); } return setOperation; }
/** * 获得缓存的set * * @param key * @return */ public <T> Set<T> getCacheSet(final String key) { return redisTemplate.opsForSet().members(key); }
/** * 缓存Map * * @param key * @param dataMap */ public <T> void setCacheMap(final String key, final Map<String, T> dataMap) { if (dataMap != null) { redisTemplate.opsForHash().putAll(key, dataMap); } }
/** * 获得缓存的Map * * @param key * @return */ public <T> Map<String, T> getCacheMap(final String key) { return redisTemplate.opsForHash().entries(key); }
/** * 往Hash中存入数据 * * @param key Redis键 * @param hKey Hash键 * @param value 值 */ public <T> void setCacheMapValue(final String key, final String hKey, final T value) { redisTemplate.opsForHash().put(key, hKey, value); }
/** * 获取Hash中的数据 * * @param key Redis键 * @param hKey Hash键 * @return Hash中的对象 */ public <T> T getCacheMapValue(final String key, final String hKey) { HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash(); return opsForHash.get(key, hKey); }
public void incrementCacheMapValue(String key, String hKey, int v) { redisTemplate.opsForHash().increment(key, hKey, v); }
/** * 删除Hash中的数据 * * @param key * @param hkey */ public void delCacheMapValue(final String key, final String hkey) { HashOperations hashOperations = redisTemplate.opsForHash(); hashOperations.delete(key, hkey); }
/** * 获取多个Hash中的数据 * * @param key Redis键 * @param hKeys Hash键集合 * @return Hash对象集合 */ public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys) { return redisTemplate.opsForHash().multiGet(key, hKeys); }
/** * 获得缓存的基本对象列表 * * @param pattern 字符串前缀 * @return 对象列表 */ public Collection<String> keys(final String pattern) { return redisTemplate.keys(pattern); }}复制代码
使用:
import com.jk.utils.RedisCache;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*;
@RestController@RequestMapping("/user")public class UserController { @Autowired private RedisCache redisCache; @GetMapping("/get") public Object getUser() { return redisCache.getCacheObject("user"); } @GetMapping("/set") public String setUser(String user) { redisCache.setCacheObject("user", user); return "success"; }}复制代码
作者:JK 凯
链接:https://juejin.cn/post/7229869683326451749
来源:稀土掘金
划线
评论
复制
发布于: 刚刚阅读数: 4
做梦都在改BUG
关注
还未添加个人签名 2021-07-28 加入
公众号:该用户快成仙了










评论