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的方法。

总结

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

相关文章

  • Java调用Oracle存储过程详解

    Java调用Oracle存储过程详解

    这篇文章主要介绍了Java调用Oracle存储过程详解的相关资料,需要的朋友可以参考下
    2017-02-02
  • spring-data-redis 动态切换数据源的方法

    spring-data-redis 动态切换数据源的方法

    最近遇到了一个麻烦的需求,我们需要一个微服务应用同时访问两个不同的 Redis 集群,一般情况下我们会怎么处理呢,下面通过场景分析给大家介绍spring-data-redis 动态切换数据源的方法,感兴趣的朋友一起看看吧
    2021-08-08
  • 探究Java常量本质及三种常量池(小结)

    探究Java常量本质及三种常量池(小结)

    这篇文章主要介绍了探究Java常量本质及三种常量池(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 如何使用XPath提取xml文档数据

    如何使用XPath提取xml文档数据

    这篇文章主要介绍了如何使用XPath提取xml文档数据,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • java实现遍历树形菜单两种实现代码分享

    java实现遍历树形菜单两种实现代码分享

    这篇文章主要介绍了java实现遍历树形菜单两种实现代码分享,两种实现:OpenSessionView实现、TreeAction实现。具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Springboot整合Shiro的代码实例

    Springboot整合Shiro的代码实例

    这篇文章主要介绍了Springboot整合Shiro的代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • spring @Scheduled注解各参数使用以及定时任务详解

    spring @Scheduled注解各参数使用以及定时任务详解

    文章详细介绍了Spring框架中@Scheduled注解的各个参数,包括cron表达式、时区、fixedDelay、fixedRate、initialDelay等,并提供了多个示例来说明这些参数的使用方法
    2024-11-11
  • Java线程公平锁和非公平锁的差异讲解

    Java线程公平锁和非公平锁的差异讲解

    今天小编就为大家分享一篇关于Java线程公平锁和非公平锁的差异讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 基于Java回顾之I/O的使用详解

    基于Java回顾之I/O的使用详解

    我计划在接下来的几篇文章中快速回顾一下Java,主要是一些基础的JDK相关的内容
    2013-05-05
  • spring中bean id相同引发故障的分析与解决

    spring中bean id相同引发故障的分析与解决

    最近在工作中遇到了关于bean id相同引发故障的问题,通过查找相关资料终于解决了,下面这篇文章主要给大家介绍了因为spring中bean id相同引发故障的分析与解决方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-09-09

最新评论