redis

一个高性能的key-value非关系型数据库

Posted by 果然 on June 1, 2022

redis

REmote DIctionary Server(Redis)是一个key-value存储系统,是跨平台的非关系型数据库,遵循BSD协议、支持网络、可基于内存、分布式、可选持久性的键值对(key-value)存储数据数据库,并提供多种语言的API。
redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。

redis 与其他 key-value 缓存产品的特点

  • redis 支持数据的持久化,可将内存中数据保存在磁盘中,重启时候可以再次加载进行使用。
  • redis 不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • redis 支持数据的备份,即master-slave模式的数据备份。

redis 数据类型

redis 支持五种数据类型:string,hash,list,set,zset(有序集合)。
-1. String
String 是redis最基本的类型,是二进制安全的,最大能存储512MB.

SET runoob "菜鸟教程"
GET runoob

-2. Hash
redis hash 是一个键值对集合。redis hash是一个string类型的field和value的映射表,特别适合存储对象。每个hash可以存储2^23 -1键值对。

HSET runoob field1 "hello" field2 "world"
HGET runoob field1
HGET runoob field2
HGETALL runoob

-3. List
redis 列表是简单的字符串列表,按照插入顺序排序,最多可存储2^23 -1 元素

DEL runoob
lpush runoob redis
lpush runoob mongodb
lpush runoob rabbitmq
lrange runoob 0 10 

-4. Set
redis 的 Set 是 string类型的无需集合,通过哈希表实现的,可添加、删除、查找的复杂度均为O(1)。集合内元素的唯一性,第二次插入的元素将被忽略。

sadd runoob redis
sadd runoob mongodb
sadd runoob rabbitmq
sadd runoob rabbitmq
smembers runoob

-5. zset
redis zset和set一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。通过分数来为集合汇总成员进行从小到大的排序,zset的成员是唯一的,但分数却可以重复。

del runoob
zadd runoob 0 redis
zadd runoob 0 mongodb
zadd runoob 0 rabbitmq
zadd runoob 0 rabbitmq
zrangebyscore runoob 0 1000  
zrange runoob 0 10 withscores

HyperLogLog

redis HyperLogLog 是用来做基数统计的算法,优点在于,在输入元素的数量或体积非常大时,计算基数所需空间总是固定的、并且很小的。

PFADD runoobkey "redis"
PFADD runoobkey "mongodb"
PFADD runoobkey "mysql"
PFCOUNT runoobkey    // 返回基数估算值

redis 发布订阅

redis 发布订阅(publish/subscribe)是一种消息通信模式:发送这发送消息,订阅者接受消息。
开启两个 redis-cli 客户端。
redis p/s

缺点:消息无法持久化。

redis Stream

redis Stream 主要用于消息队列,提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。

// redis 性能测试  
// 该命令是在redis目录下执行,而非redis客户端的内部指令
// -n 指定请求数    -q 强制退出redis,仅显示query/sec值
redis-benchmark -n 10000 -q

redis 分布式锁的使用和实现原理详解

  • 为什么使用分布式锁?
    本地锁的局限性(本地锁只能锁住当前服务,只能保证自己的服务,只有一个线程可以访问。)和分布式锁的概念(分布式锁是指:所有服务中的所有线程都去获得一把锁,但只有一个线程可以成功获得锁,其他没有获得锁的线程必须全部等待,等到获得锁的线程释放掉锁之后获得了锁才能进行操作。)
  • Redisson
    在高并发场景下,使用较成熟的框架。
    @Resource
    private Redisson redisson;
    RLock redissonLock = redisson.getLock()     // 获取锁
    redissonLock.lock()    // 加锁 锁续命
    redissonLock.unlock()  // 释放锁
    
  • 上述redis分布式锁的缺点
    在 redis master实例宕机的时候,可能导致多个客户端同时完成加锁。
  • redis 分布式锁的底层原理
    redis锁

redis 进阶-持久化:RDB和AOF机制

  • 为什么需要持久化?
    redis是基于内存的数据库,服务一旦宕机,内存中的数据将全部丢失。
  • redis 持久化方式? 重点学习RDB和AOF?
    redis 服务提供四种持久化存储方案:RDB、AOF、虚拟内存(VM)和DISKSTORE.
    RDB(Redis Database)持久化:将当前进程数据生成快照保存到磁盘上的过程,由于是某一时刻的快照,那么快照中的值要早于或者等于内存中的值。
    -1. 触发方式:手动触发(save和bgsave命令)和自动触发。
    AOF 日志采用写后日志,即先写内存,后写日志。
    AOF 日志记录redis的每个写命令,步骤分为:命令追加(append)、文件写入(write)和文件同步(sync)。

你知道Kafka和Redis的各自优缺点吗?一文带你优化选择

redis 中有一个queue的数据类型,用来做发布/订阅系统,就可以与kafka进行对比了。
此时,二者的区别与联系:

  • 存储介质不同
    redis queue 存储在内存中,kafka 存储在硬盘上。
  • 性能不同
    只有在一些高并发场景下需要使用redis queue。
  • 成本不同
  • 消息队列的优劣对比