Redis的使用 | 青训营

53 阅读12分钟

20230426170716.png

一、Redis 入门概述

Redis:REmote Dictionary Server(远程字典服务器)

Redis是完全开源的,使用ANSIC语言编写遵守BSD协议,是一个高性能的Key-Value数据库提供的丰富的数据结构,例如String、Hash、List、Set、SortedSet等等。数据是存在内存中的,同时Redis支持事务、持久化、LUA脚本、发布/订阅、缓存淘汰、流技术等多种功能特性提供了主从模式、Redis Sentinel和Redis Cluster集群架构方案。

1.1 主流功能与应用

  • 分布式缓存,挡在mysql数据库之前的带刀护卫。与传统数据库关系(mysql)相比,Redis是key-value数据库(NoSQL一种),mysql是关系型数据库,Redis数据操作主要在内存,而mysql主要存储在磁盘;Redis在某一些场景使用中要明显优于mysql,eg:计数器,排行榜等方面,Redis通常用于一些特定场景,需要与mysql一起配合使用。两者并不是相互替换和竞争的关系,而是共用和配合使用。

20230502220946.png

  • 内存存储和持久化(RDB+AOF),Redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务

  • 高可用架构搭配

    • 单机
    • 主从
    • 哨兵
    • 集群
  • 缓存穿透、击穿、雪崩

  • 分布式锁

  • 队列,Reids提供list和set操作,这使得Redis能作为一个很好的消息队列平台来使用。 我们常通过Reids的队列功能做购买限制。比如到节假日或者推广期间,进行一些活动, 对用户购买行为进行限制,限制今天只能购买几次商品或者一段时间内只能购买一次。也比较适合适用。

  • 排行榜+点赞,Redis提供的zset数据类型能够快速实现这些复杂的排行榜。

20230503205045.png

1.2 Redis优势

  • 性能极高-Redis能读的速度是110000次/秒,写的速度是81000次/秒

  • Redis数据类型丰富,不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用

  • Redis支持数据的备份,即master-slave模式的数据备份

20230503210147.png

Redis10大数据类型

redis的key的类型都是字符串,value有以下十大数据类型 

20230503214339.png

帮助命令,help @类型: 

help @string

help @list

help @hash

help @hyperloglog

命令不区分大小写,而key是区分大小写的: 

eg:

keys *:查看当前库所有的key

exists key:判断某个key是否存在

type key:查看你的key是什么类型

del key:删除指定的key数据

unlink key:非阻塞删除,仅仅将keys从keyspace元数据中删除,真正删除会在后续异步中操作

ttl key:查看还有多少秒过期,-1表示永不过期,-2表示已过期

expire key:为给定的key设置过期时间

move key dbindex[0 - 15]:将当前数据库的key移动到给定的数据库db当中

select dbindex:切换数据库[0 - 15],默认为0

dbsize:查看当前数据库key的数量

flushdb:清空当前库

flushall:通杀全部库

3.1 String(字符串)类型

string 是 redis 最基本的类型,一个key对应一个value。

string类型是二进制安全的,意思是redis的string可以包含任何数据,eg:jpg图片或者序列化的对象。

string类型是redis最基本的数据类型,一个redis中字符串value最多可以是512M。

常用命令: 

序号命令作用
1set key value设置指定key的值
2get key获取指定key的值
3getrange key start end返回key中字符串值的子字符
4getset key value将给定key的值设为value
5getbit key offset对key所储存的字符串值,获取指定偏移量上的位(bit)
6mget key1 [key2]获取所有(一个或多个)给定key的值
7setbit key offset value对key所储存的字符串值,设置或清楚指定偏移量上的位(bit)
8setex key seconds value将值value关联到key,并将key的过期时间设为seconds(以秒为单位)
9setnx key value只有在key不存在时设置key的值
10setrange key offset value用value参数覆写给定key所储存的字符串值,从偏移量offset开始
11strlen key返回key所储存的字符串值的长度
12mset key value [key value……]同时设置一个或多个key-value对
13msetnx key value [key value……]同时设置一个或多个key-value对,当且仅当所有给定key都不存在
14psetex key milliseconds value将值value关联到key,并将key的过期时间设为milliseconds(以毫秒为单位)
15incr key将key中储存的数字值增一
16incrby key increment将key所储存的值加上给定的增量值(increment)
17incrbyfloat key increment将key所储存的值加上给定的浮点增量值(increment)
18decr key将key中储存的数字值减一
19decrby key decrement将key所储存的值减去给定的减量值(decrement)
20append key value如果key已经存在并且是一个字符串,append命令将value追加到key原来的值的末尾

应用场景:

+ 抖音无限点赞某个视频或作品,点一下加一次
+ 是否喜欢的文章

3.2 List(列表)类型

redis列表是简单的字符串列表,按照插入顺序排序。可以从列表的头部(左边)或者尾部(右边)进行添加。

它的底层实际是个 双端链表 ,最多可以包含2^32 - 1个元素(4294967295,每个列表超过40亿个元素)。主要功能有push/push等,一般用在栈、队列、消息队列等场景。

left、right都可以插入添加:

