「教3妹学Redis」:从入门到精通的Redis概述

发表时间: 2022-09-29 22:56

3妹

2哥:3妹,干嘛呢,要不要出去吃好吃的?
3妹:在学习Redis呢,发现我们公司很多地方都用到了这个中间件,可是我对Redis还不懂,所以想学习下。
2哥:是的,Redis是一个比较常用的中间件,尤其是缓存的场景。
3妹:恩,多学习学习,向2哥大神看齐~
2哥:哈哈,说的我都不好意思了,我也有很多不懂的。只是工作时间长,经验比你丰富一些。
3妹:2哥,Redis到底是什么?你给我讲讲呗
2哥:emm, 肚子饿了,等我吃饱了再说。
3妹:吃饭时间还早,先给我讲讲,呆会儿请你吃大餐。
2哥:好呀好呀,不许反悔啊。

讲课

1、Redis是什么?

Redis是一个开源的,基于内存的,也可进行持久化的,使用C语言编写的键值对存储数据库。
是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。
键的类型只能为字符串,值支持
五种数据类型:字符串、列表、集合、散列表、有序集合

2、Redis的五大数据类型

数据类型

可以存储的值

应用

STRING

字符串、整数或者浮点数

对整个字符串或者字符串的其中一部分执行操作;对整数和浮点数执行自增或者自减操作

LIST

列表

从两端压入或者弹出元素;对单个或者多个元素进行修剪,只保留一个范围内的元素

SET

无序集合

添加、获取、移除单个元素;检查一个元素是否存在于集合中;计算交集、并集、差集;从集合里面随机获取元素

HASH

包含键值对的无序散列表

添加、获取、移除单个键值对;获取所有键值对;检查某个键是否存在

ZSET

有序集合

添加、获取、删除元素;根据分值范围或者成员来获取元素;计算一个键的排名

2.1 STRING

image.png

> set hello worldOK> get hello"world"> del hello(integer) 1> get hello(nil)

2.2 LIST

image.png

> rpush list-key item(integer) 1> rpush list-key item2(integer) 2> rpush list-key item(integer) 3> lrange list-key 0 -11) "item"2) "item2"3) "item"> lindex list-key 1"item2"> lpop list-key"item"> lrange list-key 0 -11) "item2"2) "item"

2.3 SET

image.png

> sadd set-key item(integer) 1> sadd set-key item2(integer) 1> sadd set-key item3(integer) 1> sadd set-key item(integer) 0> smembers set-key1) "item"2) "item2"3) "item3"> sismember set-key item4(integer) 0> sismember set-key item(integer) 1> srem set-key item2(integer) 1> srem set-key item2(integer) 0> smembers set-key1) "item"2) "item3"

2.4 HASH

image.png

> hset hash-key sub-key1 value1(integer) 1> hset hash-key sub-key2 value2(integer) 1> hset hash-key sub-key1 value1(integer) 0> hgetall hash-key1) "sub-key1"2) "value1"3) "sub-key2"4) "value2"> hdel hash-key sub-key2(integer) 1> hdel hash-key sub-key2(integer) 0> hget hash-key sub-key1"value1"> hgetall hash-key1) "sub-key1"2) "value1"

2.5 ZSET

image.png

> zadd zset-key 728 member1(integer) 1> zadd zset-key 982 member0(integer) 1> zadd zset-key 982 member0(integer) 0> zrange zset-key 0 -1 withscores1) "member1"2) "728"3) "member0"4) "982"> zrangebyscore zset-key 0 800 withscores1) "member1"2) "728"> zrem zset-key member1(integer) 1> zrem zset-key member1(integer) 0> zrange zset-key 0 -1 withscores1) "member0"2) "982"


3、使用场景

缓存

是Redis最常用的一种场景,将热点数据放到内存中,设置内存的最大使用量以及淘汰策略来保证缓存的命中率。

计数器

可以对 String 进行自增自减运算,从而实现计数器功能。
Redis 这种内存型数据库的读写性能非常高,很适合存储频繁读写的计数量。

查找表

例如 DNS 记录就很适合使用 Redis 进行存储。
查找表和缓存类似,也是利用了 Redis 快速的查找特性。但是查找表的内容不能失效,而缓存的内容可以失效,因为缓存不作为可靠的数据来源。

消息队列

List 是一个双向链表,可以通过 lpop 和 lpush 写入和读取消息。
不过最好使用 Kafka、RabbitMQ 等消息中间件。

会话缓存

可以使用 Redis 来统一存储多台应用服务器的会话信息。
当应用服务器不再存储用户的会话信息,也就不再具有状态,一个用户可以请求任意一个应用服务器,从而更容易实现高可用性以及可伸缩性。

分布式锁实现

在分布式场景下,无法使用单机环境下的锁来对多个节点上的进程进行同步。
可以使用 Reids 自带的 SETNX 命令实现分布式锁,除此之外,还可以使用官方提供的 RedLock 分布式锁实现。

其它

Set 可以实现交集、并集等操作,从而实现共同好友等功能。
ZSet 可以实现有序性操作,从而实现排行榜等功能。