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 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 进阶-持久化: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。 - 成本不同
- 消息队列的优劣对比