Springboot整合Redis和redis常用操作演示

作者: ʘᴗʘ发布时间:2021-10-19 19:49 浏览量:553 点赞:433 售价:0
Springboot整合Redis和redis常用操作演示
传统的Springboot教程大多是各种理论、概念的集合,新手在学习的时候往往理解吃力、容易遗忘。本教程是作者结合自己多年工作经验,通过一些常见的小项目,深入浅出的讲解Springboot的各个知识点,能够帮助初学者快速掌握Springboot。每个案例都有完整可运行的源码,可直接下载运行。
文章:5篇

Springboot整合Redis

springboot整合Redis相当的简单,只要引入redis相关的jar包,然后再做一些连接Redis的配置即可。

引入redis相关jar包

在pom.xml中添加如下代码,即可引入redis相关jar包:

  • 引入redis自身的jar包
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  • 引入redis连接池的包
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.11.1</version>
</dependency>

springboot配置redis连接信息

在springboot项目的application.properties中配置redis的连接信息,代码如下:

spring.redis.lettuce.pool.max-active=20
spring.redis.lettuce.pool.max-idle=2
spring.redis.lettuce.pool.max-wait=10
spring.redis.lettuce.pool.min-idle=2
spring.redis.lettuce.shutdown-timeout=1


spring.redis.host=127.0.0.1
spring.redis.password=666
spring.redis.port=6379

spring.redis.lettuce相关的配置,是关于redis连接池的配置。lettuce在springboot的较新版本中,替代了jedis成为了默认的连接池工具。关于性能、连接机制方面,和jedis其实有很多区别,这块后面单独写篇文章介绍。

spring.redis相关的配置都是redis数据库的连接信息,密码如果没有,就删除掉spring.redis.password即可。

通过springboot操作执行redis命令

redis有很多命令,在springboot中,你可以通过直接@Autowired注入StringRedisTemplate或者RedisTemplate来使用。(下面代码中的stringRedisTemplateredisTemplate对象就是通过@Autowired注入的,完整代码可以参考文末代码)

下面案例代码中的keyvalue变量都是String类型,因为我们使用的是StringRedisTemplate

  • redis SETNXstringRedisTemplate.opsForValue().setIfAbsent(key, value)
  • redis GETSETstringRedisTemplate.opsForValue().getAndSet(key, value)
  • redis INCRstringRedisTemplate.opsForValue().increment(key)
  • redis INCRBYstringRedisTemplate.opsForValue().increment(key,val)
  • redis DECRstringRedisTemplate.opsForValue().decrement(key)
  • redis DECRBYstringRedisTemplate.opsForValue().decrement(key, val)
  • redis SADDstringRedisTemplate.opsForSet().add(key, value)
  • redis SISMEMBERstringRedisTemplate.opsForSet().isMember(key, member)
  • redis SMEMBERSstringRedisTemplate.opsForSet().members(key)
  • redis SCARDstringRedisTemplate.opsForSet().size(key)
  • redis SETstringRedisTemplate.opsForValue().set(key, value)stringRedisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS)该命令有很多可选参数,更复杂的应用可以参考文末代码。
  • redis GETstringRedisTemplate.opsForValue().get(key)
  • redis EXISTSstringRedisTemplate.hasKey(key)
  • redis TTLstringRedisTemplate.getExpire(key, TimeUnit.SECONDS)
  • redis EXPIREstringRedisTemplate.expire(key, time, TimeUnit.SECONDS)
  • redis DELstringRedisTemplate.delete(key)
  • redis HSETstringRedisTemplate.opsForHash().put(key, field, value)
  • redis LPOPredisTemplate.opsForList().leftPop(key)
  • redis LPUSHredisTemplate.opsForList().leftPush(key, val)
  • redis LREMredisTemplate.opsForList().remove(key, 0, val)

还有很多,就不单独列出了,可参考文末的完整代码。

封装常用的Redis操作

