当前位置: 代码迷 >> 综合 >> SpringBoot2.0 maven下操作Redis缓存的各种方法
  详细解决方案

SpringBoot2.0 maven下操作Redis缓存的各种方法

热度:65   发布时间:2023-12-29 17:54:20.0

引入pom.xml依赖关系,可能因为spring boot的版本不同,如果 spring-boot-starter-redis 不行可以尝试使用 spring-boot-starter-data-redis

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-redis</artifactId>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.58</version>
</dependency>

在yml中配置 Redis 服务端的相关参数

redis:host: 127.0.0.1 # ipport: 6379 # 端口database: 0 # 数据库索引password: rootjedis:pool:max-active: 8max-wait: -1max-idle: 8min-idle: 0timeout: 10000

其中 database 的配置通常为0,Redis在配置的时候可以设置数据库数量,默认为16,可以理解为数据库的schema.

操作前先简单解释一下 stringRedisTemplate 和 redisTemplate 之间的关系和区别:

  • stringRedisTemplate 继承 redisTemplate,所以两者对 Redis 操作有类似的用法。
  • 两者的数据不互通,stringRedisTemplate 只管理 stringRedisTemplate 里的数据,后者亦然。
  • stringRedisTemplate 操作redis数据库里面本来存的是字符串类型或者你要存取的数据是字符串类型。
  • redisTemplate 操作数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象。

好,直接上操作:

先向spring注入 stringRedisTemplate 和 redisTemplate 两个对 Redis 的常规操作工具

@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private RedisTemplate redisTemplate;

根据key获取缓存中的val

public String getValue(String key) {return this.stringRedisTemplate.opsForValue().get(key);
}

向redis存入数据,这里有四种方式:

  • 向redis里存入object类型数据 / 并设置缓存时间
  • 向redis里存入数据 / 并设置缓存时间
    // 向redis里存入object类型数据public void addToRedis(String key, Object obj) {String objJson = JSON.toJSON(obj).toString();this.addToRedis(key, objJson);}// 向redis里存入数据private void addToRedis(String key, String value) {this.stringRedisTemplate.opsForValue().set(key, value);}// 向redis里存入object类型数据并设置缓存时间public void addToRedis(String key, Object obj, long time, TimeUnit timeUnit) {String objJson = JSON.toJSON(obj).toString();this.addToRedis(key, objJson, time, timeUnit);}// 向redis里存入数据和设置缓存时间private void addToRedis(String key, String value, long userRedisTimeout, TimeUnit timeUnit) {this.stringRedisTemplate.opsForValue().set(key, value, userRedisTimeout, timeUnit);}

例:获取在线用户

    public Integer getOnlineUserCount() {Set<String> redisKeySet = this.stringRedisTemplate.keys("*"); // 获取缓存中所有的keyString value;int count = 0;// 根据key获取缓存中的val,并统计在线用户for (String key : redisKeySet) {value = stringRedisTemplate.opsForValue().get(key);if (value != null && value.length() > 0) {count++;}}return count;}

expire 根据key设置过期时间

  • unit时间格式TimeUnit.SECONDS/TimeUnit.MILLISECONDS...
    public Boolean setKeyExpire(String key, long timeout, TimeUnit unit) {return stringRedisTemplate.expire(key, timeout, unit);}

根据key获取过期时间 / 并换算成指定单位

    public long getExpire(String key) {if (this.chcStringkKey(key)) {return this.stringRedisTemplate.getExpire(key);// return this.stringRedisTemplate.getExpire(key, TimeUnit.SECONDS);}return 0;}

检查key是否存在,返回boolean值

    public Boolean chcStringkKey(String key) {return this.stringRedisTemplate.hasKey(key);}

根据key删除缓存

    public Boolean deletStringeKey(String key) {if (this.chcStringkKey(key)) {return this.stringRedisTemplate.delete(key);}return false;}

val 是一些json格式或者是集合的操作,这里主要介绍list和map集合,其他一样操作。

根据key向缓存保存 / 读取list

  • 遍历方向不同,所以效率也不同。最好leftPush用leftPoP遍历,rightPush用rightPoP遍历
    // 根据key向缓存保存listpublic Long setList(Object key, List<?> list) {return this.redisTemplate.opsForList().leftPush(key, list);}// 根据key向缓存读取listpublic List<?> getList(String key) {return (List<?>) this.redisTemplate.opsForList().leftPop(key);}

根据key向缓存保存 / 读取map,这里提供两种操作:

  • 根据key获取缓存的map,再获取map中key2的值
  • 根据key获取缓存的map,再删除map中key2的值
    // 根据key向缓存保存mappublic void setMap(Object key, Map<?, ?> map) {this.redisTemplate.opsForHash().putAll(key, map);}// 根据key向缓存读取mappublic Map<?, ?> getMap(Object key) {return this.redisTemplate.opsForHash().entries(key);}// 根据key获取缓存的map,再获取map中key2的值public Object getMapValue(Object key, Object key2) {return this.redisTemplate.opsForHash().get(key, key2);}// 根据key获取缓存的map,再删除map中key2的值public Long deleteMapByKey(Object key, Object key2) {return this.redisTemplate.opsForHash().delete(key, key2);}

注意:当 redis 中存入的数据是可读形式而非字节数组时,使用 redisTemplate 取值的时候会无法获取导出数据,获得的值为null。尝试一下 StringRedisTemplate 。