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的数据。
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 @Scheduled注解各参数使用以及定时任务详解
文章详细介绍了Spring框架中@Scheduled注解的各个参数,包括cron表达式、时区、fixedDelay、fixedRate、initialDelay等,并提供了多个示例来说明这些参数的使用方法2024-11-11
最新评论