作者把自己常用的一些redis操作封装了一个springboot的service,里面包含了大部分的redis数据结构的操作,仅供参考。如果你要参考,有需要可以联系作者(点击右侧“联系作者”按钮即可)。

package com.coderbbb.blogv2.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.geo.Circle;
import org.springframework.data.geo.Distance;
import org.springframework.data.geo.GeoResults;
import org.springframework.data.geo.Point;
import org.springframework.data.redis.connection.RedisGeoCommands;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * @author longge93 on 2018/6/16.
 */
@Service
public class RedisService {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 对应Redis SETNX
     *
     * @param key
     * @param value
     * @return
     */
    public Boolean setnx(String key, String value) {
        return stringRedisTemplate.opsForValue().setIfAbsent(key, value);
    }

    /**
     * 对应Redis GETSET
     *
     * @param key
     * @param value
     * @return
     */
    public String setGet(String key, String value) {
        return stringRedisTemplate.opsForValue().getAndSet(key, value);
    }

    /**
     * 对应Redis INCR
     *
     * @param key
     * @return
     */
    public Long incr(String key) {
        return stringRedisTemplate.opsForValue().increment(key);
    }

    /**
     * 对应Redis INCRBY
     *
     * @param key
     * @param val
     * @return
     */
    public Long incr(String key, long val) {
        return stringRedisTemplate.opsForValue().increment(key, val);
    }

    /**
     * 对应Redis DECR
     *
     * @param key
     * @return
     */
    public Long decr(String key) {
        return stringRedisTemplate.opsForValue().decrement(key);
    }

    /**
     * 对应Redis DECRBY
     *
     * @param key
     * @param val
     * @return
     */
    public Long decr(String key, long val) {
        return stringRedisTemplate.opsForValue().decrement(key, val);
    }

    /**
     * 对应Redis SMEMBERS
     * @param key
     * @return
     */
    public Set<String> setList(String key) {
        return stringRedisTemplate.opsForSet().members(key);
    }

    /**
     * 对应Redis SCARD
     * @param key
     * @return
     */
    public Long setSize(String key) {
        return stringRedisTemplate.opsForSet().size(key);
    }

    /**
     * 对应Redis SET
     * @param key
     * @param value
     */
    public void putString(String key, String value) {
        stringRedisTemplate.opsForValue().set(key, value);
    }

    /**
     * 对应Redis SET
     * s为单位。
     * @param key
     * @param value
     * @param time
     */
    public void putString(String key, String value, long time) {
        stringRedisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
    }

    /**
     * 对应Redis SET
     * 详细命令:SET key value [EX seconds] [PX milliseconds] [NX|XX]
     * @param key
     * @param value
     * @param time
     * @return
     */
    public Boolean zPutString(String key, String value, long time) {
        return stringRedisTemplate.opsForValue().setIfAbsent(key, value, time, TimeUnit.SECONDS);
    }

    /**
     * 对应Redis SET
     * @param key
     * @param value
     * @param time
     * @param unit
     */
    public void putString(String key, String value, long time, TimeUnit unit) {
        stringRedisTemplate.opsForValue().set(key, value, time, unit);
    }

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

    public void putObject(String key, Object value, long time, TimeUnit unit) {
        redisTemplate.opsForValue().set(key, value, time, unit);
    }

