Redis知识总结

Nosql是NotOnlySQL的缩写,主要用于处理大规模数据分布式、高并发的场景。Redis作为NoSQL数据库的一种,以其内存存储、持久化、高效率和丰富的数据类型等特点,成为快速发展的键值存储系统。Redis支持字符串、列表、集合、有序集合等多种数据类型,适用于缓存、计数器、发布订阅等多种应用场景。
摘要由CSDN通过智能技术生成

什么是Nosql

NoSQL = Not Only SQL(不仅仅是SQL)

Not Only Structured Query Language

关系型数据库:列+行,同一个表下数据的结构是一样的。

非关系型数据库:数据存储没有固定的格式,并且可以进行横向扩展。

NoSQL泛指非关系型数据库,随着web2.0互联网的诞生,传统的关系型数据库很难对付web2.0时代!尤其是超大规模的高并发的社区,暴露出来很多难以克服的问题,NoSQL在当今大数据环境下发展的十分迅速,Redis是发展最快的。

Nosql特点

  1. 方便扩展(数据之间没有关系,很好扩展!)

  1. 大数据量高性能(Redis一秒可以写8万次,读11万次,NoSQL的缓存记录级,是一种细粒度的缓存,性能会比较高!)

  1. 数据类型是多样型的!(不需要事先设计数据库,随取随用)

  1. 传统的 RDBMS 和 NoSQL

Redis能该干什么?

  1. 内存存储、持久化,内存是断电即失的,所以需要持久化(RDB、AOF)

  1. 高效率、用于高速缓冲

  1. 发布订阅系统

  1. 地图信息分析

  1. 计时器、计数器(eg:浏览量)

Redis为什么单线程还这么快?

核心:Redis是将所有的数据放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文会切换:耗时的操作!),对于内存系统来说,如果没有上下文切换效率就是最高的,多次读写都是在一个CPU上的,在内存存储数据情况下,单线程就是最佳的方案。

Redis五大数据类型

Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库高速缓存消息队列代理。它支持字符串哈希表列表集合有序集合位图hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区

String(字符串)

命令

描述

示例

APPEND key value

向指定的key的value后追加字符串

127.0.0.1:6379> set msg hello OK 127.0.0.1:6379> append msg " world" (integer) 11 127.0.0.1:6379> get msg “hello world”

DECR/INCR key

将指定key的value数值进行+1/-1(仅对于数字)

127.0.0.1:6379> set age 20 OK 127.0.0.1:6379> incr age (integer) 21 127.0.0.1:6379> decr age (integer) 20

INCRBY/DECRBY key n

按指定的步长对数值进行加减

127.0.0.1:6379> INCRBY age 5 (integer) 25 127.0.0.1:6379> DECRBY age 10 (integer) 15

INCRBYFLOAT key n

为数值加上浮点型数值

127.0.0.1:6379> INCRBYFLOAT age 5.2 “20.2”

STRLEN key

获取key保存值的字符串长度

127.0.0.1:6379> get msg “hello world” 127.0.0.1:6379> STRLEN msg (integer) 11

GETRANGE key start end

按起止位置获取字符串(闭区间,起止位置都取)

127.0.0.1:6379> get msg “hello world” 127.0.0.1:6379> GETRANGE msg 3 9 “lo worl”

SETRANGE key offset value

用指定的value 替换key中 offset开始的值

127.0.0.1:6379> SETRANGE msg 2 hello (integer) 7 127.0.0.1:6379> get msg “tehello”

GETSET key value

将给定 key 的值设为 value ,并返回 key 的旧值(old value)。

127.0.0.1:6379> GETSET msg test “hello world”

SETNX key value

仅当key不存在时进行set

127.0.0.1:6379> SETNX msg test (integer) 0 127.0.0.1:6379> SETNX name sakura (integer) 1

SETEX key seconds value

set 键值对并设置过期时间

127.0.0.1:6379> setex name 10 root OK 127.0.0.1:6379> get name (nil)

