Redis --- 八种数据类型(基本命令)

Redis --- 八种数据类型(基本命令),第1张

String、Hash、List、Set和Zset。

等同于java中的, Map<String,String> string 是redis里面的最基本的数据类型,一个key对应一个value。

应用场景 :String是最常用的一种数据类型,普通的key/value存储都可以归为此类,如用户信息,登录信息和配置信息等;

实现方式 :String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr、decr等 *** 作(自增自减等原子 *** 作)时会转成数值型进行计算,此时redisObject的encoding字段为int。

Redis虽然是用C语言写的,但却没有直接用C语言的字符串,而是自己实现了一套字符串。目的就是为了提升速度,提升性能。 Redis构建了一个叫做简单动态字符串(Simple Dynamic String),简称SDS。

Redis的字符串也会遵守C语言的字符串的实现规则,即 最后一个字符为空字符。然而这个空字符不会被计算在len里头。

Redis动态扩展步骤:

Redis字符串的性能优势

常用命令 :set/get/decr/incr/mget等,具体如下;

ps:计数器(字符串的内容为整数的时候可以使用),如 set number 1。

补充:

等同于java中的: Map<String,Map<String,String>> ,redis的hash是一个string类型的field和value的映射表, 特别适合存储对象。 在redis中,hash因为是一个集合,所以有两层。第一层是key:hash集合value,第二层是hashkey:string value。所以判断是否采用hash的时候可以参照有两层key的设计来做参考。并且注意的是, 设置过期时间只能在第一层的key上面设置。

应用场景 :我们要存储一个用户信息对象数据,其中包括用户ID、用户姓名、年龄和生日,通过用户ID我们希望获取该用户的姓名或者年龄或者生日;

实现方式 :Redis的Hash实际是内部存储的Value为一个HashMap,并提供了直接存取这个Map成员的接口。如,Key是用户ID, value是一个Map。 这个Map的key是成员的属性名,value是属性值 。这样对数据的修改和存取都可以直接通过其内部Map的Key(Redis里称内部Map的key为field), 也就是通过 key(用户ID) + field(属性标签) 就可以 *** 作对应属性数据。 当前HashMap的实现有两种方式 :当HashMap的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,这时对应的value的redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时redisObject的encoding字段为int。

常用命令 :hget/hset/hgetall等,具体如下:

等同于java中的 Map<String,List<String>> ,list 底层是一个链表,在redis中,插入list中的值,只需要找到list的key即可,而不需要像hash一样插入两层的key。 list是一种有序的、可重复的集合。

应用场景 :Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现;

实现方式 :Redis list的实现为一个 双向链表 ,即可以支持反向查找和遍历,更方便 *** 作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括 发送缓冲队列 等也都是用的这个数据结构。

常用命令 :lpush/rpush/lpop/rpop/lrange等,具体如下:

性能总结 :

它是一个字符串链表,left、right都可以插入添加。

等同于java中的 Map<String,Set<String>> ,Set 是一种无序的,不能重复的集合。并且在redis中,只有一个key它的底层由hashTable实现的,天生去重。

应用场景 :Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动去重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且 set提供了判断某个成员是否在一个set集合内的重要接口 ,这个也是list所不能提供的;如保存一些标签的名字。标签的名字不可以重复,顺序是可以无序的。

实现方式 :set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。

常用命令 :sadd/spop/smembers/sunion等,具体如下:

ZSet(Sorted Set:有序集合) 每个元素都会关联一个double类型的分数score,分数允许重复,集合元素按照score排序( 当score相同的时候,会按照被插入的键的字典顺序进行排序 ),还可以通过 score 的范围来获取元素的列表。

应用场景 :Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以 通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。 当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。

底层实现 : zset 是 Redis 提供的一个非常特别的数据结构,常用作排行榜等功能,以用户 id 为 value ,关注时间或者分数作为 score 进行排序。实现机制分别是 zipList 和 skipList 。规则如下:

zipList:满足以下两个条件

skipList:不满足以上两个条件时使用跳表、组合了hash和skipList

为什么用skiplist不用平衡树?

主要从内存占用、对范围查找的支持和实现难易程度这三方面总结的原因。

拓展:mysql为什么不用跳表?

常用命令 :zadd/zrange/zrem/zcard等;

官网地址: >

KEYS pattern

查找所有符合给定模式 pattern 的 key 。

KEYS 匹配数据库中所有 key 。

