最近有一个去过Dadaqq.Com的用户在边肖问了我们一个问题,相信也是很多币圈朋友经常疑惑的问题:hget相关问题,韩国小孩';发饰相关问题,带着这个问题,让专业的边肖告诉你为什么。
?Redis的数据类型
Redis有五种数据类型:string、list、hash、set、zset;
字符串字符串比较正常。,key-value,类似hashmap的用法;
列表队列,可以双向存储值,设计时也可以简单的作为队列模式;
哈希字典,一个键对应多个值;
Set无序集;
Zset有序集;
listlist
Redislist是一个简单的字符串列表,按插入顺序排序。。您可以添加元素向导列表
list——基本命令
lpush
的头部(左)或尾部(右)。语法:lpush键值[value?]
功能:将一个或多个值插入列表键的表头(最左侧),从左侧添加值,从左向右插入表头。
返回值:数字,新列表长度
rpush
语法:rpush键值[value?]
函数:在列表键的页脚(最右边)插入一个或多个值,从左到右依次将每个值插入页脚
返回值:number,新列表的长度
。lrange
语法:lrangekeystartstop
功能:获取listkey中指定区间的元素,其中0代表list的第一个元素,1代表list的第二个元素;
start,
stop是列表的下标,也可以是负数的下标。-1表示列表的最后一个元素,-2表示列表的第二个倒数元素,依此类推。
开始站点不在列表范围内,没有错误。
返回值:指定间隔列表
lindex
语法:lindex关键字索引
函数:获取列表键中下标为指定索引的元素。列表元素不会被删除,只是被查询。
0代表列表的第一个元素,1代表列表的第二个元素;
开始,
stop是列表的下标值,也可以是负下标。-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,依此类推。
返回值:指定下标元素;索引不在列表中。,返回nil
llen
语法:llenkey
作用:获取列表键的长度。返回值:数值,列表的长度;密钥不存在。返回0
lrem。
语法:lrem键计数值
作用:根据参数count的值,删除列表中等于参数值的元素,
count0。,从列表的左边开始到右边;
count0从列表末尾删除;
count=0删除表中所有与值相等的值。
返回值:数值,删除的元素数
lset
语法:lsetkeyindexvalue
角色:将索引为列表键的元素的值设置为value。
返回值:设置成功,返回ok;键不存在或索引超出范围。返回错误消息
linsert
。Syntax:Perspectivevalue
after(front)|Function:
将值插入到列表键中值透视之前或之后的位置。
键不存在,pivot不在列表中,并且没有执行任何操作。
返回值:命令执行成功,返回新列表的长度。。找不到透视返回-1,键不存在返回0。
RPOpkey
删除列表中的最后一个元素,返回值是被删除的元素。
rpplpush源目标
删除列表的最后一个元素,将其添加到另一个列表中,并返回
LPOP关键字
。删除列表中的第一个元素,返回值是被删除的元素。场景
1时的
。消息队列
使用的是排队模式,原则是"左进右出"可以用,但不推荐。因为现在市面上有很多成熟的消息中间件,不需要造轮子;
2。排名
某段时间统计数据的排名可以放在列表中,如果需要分页的话。,或者可以使用lrangestartstop
3。listtypelpush命令和lrange命令可以实现最新列表的功能,每次通过lpush命令在列表中插入新元素。,然后通过lrange命令读取最新的元素列表,比如朋友圈的点赞和评论列表。
但是,并不是所有的最新列表都可以用该列表类型实现,因为对于频繁更新的列表,列表类型的分页可能会导致列表元素的重复或遗漏。比如当前列表从页眉到页脚有五个元素(e,d,c,b,a),每页得到三个元素。用户第一次获得三个元素(e,d,c),然后在头中添加一个元素F。列表变成(f,e,d,c,b,a)。此时用户取第二页,得到(C,b,a),元素C重复。。只列出不符合';不需要分页(比如一次只取列表的前五个元素)或者更新频繁(比如每天早上一次)适合用列表类型实现
hash类型hash
。Redihash是字符串类型的字段和值的映射表。hash特别适合存储对象,每个hash可以存储232-1个键值对(超过40亿)。
(XY001)哈希类型哈希——基本命令hset?/hget?/hmset?/hmget?/hgetall?hkeys?/hvals?/hexists
hset
语法:hset哈希表函数的关键字字段值
:如果关键字不存在,则将哈希表关键字中的字段值设置为value。,则创建一个新的哈希表,执行赋值,如果有字段,则值被覆盖。
返回值:如果该字段是哈希表中的新字段,且设置值成功,则返回1如果该字段已经存在。,旧值覆盖新值,返回0
hget
语法:hget关键字字段
角色:获取哈希表关键字
中给定字段的值。返回值:字段的值。如果键不存在或字段不存在,则返回nil
hmset
。语法:hmset关键字字段值[字段值?]
描述:将多个字段值同时设置到哈希表键中。,该命令将覆盖现有字段,哈希表键不存在,创建一个空哈希表,执行hmset。
返回值:设置成功,失败返回错误
。
语法:hmget关键字字段[field?]
函数:获取哈希表键中一个或多个给定字段的值
返回值:如果字段不存在,则返回字段顺序对应的值。,返回nil
hgetall
语法:hgetallkey
作用:获取哈希表中的所有字段和值key
返回值:以列表形式返回哈希表中字段和字段的值。,key不存在,空hash
hdel
语法:hdelkeyfield[field?]
角色:删除哈希表键中的一个或多个指定字段。,没有字段。直接忽略
返回值:成功删除的字段数
HKEYS
语法:HKEYSKY
。功能:查看哈希表关键字中的所有字段field
。返回值:包含所有字段的列表。该键不存在,返回一个空列表
hvals
。语法:hvalskey
函数:返回哈希表中所有字段的值:返回包含哈希表中所有字段的值的列表,key不存在,空列表
存在。
语法:Exists关键字字段
角色:检查哈希表关键字的给定字段中是否有
。返回值:如果有字段,返回1;否则,返回0
。使用场景
1、购物车
以用户id为键,以产品id为字段,以产品数量为值,正好构成了购物车的三个元素,如下图所示。
2。hash比较适合存储key字段值或者字典表(type,key,vlaue),刚好满足对象的元素,但是stringjson也可以存储。什么';这两者有什么区别?
?String?json?Hash
isveryefficient?Tall?High
capacity?Low?Low
灵活性?低?高
序列化?简单?复杂
如下:
一、string
string是redis最基本的类型,你可以理解为和Memcached一模一样的类型,一个键对应一个值。
字符串类型是二进制安全的。。表示redis可以包含任何数据的字符串。如jpg图片或序列化对象。
字符串类型是Redis最基本的数据类型,字符串类型的值最多可以存储512MB。。
命令:设置和获取命令。
2。Hash
Redihash是一组键=值对。
Redishash是字符串类型的字段和值的映射表,hash特别适合存储对象。
HMSET,HGET命令,HMSET设置两个field=value对,HGET获取对应字段对应的值。
三。list
List是一个简单的字符串列表,按照插入顺序排序。。您可以将元素添加到列表的头部(左侧)或尾部(右侧)。
该列表最多可以存储2321个元素(4294967295,每个列表可以存储40多亿)。
lpush设定值,l范围值。
四。集合
redis的集合是一个无序的字符串集合。集合是通过哈希表实现的。
将字符串元素添加到与key对应的set集合中。,使用sadd命令。返回1表示成功,0表示已经存在于集合中,返回错误表示key对应的集合不存在。
使用smembers命令进行查看。
集合中元素的唯一性,第二次插入的元素将被忽略。
集中的最大成员数是2321(4294967295,每个集可以存储超过40亿个成员)。
诉zset
Redis的zset是string类型元素的集合,就像set一样,不允许有重复成员。
区别在于每个元素都与一个double类型的分数相关联。。Redis通过分数将集合成员从小到大排序。zset的成员是唯一的,但是分数可以重复。
向集合中添加元素如果集合中存在该元素,则更新相应的score:zaddkeyscore成员。
Redis数据模型:
Redis的外围由一个键和值映射的字典组成。。与其他非关系数据库的主要区别在于Redis中值的类型不限于字符串,还支持以下抽象数据类型:
1。字符串列表。
2。一组不重复的无序字符串。
3。有序且不重复的字符串集合。
4。包含所有字符串的键和值的哈希表。
值的类型决定了值本身支持的操作。Redis支持不同的无序列表和有序列表。高级的服务器端原子操作,例如无序集和有序集之间的交集和并集。
接口异常是指服务器崩溃,网络导致视频播放失败,接口异常。
检查您的网络是否已成功连接,以及网络速度是否受限。连接成功后再次登录,就可以看自己想看的视频了。
字符串、哈希、列表、集合和Zset。
相当于java中的。,MapString,Stringstring是redis中最基本的数据类型,一个键对应一个值。
应用场景:字符串是最常用的数据类型。普通的键/值存储可以归为这一类,比如用户信息、登录信息、配置信息;
实现方式:redis中存储的字符串默认为字符串,被redisObject引用。遇到incr、decr等运算(自增自减等原子运算)时,会转换成数值型进行计算,redisObject的编码字段为int。
Redis是用c语言写的。但是我们没有直接使用C语言的字符串,而是自己实现了一套字符串。目的是提高速度和性能。Redis构造了一个简单的动态字符串,简称SDS。
redis的字符串也会遵循C语言中字符串的实现规则,即最后一个字符为空字符。但是,这个空字符在len中不会被计算在内。
Redis动态扩展步骤:
redis字符串的性能优势
常用命令:set/get/decr/incr/mget等。如下所示;
ps:counter(当字符串的内容是整数时使用),suchassettingNo.1.
Supplement:
isequivalentto:mappingstring,mappingstring,stringinJavalanguage(acomputerlanguage,especiallyforcreatingwebsites).redis的hash是字符串类型的字段和值的映射表,特别适合存储对象。在redis中,hash有两层,因为它是一个集合。第一层是关键:散列集值。第二层是Hashkey:StringValue。所以在判断是否使用hash时,可以参考有两层密钥的设计,以供参考。并且注意,设置过期时间只能在第一层的密钥上设置。
应用场景:我们想存储一个用户信息对象数据,包括用户ID、用户名、年龄和生日,我们希望获得用户';的姓名或年龄或生日;
实现:Redis的Hash其实就是内部存储的值是一个HashMap,提供了直接访问这个Map成员的接口。例如,键是用户ID,值是映射。。这个映射的键是成员的属性名,值是属性值。这样就可以直接通过其内部映射的键(Redis中内部映射的键称为field)对数据进行修改和访问,也就是通过key(用户ID)field(属性标签)对相应的属性数据进行操作。。目前HashMap的实现方式有两种:当HashMap的成员较少时,Redis为了节省内存,会使用类似一维数组的方式进行紧凑存储,而不是使用真正的HashMap结构。这时,相应值的编码';的redisObject是zipmap,当成员数量增加时会自动转换成真正的HashMap。此时,redisObject的编码字段是int。
常用命令:hget/hset/hgetall等。如下:
相当于java中的MapString,listString,列表底部是一个链表,在redis中。,在列表中插入值,你只需要找到列表的键,而你不';不需要像hash一样插入两层密钥。列表是有序且可重复的集合。
应用场景:Redislist有很多应用场景。它也是Redis最重要的数据结构之一,比如twitter'的关注列表和粉丝列表,可以通过Redis'列表结构;
实现方式:Redislist实现为双向链表。即可以支持反向查找和遍历,操作更方便,但带来了一些额外的内存开销。Redis内部的许多实现,包括发送缓冲队列,也使用这种数据结构。
常用命令:lpush/rpush/lpop/rpop/lrange等。如下:
性能总结:
它是一个字符串链表,左右都可以插入和添加。
相当于java中的MapString、SetString和Set,是一个无序的、不可重复的集合。而在redis中,只有一个key,底层是用hashTable实现的,自然是去重的。
应用场景:Redis集合提供的功能类似于列表,特殊之处在于集合可以自动复制。当你需要存储一个数据列表时,不要';我不想要重复的数据,集合是一个很好的选择,集合提供了一个判断成员是否在集合集合中的重要接口,哪个列表可以';t提供;比如保存一些标签的名称。标签名称不能重复,并且顺序可以是无序的。
实现方式:set的内部实现是一个HashMap,其值始终为null。其实就是通过计算hash来快速排列重复项,这也是为什么set可以提供一种判断成员是否在集合中的方法。
常用命令:sadd/spop/sembers/union等。如下:
ZSet(排序集)每个元素都会关联一个double类型的分数。,分数允许重复,集合的元素按分数排序(分数相同时,会按插入键的字典顺序排序),元素列表也可以按分数的范围得到。
应用场景:Redis排序集的应用场景和set类似,不同的是set不是自动排序的,排序集可以通过用户提供一个额外的参数score来对成员进行排序。,而且是有序插入,也就是自动排序。当您需要一个有序且不重复的集合列表时,您可以选择有序集合数据结构。比如twitter'的publictimeline可以用发布时间作为分数存储,这样在获取时就自动按时间排序。
底层实现:zset是Redis提供的一种非常特殊的数据结构,常用于排名等功能,以用户id为值,以关注时间或分数为分数进行排序。。实现机制分别是zipList和skipList。规则如下:
zipList:满足以下两个条件
skipList:以上两个条件不满足时,使用跳表,hash和skipList结合使用
为什么不用带skiplist的平衡树?
本文主要从内存占用、支持范围搜索、实现难度三个方面总结原因。
扩展:为什么不';tmysql跳表?
常用命令:zadd/zrange/zrem/zcard等。
官网地址:
可以用来计算两地距离,方圆半径内的人。
经度和纬度的限制:
一般情况下,我们使用Hyperloglog进行基数统计。
基数是什么?是一个集合中不重复数字的个数。
集合A:{1,3,5,7,9,7}
集合B:{1,3,5,7,9}
AB集合的基数都是5
应用:统计访问网站的次数(一个人多次访问网站仍算作一次)。
优点:占用内存固定。要计算2的64次方的基数,只需要12KB的内存。
缺点:有0.81%的错误率,可以忽略
概述:位图存储连续的二进制数(0和1)。通过位图,只需要一位来表示元素对应的值或状态,关键是对应的元素本身。我们知道8位可以组成一个字节。所以位图本身会大大节省存储空间。
应用场景:适用于需要保存状态信息(比如是否签到、是否登录……)并进一步分析这些信息的场景。。比如用户签到、活跃用户、用户行为统计(比如你是否喜欢一个视频)。
对于上面提到的一些场景,这里给出进一步的解释。
使用场景1:用户行为分析很多网站都是为了分析你的喜好而设计的。你需要研究你所称赞的。
使用场景二:统计活跃用户的使用时间
为关键,然后用户ID偏移,如果当天活跃则设置为1
。那么如果我计算某一天/月/年的活跃用户(暂时只统计时间中的一天称为活跃)该怎么办,请询问下redis命令
使用场景3:用户在线状态
。位图是获取或统计用户在线状态的一种节省空间且高效的方法。
只需要一个键,然后偏移用户ID,在线的话设置为1。,如果不在线,则设置为0。
补充:
巨';s肩:
看看你的mysql'的当前默认存储引擎:
mysql显示类似“%storage_engine%”的变量;
您需要查看表中使用的是什么引擎(在显示结果中,参数engine后面的那个表示表中当前使用的存储引擎):
mysqldisplaysthenameofthecreatedtable;Timecomplexityo(n)n-hashtablesizeofmetalalloyreturningallkey-valuepairsinthewholehybridbond
hget返回哈希表key中给定字段的值时间复杂度O(1)
,所以
只要你认真看了上面的,你就已经了解了韩国孩子';发饰。如果你对屏幕前的hget有什么好的建议和想法,请在下面的评论区评论,我们会及时回复。