MSET key1 value1 [key2 value2..]

批量set键值对

127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3 OK

MSETNX key1 value1 [key2 value2..]

批量设置键值对,仅当参数中所有的key都不存在时执行

127.0.0.1:6379> MSETNX k1 v1 k4 v4 (integer) 0

MGET key1 [key2..]

批量获取多个key保存的值

127.0.0.1:6379> MGET k1 k2 k3 1) “v1” 2) “v2” 3) “v3”

PSETEX key milliseconds value

和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,

getset key value

如果不存在值,则返回nil,如果存在值,获取原来的值,并设置新的值

String类似的使用场景:value除了是字符串还可以是数字,用途举例:

  • 计数器

  • 统计多单位的数量:uid:123666:follow 0

  • 粉丝数

  • 对象存储缓存

List(列表)

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

命令

描述

LPUSH/RPUSH key value1[value2..]

从左边/右边向列表中PUSH值(一个或者多个)。

LRANGE key start end

获取list 起止元素==(索引从左往右 递增)==

LPUSHX/RPUSHX key value

向已存在的列名中push值(一个或者多个)

LINSERT key BEFORE|AFTER pivot value

在指定列表元素的前/后 插入value

LLEN key

查看列表长度

LINDEX key index

通过索引获取列表元素

LSET key index value

通过索引为元素设值

LPOP/RPOP key

从最左边/最右边移除值 并返回

RPOPLPUSH source destination

将列表的尾部(右)最后一个值弹出,并返回,然后加到另一个列表的头部

LTRIM key start end

通过下标截取指定范围内的列表

LREM key count value

List中是允许value重复的 count > 0:从头部开始搜索 然后删除指定的value 至多删除count个 count < 0:从尾部开始搜索… count = 0:删除列表中所有的指定value。

BLPOP/BRPOP key1[key2] timout

移出并获取列表的第一个/最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

BRPOPLPUSH source destination timeout

和RPOPLPUSH功能相同,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

小结
  • list实际上是一个链表,before Node after , left, right 都可以插入值

  • 如果key不存在,则创建新的链表

  • 如果key存在,新增内容

  • 如果移除了所有值,空链表,也代表不存在

  • 在两边插入或者改动值,效率最高!修改中间元素,效率相对较低

应用:

消息排队!消息队列(Lpush Rpop),栈(Lpush Lpop)

Set(集合)

Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

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

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

命令

描述

SADD key member1[member2..]

向集合中无序增加一个/多个成员

SCARD key

获取集合的成员数

SMEMBERS key

返回集合中所有的成员

SISMEMBER key member

查询member元素是否是集合的成员,结果是无序的

SRANDMEMBER key [count]

随机返回集合中count个成员,count缺省值为1

SPOP key [count]

随机移除并返回集合中count个成员,count缺省值为1

SMOVE source destination member

将source集合的成员member移动到destination集合

SREM key member1[member2..]

移除集合中一个/多个成员

SDIFF key1[key2..]

返回所有集合的差集 key1- key2 - …

SDIFFSTORE destination key1[key2..]

在SDIFF的基础上,将结果保存到集合中==(覆盖)==。不能保存到其他类型key噢!

SINTER key1 [key2..]

返回所有集合的交集

SINTERSTORE destination key1[key2..]

在SINTER的基础上,存储结果到集合中。覆盖

SUNION key1 [key2..]

返回所有集合的并集

SUNIONSTORE destination key1 [key2..]

在SUNION的基础上,存储结果到及和张。覆盖

SSCAN KEY [MATCH pattern] [COUNT count]

在大量数据环境下,使用此命令遍历集合中元素,每次遍历部分

Hash(哈希)

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。

Set就是一种简化的Hash,只变动key,而value使用默认值填充。可以将一个Hash表作为一个对象进行存储,表中存放对象的信息。

命令

描述

HSET key field value

