SpringBoot使用Redis方式

 更新时间:2024年11月27日 09:42:09   作者:code__laoq  
文章介绍了SpringDataRedis操作本地Redis数据库的方法,包括Redis的基本概念、数据类型、命令以及在Java中的使用

前言

本文使用Spring Data Redis操作本地的Redis数据库,仅为学习中的记录。

Redis

简介

  • Redis 是开源免费的一个高性能的key-value数据库。
  • Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
  • Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
  • Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 因为Redis数据保存在内存中,所以跟MySQL之类的数据库相比,在内存中操作起来非常简单,可以做很多内部复杂性很强的事情。而且Redis中数据是紧凑的以追加的方式产生的,因为Redis数据并不需要进行随机访问。

Redis索引

在redis中,索引从0开始,命令中含range时,起始索引是包含在内的。

如有String<name , code_laoq>,使用getrange name 1 3得到的字符串子串是ode。

而索引如果为负则表示是倒数的某个元素。如有List<weekday , [Monday,Tuesday,Wednesday,Thursday,Friday]>,使用lindex weekday -2得到的是List倒数第二个元素即Thursday。

数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

String(字符串)

  • string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
  • string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
  • string类型是Redis最基本的数据类型,一个键最大能存储512MB。

Hash(哈希)

  • Redis hash 是一个键值对集合,是string类型的field和value的映射表,适合用于存储Object对象。

List(列表)

  • Redis 列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)。

Set(集合)

  • Redis的Set是string类型的无序集合,通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

zset(sorted set:有序集合)

  • Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
  • 不同的是每个元素都会关联一个double类型的score。
  • redis通过score来为集合中的成员进行从小到大的排序。

zset的成员是唯一的,但score却可以重复。

Redis命令

Redis 数据管理

  • 删除指定key的数据。
DEL key_name
  • 检查是否存在指定key的数据,若 key 存在返回 1 ,否则返回 0 。
EXISTS key_name
  • 查看指定key的类型,返回值为:none (key不存在)、string、list、set、zset或hash。
TYPE key_name
  • 模糊查询,和mysql类似。keys *lock* 从查询包含key中lock的数据
KEYS pattern
  • 修改指定key的key值(其value不变),如果new_key_name存在则将其覆盖
RENAME old_key_name new_key_name
  • 当new_key_name这个数据不存在时,修改指定key的key_name
RENAMENX old_key_name new_key_name
  • 给指定key添加过期时间
EXPIRE key_name expiration                 --设置指定key在[expiration]秒后过期
EXPIREAT key_name timestamp                --参数是UNIX时间戳(从1970年1月1日开始,到当前时间所经过的秒数)
PEXPIRE key_name milliseconds              --过期时间以毫秒计算
PEXPIREAT key milliseconds-timestamp       --UNIX时间戳以毫秒计算
  • 移除指定key的过期时间
PERSIST key_name
  • 查看指定key的过期时间
TTL key_name         --返回剩余的过期时间(以秒为单位)
PTTL key_name        --返回剩余的过期时间(以毫秒为单位)
  • 将指定key移到指定数据库中
MOVE key_name db_num

Redis 字符串(String)

  • 修改key的值(无视类型),如果不存在就新增一条值为value的数据。
SET key_name value
  • 将给定 key 的值设为 value ,并返回原来的value。如果key不存在就新增,但是返回null。
GETSET key_name value
  • 为指定的 key 设置值及其过期时间为expiration(单位为秒)。如果 key 不存在就新增。
SETEX key_name out_time value
  • 和 SETEX类似,但它以毫秒为单位设置 指定key 的生存时间。
PSETEX key_name expiration value
  • 新增一条数据,如果key已存在就不执行。
SETNX key_name value
  • 新增多条数据,如果已存在就修改这些key的值。如果有的key存在有的key不存在呢?那就新增不存在的,修改已存在的。
MSET key_name1 value1 key_name2 value2 ... key_nameN valueN
  • 新增多条数据,如果任一key已存在则不进行任何插入操作【殃及池鱼,一条也不会插入】。
MSETNX key_name1 value1 key_name2 value2 ... key_nameN valueN
  • 将 value 追加到指定key原value的末尾。如果不存在就新增。
APPEND key_name value
  • 获取指定 key 的值
GET key_name
  • 获取多个key的值
mget key_name1 key_name2 ... key_nameN
  • 获取指定key的子串