KEYS hllo 匹配 hello , hallo 和 hxllo 等。

KEYS hllo 匹配 hllo 和 heeeeello 等。

KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。

特殊符号用 \ 隔开

KEYS 的速度非常快,但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据集中查找特定的 key ,你最好还是用 Redis 的集合结构(set)来代替。

1、执行如图是命令,查看redis服务是否启动。

2、执行命令“redis-cli”进入redis命令行界面。

3、执行命令“dbsize”。

4、执行命令“flushall”刷新清除。

5、执行命令“ keys  ”进行验证redis是否为空,可以看到redi数据。

我们知道Redis默认有16个数据库,默认是第0个数据库,那么如果在需要对数据库进行切换的时候,我们就可以使用下面这个命令:

使用如下命令进行切换

如果想要清除指定某一个数据库的数据

清除所有数据库的数据

接下来这个命令应该是最常用的了

平常在开发中,我们还需要经常对key进行判断,判断其是否存在

因为我们设置的缓存数据一般都不能是永久的,这个时候就需要我们在存储数据的时候,就为其设置过期时间。

string类型是Redis中五大基本数据类型之一,这也是最常使用到的一个数据类型,所有很多小伙伴们对Redis的认识和 *** 作就仅仅的停留在了对Redis的 *** 作层面,但是你是否知道string类型中的相关命令,还是有非常多实用的

接下来先看一下对string类型进行基本存储和获取的命令。

如果我们存储的string中的内容是数字的话,我们也可以对其进行增或减 *** 作,Redis可以自动的对字符串进行相关的 *** 作。实现的命令如下:

使用msetnx时,同时设置一个或多个 key-value 对,当且仅当所有给定 key都不存在时才成立。

getset命令从字面意思就可以看出来,他的作用是先get再set。

总结string类似的使用场景:

在使用list类型进行存取的时候,有两个命令需要进行区分:

注意:只有pop和push才分左右,其他的l都是list的意思

总结:

总结set集合一般用于元素的不重复的场景,比如抽奖系统,轮播等场景下

在使用hash集合的时候,要注意,hash其实就是一个Map集合,key-map的时候,值是一个map集合的形式进行存储的,也和Java中的hashmap有一个类似。

HVALS获取所有的value,HKEYS获取所有的key,HGETALL获取所有的键值

总结:

hash可以用于存储变更的数据,比如user,name,age等,尤其是用户信息之类的,hash更加适合用于对象的存储,string更加适合用于字符串的存储。

在set集合的基础上增加一个序列号,来进行排序

ZRANGEBYSCORE使用语法

总结

以上是在对五种数据类型进行存取时的一些常用命令 *** 作。关于其他的命令使用,小伙伴们在用到的时候可以直接入官网查看就可以了。

你好,Redis哨兵

Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工将从节点晋升为主节点,同时还要通知应用方更新主节点地址,对于很多应用场景这种故障处理的方式是无法接受的。可喜的是Redis从28开始正式提供了Redis Sentinel (哨兵)架构来解决这个问题,本章会对Redis Sentinel进行详细分析。

基本概念

名词 逻辑结构 物理结构 主节点 Redis主服务 一个独立的Redis进程 从节点 Redis从服务 一个独立的Redis进程Redis数据节点 主节点和从节点 主节点和从节点的进程 Sentinel节点 监控Redis数据节点 一个独立的Sentinel进程 Sentinel节点集合 若干个Sentinel节点的抽象组合 若干个Sentinel节点进程 Redis Sentinel Redis高可用方案Sentinel节点集合和Redis数据及诶单进程

主从复制的问题

Redis的主从复制模式可以将主节点的数据改变同步给从节点,这样从节点就可以起到两个作用:第一,作为主节点的一个备份,一旦主节点出了故障不可达的情况,从节点可以作为后备“顶”上来,并且保证数据尽量不丢失(主从复制是最终一致性)。 第二,从节点可以扩展主节点的读能力,一旦主节点不能支撑住大并发量的读 *** 作,从节点可以在一定程度上帮助主节点分担读压力。 但是主从复制也带来了以下问题: (1)一旦主节点出现故障,需要手动将一个从节点晋升为主节点,同时需要修改应用方的主节点地址,还需要命令其他从节点去复制新的主节点,整个过程都需要人工干预。 (2)主节点的写能力受到单机的限制。 (3)主节点的存储能力受到单机的限制。