将哈希表 key 中的字段 field 的值设为 value 。重复设置同一个field会覆盖,返回0

HMSET key field1 value1 [field2 value2..]

同时将多个 field-value (域-值)对设置到哈希表 key 中。

HSETNX key field value

只有在字段 field 不存在时,设置哈希表字段的值。

HEXISTS key field

查看哈希表 key 中,指定的字段是否存在。

HGET key field value

获取存储在哈希表中指定字段的值

HMGET key field1 [field2..]

获取所有给定字段的值

HGETALL key

获取在哈希表key 的所有字段和值

HKEYS key

获取哈希表key中所有的字段

HLEN key

获取哈希表中字段的数量

HVALS key

获取哈希表中所有值

HDEL key field1 [field2..]

删除哈希表key中一个/多个field字段

HINCRBY key field n

为哈希表 key 中的指定字段的整数值加上增量n,并返回增量后结果 一样只适用于整数型字段

HINCRBYFLOAT key field n

为哈希表 key 中的指定字段的浮点数值加上增量 n。

HSCAN key cursor [MATCH pattern] [COUNT count]

迭代哈希表中的键值对。

Hash更适合于对象的存储

Zset(有序集合)

不同的是每个元素都会关联一个double类型的分数(score)。redis正是通过分数来为集合中的成员进行从小到大的排序。

score相同:按字典顺序排序

有序集合的成员是唯一的,但分数(score)却可以重复。

命令

描述

ZADD key score member1 [score2 member2]

向有序集合添加一个或多个成员,或者更新已存在成员的分数

ZCARD key

获取有序集合的成员数

ZCOUNT key min max

计算在有序集合中指定区间score的成员数

ZINCRBY key n member

有序集合中对指定成员的分数加上增量 n

ZSCORE key member

返回有序集中,成员的分数值

ZRANK key member

返回有序集合中指定成员的索引

ZRANGE key start end

通过索引区间返回有序集合成指定区间内的成员

ZRANGEBYLEX key min max

通过字典区间返回有序集合的成员

ZRANGEBYSCORE key min max

通过分数返回有序集合指定区间内的成员==-inf 和 +inf分别表示最小最大值,只支持开区间()==

ZLEXCOUNT key min max

在有序集合中计算指定字典区间内成员数量

ZREM key member1 [member2..]

移除有序集合中一个/多个成员

ZREMRANGEBYLEX key min max

移除有序集合中给定的字典区间的所有成员

ZREMRANGEBYRANK key start stop

移除有序集合中给定的排名区间的所有成员

ZREMRANGEBYSCORE key min max

移除有序集合中给定的分数区间的所有成员

ZREVRANGE key start end

返回有序集中指定区间内的成员,通过索引,分数从高到底

ZREVRANGEBYSCORRE key max min

返回有序集中指定分数区间内的成员,分数从高到低排序

ZREVRANGEBYLEX key max min

返回有序集中指定字典区间内的成员,按字典顺序倒序

ZREVRANK key member

返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序

ZINTERSTORE destination numkeys key1 [key2 ..]

计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中,numkeys:表示参与运算的集合数,将score相加作为结果的score

ZUNIONSTORE destination numkeys key1 [key2..]

计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中

ZSCAN key cursor [MATCH pattern\] [COUNT count]

迭代有序集合中的元素(包括元素成员和元素分值)

应用案例:

  • set排序 存储班级成绩表 工资表排序!

  • 普通消息,1.重要消息 2.带权重进行判断

  • 排行榜应用实现,取Top N测试

三种特殊数据类型

Geospatial(地理位置)

使用经纬度定位地理坐标并用一个有序集合zset保存,所以zset命令也可以使用

Hyperloglog(基数统计)

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

花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。

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

其底层使用string数据类型

什么是基数?

数据集中不重复的元素的个数。

应用场景:网页的访问量(UV):一个用户多次访问,也只能算作一个人。

