Redis:

全称:Remote Dictionarty Service

简介:

Redis是远程字典服务,是一个开源的NoSQL数据库,使用ANSI C语言编写的,它是一个基于内存的Key-Value数据库,并且支持持久化数据库。

有丰富的数据结构如:

  1. String (字符串)
  2. Hash ()
  3. List (双向列表)
  4. Set(无序列表)
  5. Sorten Set(有序集合)

NoSQL数据库:

非关系型数据库,放弃了统一的技术标准(sql),为某一个特定领域场景设计,使性能、容量、扩展第一实现一定的突破

特点:

  1. 不支持ACID
  2. 不遵循SQL表尊
  3. 远超SQL性能
  4. 海量数据读写
  5. 高并发

常见NoSQL:

  1. mongoDB 高性能、开源、文档型数据库
  2. HBase HBase支持数十亿行*数百亿列的数据库库表 是Hadoop项目的数据库

语法:

nil 指无值或不存在,Go、Lua、Object-C 为空都是nil
set key value EX 20 设置key的过期时间为20s
set key value PX 3000 设置key的过期时间为3000ms = 3s
set key value NX 如果键不存在设置新的值,否则失败
set key value XX 如果键存在就设置新的值,否则失败
NX和XX不能同时出现,因为他们语义互斥
在key中可以使用:(冒号)来做单词分离,如:user:1 或 user:2 user称为命名空间
Keys 后面加key的名字可以做模糊查询 如:key na*e:*
DEL key 可以删除一个key或多个key(危险操作)
EXISTS key 查询key是否存在(0不存在 1存在)
TYPE key 可以返回这个key的类型
RENAME key newKey 给kye进行重命名
EXPIRE key 秒 给指定key设置一个过期时间
PEXPIRE key 毫秒 给指定key设置一个毫秒过期时间
PEXPIREAT key 时间戳 给指定key设置一个时间戳 如:1714741026000
TTL key 获取key的过期前时间 如果为-1永不过期 如果为-2没有这个key

字符串:

语法

set key value 设置一个值
get key 获取一个值
append key 在字符串后凭借字符串
getrange key start end 截取字符串 start(包前) end结束,end可以是固定值也可以是-1(最后一位)
setnx key value 当key不存在时设置key的值
strlen key 获取value的长度

Hash:

hash在Redis中是一个广泛使用的概念,主要是指一种任意长度的数据(如字符串)通过Hash算法变换成固定长度的数据格式的过程,这个固定长度的数据通常被称为哈希值或哈希码。
Radis中每个Hash可以存储2^32-1个键值对 (40多亿)

语法

hset 对象名:对象ID key value key value key value
hget 对象名:对象ID 属性Key
hgetall 对象名:对象ID
hdel 对象名:对象ID 属性名 删除对应属性
hexists 对象名:对象ID 属性名 检查属性是否存在,存在返回1,否则返回0 

List:

List在Redis中提供一种线性数据库结构,它可以存储一个字符串列表,按照出插入顺序排序,可以选中列表的两端推出或弹出元素。
主要元素:元素有序,支持重复元素、可以通过索引访问元素、操作复杂低(头部和尾部的时间复杂度为0(1))
常见八股文:如何使用List实现一个消息队列? 如何遍历Redis的List? Redis的List最大存储多少个元素?

一个列表最多包含2^32-1个元素(4294967295,每个列表超过40个亿元素)

语法

LPUSH key value value value 将一个或多个值插入到列表的头部
RPUSH key value value value 将一个或多个值插入到列表的尾部
LPOP key 从头部移除并获取一个元素
RPOP key 从尾部移除并获取一个元素
LLEN key 获取链表的长度
LINSERT key BEFORE|AFTER pivot value 在列表的元素前或者后插入元素(pivot 要插入的值)

Set:

Q:redis的Set数据结构能否重复?

A:Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

Q:Redis集合最大存储?

A:2^32-1

使用场景:随机抽奖、唯一性检查

语法

SADD key value value value 给Set数据机构添加内容
SMEMBERS key 获取所有元素
SPOP key 随机弹出并移除一个元素

Sorted Set

使用场景:实现排行榜系统,带权重的任务队列

语法

ZADD key 权重 值 权重 值 权重 值 添加数据到有序集合里
ZERVRANGE key 0 -1 权重从大到小获取所有元素 加WITHSCORES和权重一起返回ZRANGE key 0 -1 权重从小到大获取所有元素 加WITHSCORES和权重一起返回

SpringBoot 整合Redis

导包

 		<!--redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!--Lettuce 连接池-->
        <dependency>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
            <version>6.3.2.RELEASE</version>
        </dependency>

Lettuce特点:

1. **高性能** Lettuce通过使用NIO(非阻塞IO)和连接池技术,实现了高性能的数据传输与连接管理
2. **异步和响应式** 单个线程中处理多个并发请求,提高的吞吐量
3. **可靠性** 支持自动重连和故障转移
4. **可扩展性性** 支持连接池和集群模式

配置

@Configuration
public class RedisConfig {
    //序列化器 redisTemplate
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String,Object> redisTemplate=new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        //设置key的序列化器
        redisTemplate.setKeySerializer(new StringRedisSerializer());

        //设置value的序列化器
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

        return redisTemplate;
    }
}