高可用

Redis主从复制模式下,一旦主节点出现了故障不可达,需要人工干预进行故障转移无论对于Redis的应用方还是运维方都带来了很大的不便。对于应用方来说无法及时感知到主节点的变化,必然会造成一定的写数据丢失和读数据错误,甚至可能造成应用方服务不可用。对于Redis的运维方来说,整个故障转移的过程是需要人工来介入的,故障转移实时性和准确性上都无法得到保障,一个1主2从的Redis主从复制模式下的主节点出现故障后,是如何进行故障转移的。 1)主节点发生故障后,客户端(client)连接主节点失败,两个从节点与主节点连接失败造成复制中断。 2)如果主节点无法正常启动,需要选出一个从节点(slave-1),对其执行slaveof no one命令使其成为新的主节点。 3)原来的从节点(slave-1)成为新的主节点后,更新应用方的主节点信息,重新启动应用方 4)客户端命令另一个从节点(slave-2)去复制新的主节点(new-master) 5)待原来的主节点恢复后,让它去复制新的主节点。上述处理过程就可以认为整个服务或者架构的设计不是高可用的,因为整个故障转移的过程需要人为介入。考虑到这点,有些公司把上述流程自动化了,但是仍然存在如下问题:第一,断节点不可达的机制是否健全和标准。第二,如果有多个从节点,怎样保证只有一个被晋升为主节点。第三,通知客户端新的主节点机制是否足够强壮。Redis Sentinel正是用于解决这个问题。

Redis Sentinel的高可用性当主节点出现故障时, Redis Sentinel能自动完成故障发现和故障转移,并通知应用方,从而实现真正的高可用。Redis Sentinel是一个分布式架构,其中包含若干个Sentinel节点和Redis数据节点,每个Sentinel节点会对数据节点和其余Sentinel节点进行监控,当它发现节点不可达时,会对节点做下线标识。如果被标识的是主节点,它还会和其他Sentinel节点进行“协商”,当大多数Sentinel节点都认为主节点不可达时,它们会选举出一个Sentinel节点来完成第六章sentinelmd2020/3/132 / 4自动故障转移的工作,同时会将这个变化实时通知给Redis应用方。整个过程完全是自动的,不需要人工来介入,所以这套方案很有效地解决了Redis的高可用问题。Redis Sentinel与Redis主从复制模式只是多了若于Sentinel节点,所以Redis Sentinel并没有针对Redis节点做了特殊处理,这里是很多开发和运维人员容易混淆的。从逻辑架构上看, Sentinel节点集合会定期对所有节点进行监控,特别是对主节点的故障实现自动转移。假设我们现在有一个主节点,两个从节点和三个Sentinel节点组成的Redis Sentinel的例。 整个故障转移的处理逻辑有下面4个步骤: 1)主节点出现故障,此时两个从节点与主节点失去连接,主从复制失败 2)每个Sentinel节点通过定期监控发现主节点出现了故障。 3)多个Sentinel节点对主节点的故障达成一致,选举出其中一个sentinel节点作为领导者负责故障转移。 4)Sentinel领导者节点执行了故障转移。通过上面介绍的Redis Sentinel逻辑架构以及故障转移的处理,可以看出Redis Sentinl具有以下几个功能: (1)监控: Sentinel节点会定期检测Redis数据节点、其余Sentinel节点是否可达。 (2)通知: Sentinel节点会将故障转移的结果通知给应用方。 (3)主节点故障转移:实现从节点晋升为主节点并维护后续正确的主从关系。 (4)配置提供者:在Redis Sentinel结构中,客户端在初始化的时候连接的是Sentinel节占 集合,从中获取主节点信息。同时看到, Redis Sentinel包含了若干个Sentinel节点,这样做也带来了两个好处: (1)对于节点的故障判断是由多个Sentinel节点共同完成,这样可以有效地防止误判。 (2)Sentinel节点集合是由若干个Sentinel节点组成的,这样即使个别Sentinel节点不可用,整个Sentinel节点集合依然是健壮的。 但是Sentinel节点本身就是独立的Redis节点,只不过它们有一些特殊,它们不存储数据,只支持部分命令。

以上就是关于Redis --- 八种数据类型(基本命令)全部的内容,包括:Redis --- 八种数据类型(基本命令)、Redis-cli详解、redis 中支持中文key么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9773288.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存