传统实现,存储用户的id,然后每次进行比较。当用户变多之后这种方式及其浪费空间,而我们的目的只是计数,Hyperloglog就能帮助我们利用最小的空间完成

命令

描述

PFADD key element1 [elememt2..]

添加指定元素到 HyperLogLog 中

PFCOUNT key [key]

返回给定 HyperLogLog 的基数估算值。

PFMERGE destkey sourcekey [sourcekey..]

将多个 HyperLogLog 合并为一个 HyperLogLog

BitMaps(位图)

使用位存储,信息状态只有 0 和 1

Bitmap是一串连续的2进制数字(0或1),每一位所在的位置为偏移(offset),在bitmap上可执行AND,OR,XOR,NOT以及其它位操作。

什么是RDB

在指定时间间隔后,将内存中的数据集快照写入数据库 ;在恢复时候,直接读取快照文件,进行数据的恢复 ;默认情况下, Redis 将数据库快照保存在名字为 dump.rdb的二进制文件中。文件名可以在配置文件中进行自定义。

工作原理

在进行 RDB 的时候,redis 的主线程是不会做 io 操作的,主线程会 fork 一个子线程来完成该操作;

  1. Redis 调用forks。同时拥有父进程和子进程。

  1. 子进程将数据集写入到一个临时 RDB 文件中。

  1. 当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。

这种工作方式使得 Redis 可以从写时复制(copy-on-write)机制中获益(因为是使用子进程进行写操作,而父进程依然可以接收来自客户端的请求。)

触发机制

  1. save的规则满足的情况下,会自动触发rdb原则

  1. 执行flushall命令,也会触发我们的rdb原则

  1. 退出redis,也会自动产生rdb文件

save

使用 save 命令,会立刻对当前内存中的数据进行持久化 ,但是会阻塞,也就是不接受其他操作了;

使用 save 命令,会立刻对当前内存中的数据进行持久化 ,但是会阻塞,也就是不接受其他操作了;
flushall命令

flushall 命令也会触发持久化 ;

bgsave

bgsave 是异步进行,进行持久化的时候,redis 还可以将继续响应客户端请求 ;

bgsave和save对比

命令

save

bgsave

IO类型

同步

异步

阻塞?

是(阻塞发生在fock(),通常非常快)

复杂度

O(n)

O(n)

优点

不会消耗额外的内存

不阻塞客户端命令

缺点

阻塞客户端命令

需要fock子进程,消耗内存

持久化AOF

将我们所有的命令都记录下来,history,恢复的时候就把这个文件全部再执行一遍

什么是AOF

快照功能(RDB)并不是非常耐久(durable): 如果 Redis 因为某些原因而造成故障停机, 那么服务器将丢失最近写入、以及未保存到快照中的那些数据。 从 1.1 版本开始, Redis 增加了一种完全耐久的持久化方式: AOF 持久化。

如果要使用AOF,需要修改配置文件:

appendonly no yes则表示启用AOF

默认是不开启的,我们需要手动配置,然后重启redis,就可以生效了!

如果这个aof文件有错位,这时候redis是启动不起来的,我需要修改这个aof文件

redis给我们提供了一个工具redis-check-aof --fix

Redis主从复制

概念

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master/Leader),后者称为从节点(Slave/Follower), 数据的复制是单向的!只能由主节点复制到从节点(主节点以写为主、从节点以读为主)。

默认情况下,每台Redis服务器都是主节点,一个主节点可以有0个或者多个从节点,但每个从节点只能由一个主节点。

概念

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master/Leader),后者称为从节点(Slave/Follower), 数据的复制是单向的!只能由主节点复制到从节点(主节点以写为主、从节点以读为主)。

默认情况下,每台Redis服务器都是主节点,一个主节点可以有0个或者多个从节点,但每个从节点只能由一个主节点。

为什么使用集群

  1. 单台服务器难以负载大量的请求

  1. 单台服务器故障率高,系统崩坏概率大

  1. 单台服务器内存容量有限。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值