GETRANGE key_name start end
  • 获取指定 key 所储存的字符串值的长度。
STRLEN key_name

Redis 哈希(Hash)

Redis 列表(List)操作命令

  • 在List左边插入数据。哪怕key不存在也可以插入。
LPUSH key_name value_1 value_2 ... value_n    --每个数据用空格分隔
  • 插入一条数据到已存在的List左边。一次只能插入一条数据;如果List不存在则不能插入
LPUSHX key_name value
  • 在List右边插入数据。value_2在value_1右边,哪怕key不存在也可以插入。
RPUSH key_name value_1 value_2 ... value_n
  • 插入一条数据到已存在的List右边
RPUSHX key_name value
  • 在List某一元素前/后插入一条数据。若List或者指定元素不存在则均无法插入数据
LINSERT key_name BEFORE existing_value new_value
LINSERT key_name AFTER  existing_value new_value
  • 获取List长度
LLEN key_name
  • 通过索引获取List中的元素。而这个索引值只要求为整数即可,若索引越界则会返回一个null。
LINDEX key_name index
  • 获取List指定范围内的元素。获取的是闭区间[start,stop]中的元素。
LRANGE key_name start stop
  • 批量移除List元素。根据COUNT 的值,移除List中与VALUE 相等的元素。
    • count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
    • count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
    • count = 0 : 移除表中所有与 VALUE 相等的值。
LREM key_name COUNT value
  • 移除并获取List最后一个元素
RPOP key_name

Redis 集合(Set)

  • Redis 有序集合(sorted set)

引入Redis

导入Maven坐标

在Java中使用MySQL用的是JDBC接口,而操作Redis也有接口,常见的有Jedis、Lettuce和Spring Data Redis,Spring Data Redis是封装了前两个接口。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

配置Redis数据库信息

blog: #这里填项目的名称缩写,不要照抄
  redis:
    host: localhost #也可以填远程的IP
    port: 6379 #端口号
    password: #密码,redis默认没密码,需要在配置文件里修改
    database: 8 #要连接的数据库号

编写配置类RedisConfiguration

在配置类中要

Redis数据库的配置信息

package blog.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**

@author code_laoq
@version 1.0
@date 2024/11/3 19:48
@description Redis数据库的配置信息
*/
@Configuration
@Slf4j
public class RedisConfiguration {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
log.info(“创建redis模板”);
RedisTemplate redisTemplate=new RedisTemplate();
redisTemplate.setConnectionFactory(factory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}

操作Redis数据库

回忆之前操作MySQL使用什么对象,没错就是JDBCemplate对象。类似的,在SpringBoot中一般使用RedisTemplate对象操作Redis数据库。

org.springframework.data.redis.core.RedisTemplate;

RedisTemplate提供了redis各种操作、异常处理及序列化。

!!!Redis没有类似MySQL等关系型数据库的统一SQL语句,也就是说Redis操作不同类型的数据结构要用不同的语句。比如插入一个String类型的数据和List类型的数据要用不同的语句。

--String插入数据
SET name laoq
--List插入数据
RPUSH KEY_NAME VALUE1

因此每一种Redis数据结构的操作语句都要学习(大同小异),下面我将从RedisTemplate对象入手进行讲解。

RedisTemplate对象

RedisTemplate提供了redis各种操作、异常处理及序列化。而RedisTemplate中5种常见的OpsFor分别是:opsForValue()opsForList()opsForHash()opsForSet()OpsForZSet()。显而易见,他们分别是对Redis中的String、List、Hash、Set和Zset进行操作的方法。

opsForValue()

我们首先来看opsForValue()的原型。

public ValueOperations<K, V> opsForValue() {
        return this.valueOps;
    }

该方法返回了一个ValueOperations类型的接口,该接口中定义了操作redis字符串的17个方法。而调用RedisTemplate的opsForValue()方法则会返回ValueOperations接口的实现类对象DefaultValueOperations的属性。

我们一个一个来看ValueOperations的方法。

set()
void set(K key, V value);
void set(K key, V value, long timeout, TimeUnit unit);

set(K key, V value)方法对应 Redis的SET key value语句,用于插入一条数据,key和value分别是数据的键值。

而重载的set(K key, V value, long timeout, TimeUnit unit)方法对应Redis的SETEX key seconds value语句,插入一条含有效期的数据,timeout为过期时间,unit是时间单位。

下面是例子

@Test
public void testRedisString(){
    redisTemplate.opsForValue().set("name","code_laoq");
    redisTemplate.opsForValue().set("CAPTCHA","p2um",5, TimeUnit.MINUTES);//5分钟后过期
}
setIfAbsent()
Boolean setIfAbsent(K key, V value);
Boolean setIfAbsent(K key, V value, long timeout, TimeUnit unit);

setIfAbsent()方法对于Redis的SETNX key value,如果key对应的数据不存在就插入,否则不插入。参数同上 不再赘述

setIfPresent()
Boolean setIfPresent(K key, V value);
Boolean setIfPresent(K key, V value, long timeout, TimeUnit unit);

setIfAbsent()方法对于Redis的SET key value [EX seconds/PX milliseconds] XX,如果key对应的数据存在就插入并返回True,否则不插入返回False。相当于更新操作。

例子如下:

@Test
public void testRedisString(){
    redisTemplate.opsForValue().setIfPresent("CAPTCHA1","laoq",5, TimeUnit.MINUTES);
}

opsForList()

还是先看下方法原型

public ListOperations<K, V> opsForList() {
    return this.listOps;
}

和上面类似的,该方法返回了一个ListOperations类型的接口,该接口中定义了操作redis字符串的17个方法。而调用RedisTemplate的opsForList()方法则会返回ListOperations接口的实现类对象DefaultListOperations的属性。我们一个一个来看ListOperations的方法。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring定时任务实现与配置(一)

