SpringBoot使用Redis

前言

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

 

Redis 字符串(String)

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

 

 

Redis 哈希(Hash)

Redis 列表(List)操作命令

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

 

 

 

 

 

 

 

 

 

Redis 集合(Set)

Redis 有序集合(sorted set)

 

引入Redis

导入Maven坐标

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

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

 

配置Redis数据库信息

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

 

编写配置类RedisConfiguration

在配置类中要

Redis数据库的配置信息
copy
 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数据库。

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

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

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

copy
--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()的原型。

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

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

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

set()

copy
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是时间单位。

下面是例子

copy
@Test
public void testRedisString(){
redisTemplate.opsForValue().set("name","code_laoq");
redisTemplate.opsForValue().set("CAPTCHA","p2um",5, TimeUnit.MINUTES);//5分钟后过期
}

setIfAbsent()

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

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

setIfPresent()

copy
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。相当于更新操作。例子如下:

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

 

opsForList()

还是先看下方法原型

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

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

 

 

参考

  1. 入门::Spring Data Redis
  2. Redis 教程

 

posted @   老秦鸭  阅读(143)  评论(0编辑  收藏  举报
   
点击右上角即可分享
微信分享提示
🚀