如果键不存在,创建新的链表;

如果键已存在,新增内容;

如果值全移除,对应的键也就消失了。

它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

双向链表.png

常用命令: 

序号命令作用
1blpop key1 [key2] timeout移出并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
2brpop key1 [key2] timeout移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
3brpoplpush source destination timeout从列表中弹出一个值,将弹出的元素插入到另一个列表中并返回它;如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
4lindex key index通过索引获取列表中的元素
5linsert key beforeafter pivot value在列表的元素前或后插入元素
6llen key获取列表长度
7lpop key移除并获取列表的第一个元素
8lpush key value1 [value2]将一个或多个值插入到列表头部
9lrange key start stop获取列表指定范围内的元素
10lrem key count value移除列表元素
11lpushx key value将一个或多个值插入到已存在的列表头部
12lset key index value通过索引设置列表元素的值
13ltrim key start stop对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素将被删除
14rpop key移除并获取列表最后一个元素
15rpoplpush source destination移除列表的最后一个元素,并将该元素添加到另一个列表并返回
16rpush key value1 [value2]在列表中添加一个或多个值
17rpushx key value为已存在的列表添加值

 应用场景:微信公众号订阅的消息 

3.3 Hash(哈希表)类型

hash 是一个 string类型的 field(字段)和 value(值)的映射表,hash特别适合用于存储对象。redis中的每个hash可以存储2^32 - 1 键值对(40多亿)。

KV模式不变,但V是一个键值对。Map<String, Map<Object, Object>>

序号命令作用
1hdel key field1[field2]删除一个或多个哈希表字段
2hexists key field查看哈希表key中,指定的字段是否存在
3hget key field获取存储在哈希表中指定字段的值
4hgetall key获取在哈希表中指定key的所有字段和值
5hincrby key field increment为哈希表key中的指定字段的整数值加上增量increment
6hincrbyfloat key field increment为哈希表key中的指定字段的浮点数值加上增量increment
7hkeys key获取所有哈希表中的字段
8hlen key获取所有哈希表中的字段
9hmget key field1 [field2]获取所有给定字段的值
10hmset key field1 value1 [field2 value2]同时将多个field-value(域-值)对设置到哈希表key中
11hset key field value将哈希表key中的字段field的值设为value
12hsetnx key field value只有在字段field不存在时,设置哈希表字段的值
13hvals key获取哈希表中所有值
14hscan key cursor [MATCH pattern] [COUNT count]迭代哈希表中的键值对

应用场景:JD购物车早期设计 目前不再采用,当前小中厂可用 

3.4 Set(集合)

无序无重复 

有序有重复 

redis 的 set 是 String 类型的 无序集合 。集合成员是唯一的,且集合中无重复的数据,集合的对象编码可以是intset或者hashtable。

redis中的set集合是通过哈希表实现的,故添加、删除、查找的复杂度都是O(1)。

集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)

3.5 ZSet(有序集合)

zset(sorted set:有序集合)

redis中的zset和set一样也是String类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个double类型的分数 ,redis正是通过分数(score)来为集合中的成员进行从小到大的排序。

zset的成员是唯一的,但分数(score)却可以重复。

zset的集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为2^32 - 1

3.6 GEO(地理空间)

Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,包括

  • 添加地理位置的坐标。
  • 获取地理位置的坐标。
  • 计算两个位置之间的距离。
  • 根据用户给定的经纬度坐标来获取指定范围内的地理位置集合

3.7 HyperLogLog (基数统计)

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

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

3.8 bitmap(位图)

图片1.png

由0和1状态表现的二进制位的bit数组

3.9 bitfield(位域)

通过bitfield命令可以一次性操作多个比特位域(指的是连续的多个比特位),它会执行一系列操作并返回一个响应数组,这个数组中的元素对应参数列表中的相应操作的执行结果。

3.10 Stream(流)

Redis Stream 是 Redis 5.0 版本新增加的数据结构。

Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。

简单来说发布订阅 (pub/sub) 可以分发消息,但无法记录历史消息。

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

3.11 Redis常用命令

序号操作作用
1del key用于key存在时删除key
2dump key序列化给定的key,并返回被序列化的值
3exists key检查给定的key是否存在
4expire key为给定的key设置过期时间
5expireat key timestampexpireat的作用和expire类似,都用于key设置过期时间。不同在于expireat命令模式接受的时间参数时UNIX时间戳(unix timestamp)
6pexpire key milliseconds设置key的过期时间以毫秒计
7pexpireat key milliseconds-timesstamp设置key过期时间的时间戳(unix timestamp)以毫秒计
8keys pattern查找所有符合给定模式(pattern)的key
9move key db将当前数据库的key移动到给定的数据库db当中
10persist key移除key的过期时间,key将持久保持
11pttl key以毫秒为单位返回key的剩余过期时间
12ttl key以秒为单位,返回给定key的剩余生存时间(TTL,time to time)
13randomkey从当前数据库中随机返回一个key
14rename key newkey修改key的名称
15renamenx key newkey仅当newkey不存在时,将key改为newkey
16type key返回key所储存的值的类型

未完后续补😭