    Spring定时任务实现与配置(一)

    这篇文章主要为大家详细介绍了Spring定时任务的实现与配置第一篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • SpringBoot在Controller层接收参数的n种姿势(超详细)

    SpringBoot在Controller层接收参数的n种姿势(超详细)

    这篇文章主要介绍了SpringBoot在Controller层接收参数的常用方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • 基于java中正则操作的方法总结

    基于java中正则操作的方法总结

    本篇文章介绍了,在java中正则操作的方法总结。需要的朋友参考下
    2013-05-05
  • java 浅析代码块的由来及用法

    java 浅析代码块的由来及用法

    所谓代码块是指用"{}"括起来的一段代码,根据其位置和声明的不同,可以分为普通代码块、构造块、静态块、和同步代码块。如果在代码块前加上 synchronized关键字,则此代码块就成为同步代码块
    2021-10-10
  • mybatis-plus saveOrUpdateBatch踩坑记录

    mybatis-plus saveOrUpdateBatch踩坑记录

    这篇文章主要介绍了mybatis-plus saveOrUpdateBatch踩坑记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • SpringBoot3整合SpringCloud启动后nacos报错获取不到配置、无法注册服务的解决方案

    SpringBoot3整合SpringCloud启动后nacos报错获取不到配置、无法注册服务的解决方案

    文章介绍了如何使用Spring Boot 3.3.4和Spring Cloud 2023.0.3搭建微服务项目,并解决与Nacos服务注册发现和配置中心的集成问题,主要解决了依赖版本不兼容、配置文件导入问题及服务注册失败等问题,感兴趣的朋友跟随小编一起看看吧
    2025-02-02
  • Java Netty HTTP服务实现过程解析

    Java Netty HTTP服务实现过程解析

    这篇文章主要介绍了Java Netty HTTP服务实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • SpringBoot项目使用MDC给日志增加唯一标识的实现步骤

    SpringBoot项目使用MDC给日志增加唯一标识的实现步骤

    本文介绍了如何在SpringBoot项目中使用MDC(Mapped Diagnostic Context)为日志增加唯一标识,以便于日志追踪,通过创建日志拦截器、配置拦截器以及修改日志配置文件,可以实现这一功能,文章还提供了源码地址,方便读者学习和参考,感兴趣的朋友一起看看吧
    2025-03-03
  • IDEA 自动跳出括号的快捷键分享

    IDEA 自动跳出括号的快捷键分享

    这篇文章主要介绍了IDEA 自动跳出括号的快捷键分享,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Java依赖-关联-聚合-组合之间区别_动力节点Java学院整理

    Java依赖-关联-聚合-组合之间区别_动力节点Java学院整理

    这篇文章主要介绍了Java依赖-关联-聚合-组合之间区别理解,依赖关系比较好区分,它是耦合度最弱的一种,下文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2017-08-08

最新评论