    public Object getObject(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 对应Redis EXISTS
     * @param key
     * @return
     */
    public Boolean exist(String key) {
        return stringRedisTemplate.hasKey(key);
    }

    /**
     * 对应Redis TTL
     * key有效时间
     *
     * @param key
     * @return
     */
    public Long expire(String key) {
        return stringRedisTemplate.getExpire(key, TimeUnit.SECONDS);
    }

    /**
     * 对应Redis DEL
     * @param key
     * @return
     */
    public Boolean del(String key) {
        return stringRedisTemplate.delete(key);
    }

    /**
     * 对应Redis HSET
     * @param key
     * @param field
     * @param value
     */
    public void hset(String key, String field, String value) {
        stringRedisTemplate.opsForHash().put(key, field, value);
    }

    /**
     * 对应Redis HGET
     * @param key
     * @param field
     * @return
     */
    public String hget(String key, String field) {
        HashOperations<String, String, String> ops = stringRedisTemplate.opsForHash();
        return ops.get(key, field);
    }

    /**
     * 对应Redis HMGET
     * @param key
     * @return
     */
    public Map<String, String> hmget(String key) {
        HashOperations<String, String, String> ops = stringRedisTemplate.opsForHash();
        return ops.entries(key);
    }

    /**
     * 对应Redis HMSET
     * @param key
     * @param data
     */
    public void hmset(String key, HashMap<String, String> data) {
        HashOperations<String, String, String> ops = stringRedisTemplate.opsForHash();
        ops.putAll(key, data);
    }

    /**
     * 对应Redis HDEL
     * @param key
     * @param field
     */
    public void hdel(String key, String field) {
        HashOperations<String, String, String> ops = stringRedisTemplate.opsForHash();
        ops.delete(key, field);
    }

    /**
     * 对应Redis SADD
     * @param key
     * @param value
     */
    public void sadd(String key, String value) {
        stringRedisTemplate.opsForSet().add(key, value);
    }

    /**
     * 对应Redis SISMEMBER
     * @param key
     * @param val
     * @return
     */
    public Boolean setIsMember(String key, String val) {
        return stringRedisTemplate.opsForSet().isMember(key, val);
    }

    public void channel(String channel, String value) {
        stringRedisTemplate.convertAndSend(channel, value);
    }


    /**
     * 对应Redis ZREM
     * @param key
     * @param member
     * @return
     */
    public Long zSetDel(String key, String member) {
        return stringRedisTemplate.boundZSetOps(key).remove(member);
    }

    public void geoAdd(String key, double lat, double lng, String member) {
        Point point = new Point(lng, lat);
        RedisGeoCommands.GeoLocation<String> geoLocation = new RedisGeoCommands.GeoLocation<>(member, point);
        stringRedisTemplate.boundGeoOps(key).add(geoLocation);
    }

    public GeoResults<RedisGeoCommands.GeoLocation<String>> geoSearch(String key, double lat, double lng, double distanceVal, long count) {
        Point point = new Point(lng, lat);
        Distance distance = new Distance(distanceVal);
        Circle circle = new Circle(point, distance);
        RedisGeoCommands.GeoRadiusCommandArgs commandArgs = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs();
        commandArgs.sortAscending();
        if (count != 0) {
            commandArgs.limit(count);
        }
        return stringRedisTemplate.boundGeoOps(key).radius(circle, commandArgs);
        //.geoRadius(circle);
    }

    /**
     * 对应Redis EXPIRE
     * @param key
     * @param time
     */
    public void setExpire(String key, long time) {
        stringRedisTemplate.expire(key, time, TimeUnit.SECONDS);
    }

    /**
     * 对应Redis EXPIRE
     * @param key
     * @param time
     */
    public void setExpireMills(String key, long time) {
        stringRedisTemplate.expire(key, time, TimeUnit.MILLISECONDS);
    }

    /**
     * 对应Redis MGET
     * @param keys
     * @return
     */
    public List<String> mget(List<String> keys) {
        return stringRedisTemplate.opsForValue().multiGet(keys);
    }


    /**
     * 对应Redis LPUSH
     * 设置key 类型为list
     *
     * @param key
     * @param value
     * @return
     */
    public Long listAddAll(String key, Collection<?> value) {
        return redisTemplate.opsForList().leftPushAll(key, value.toArray());
    }

    /**
     * 对应Redis LPOP
     * 移出并获取列表的第一个元素
     *
     * @param key
     * @return 删除的元素
     */
    public Object lLeftPop(String key) {
        return redisTemplate.opsForList().leftPop(key);
    }

    /**
     * 对应Redis LPUSH
     * @param key
     * @param val
     * @return
     */
    public Long listAdd(String key, Integer val) {
        return redisTemplate.opsForList().leftPush(key, val);
    }

    /**
     * 对应Redis LREM
     * @param key
     * @param val
     */
    public void listRemove(String key, String val) {
        redisTemplate.opsForList().remove(key, 0, val);
    }

    /**
     * 对应Redis LPUSH
     * @param key
     * @param val
     * @return
     */
    public Long listAddForString(String key, String val) {
        return redisTemplate.opsForList().leftPush(key, val);
    }

    /**
     * 对应Redis LRANGE
     * @param key
     * @return
     */
    public List<Object> listGetAll(String key) {
        return redisTemplate.opsForList().range(key, 0, -1);
    }

    /**
     * 对应Redis LLEN
     * @param key
     * @return
     */
    public Long listSize(String key) {
        return redisTemplate.opsForList().size(key);
    }
}

版权声明:《Springboot整合Redis和redis常用操作演示》为CoderBBB作者「ʘᴗʘ」的原创文章,转载请附上原文出处链接及本声明。

原文链接:https://www.coderbbb.com/articles/20

其它推荐:

  • Java Springboot对接微信支付(JSAPI等)API-V3

    本文介绍了java如何对接微信支付API-V3,完成微信JSAPI网页支付。提供了完整的下单接口代码,详细解释了每个参数,可以快速的整合到你的项目中,完成微信支付。

  • springboot整合thymeleaf完成第一个HTML网页

    在当前的HTML网页开发中,虽然Vue、React等框架非常流行,但是因为部分行业、网站对搜索引擎SEO的需求,传统的模板引擎仍有一席之地。本文继续使用上文生成的Demo工程,通过引入thymeleaf来完成我们的第一个网页。

  • java使用apache-commons-lang3生成随机字符串(可自定义规则)

    在日常开发中,我们经常会遇到生成随机字符串的需求。可能是大小写字母+数字,也可能是其他各种字符。作为一个常用功能,我们完全没必要自己实现,有很多优质的类库已经做的很完善了。本文介绍的就是apache-commons-lang3类库的随机字符串方法。

  • Netty使用阿里云SSL证书配置SSL

    本文介绍了如何使用阿里云购买的SSL证书来配置Netty,使Netty支持SSL加密的TCP连接。由于直接从阿里云下载的证书文件无法使用,还需要通过OpenSSL做一些格式转换。转换好的pem和key文件,加载到netty的handler中即可完成netty的ssl升级

  • springboot @Async使用自定义线程池和线程池参数调优经验

    在springboot中使用@Async注解时,如果需要指定@Async使用的线程池,可以参照本文介绍的方法完成配置,过程十分简便。

  • 解决Win10开启网络唤醒后,不停的自动唤醒问题

    win10开启网卡的自动唤醒功能后,出现了一睡眠就自动唤醒的问题。本文通过配置网卡唤醒选项,完美解决该问题。

  • springboot3+EhCache3缓存+JDK17整合指南

    本文介绍了如何在springboot3中整合使用EhCache3作为缓存。和EhCache2相比,EhCache3的整合方法完全不同。同时,由于在springboot3中删除了EhCacheCacheManager类,也让整合方法完全不同。参考本文,可以快速完成整合。

  • cookie一段时间免登录、登录保持设计思路

    本文介绍了如何通过cookie实现常见的网站登录保持、免登录。详细讲解了cookie在日常使用中的一些安全问题,并逐一提供了解决方案。按照本文的思路和步骤,可以方便的实现一个最基础的cookie免登录机制。

  • springboot+vue播放视频流(无需下载视频,可以拖动进度、倍速播放)

    springboot+vue播放视频流详细教程!不用自己实现range头,springboot本身是支持range分片返回文件的!本教程介绍的方法可以通过三五行代码直接实现springboot播放视频流。

  • 解析CSDN“登录后才能复制”功能技术原理

    本文是作者遇到CSDN“复制代码必须登录”的功能后,进行的一次技术探索,研究了CSDN是如何实现文章“防复制”的,并给出了更加安全牢固的反爬虫、反复制方案。