Redis五大常用数据类型

目录

String

概述:

数据结构:

操作:

List(Redis列表)

简介

数据结构

基本操作:

Set(Redis集合)

 简介

数据结构

命令

Hash(Redis哈希)

简介

数据结构

命令

Zset(redis有序集合)

简介

数据结构

跳跃表/跳表(会有单独博客讲解)

命令操作


String

概述:

String是二进制安全的(基本数据类型),(只要用能用二进制表示,都能存),比如jpg图片,或者序列化后的对象,一个string的value最大只能存512M大小的内容。

数据结构:

String的数据结构为简单动态字符串。是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。

如图中所示,内部为当前字符串实际分配的空间capacity -般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时一次只会多扩1M的空间。需要注意的是字符串最大长度为512M。

操作:

 存储操作:set <key> <value> 

重复set统一个key的值会覆盖之前的值。

取值操作: get <key>

 追加值:append <key>   <追加内容>   

        在原value上增加内容

 不覆盖添加:set <key> <value> 

         如果已经存在key不允许覆盖,返回0,如果不存在key,添加对应键值对。

数字自增  incr  < key>

将储存的数字值自增1,只能对数字值操作,如果为空,新增为1

数字自减decr  <key>

将储存的数字值自减1     

 数字自增  incrby  < key>  <步长>  

将数字增加指定步长

 数字减少  decrby  < key>  <步长>  

将数字增加指定步长

 注意:incr decr incrby decrby  都是原子操作,这个原子操作在redis中指的是不会被线程调动机制打断。 

mset <key1> <value1> <key2> <value2> ...同时设置一个或多 个key-value对。
mget <skey1> <key2> <key3>同时获取一个或多个value。
msetnx <key1> <value1> <key2> <value2> .... 同时设置一个或多 个key-value对,当且仅当所有给定key都不存在。。
y以上命令原子性,有一个失败则都失败。

setex <key> <过期时间><value>p    设置键值的同时,设置过期时间,单位秒。。
getset <key> <value>.   以新换旧,设置了新值同时获得旧值。。

List(Redis列表)

简介

单键多值,Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

数据结构

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

他使用的是一种quickList链表,他的特点是

会在表的元素较少的情况下会使用一块连续的内存存储,结构是zipList,也就是压缩链表。他将所有的链表挨着存储,分配的是连续的内存。

只有当元素多的时候会改成quicklist,因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next。quicklist就是把多个ziplist用双向链表形式连接起来。如图:

 这样极满足了快速插入和删除的性能,又不会出现太大的空间冗余。

 

基本操作:

lpush/rpush <key> <value1> <value2> <value3>  从左边/右边插入一个或多个值

 lrange <key> <start> <stop>  按照索引下标获得元素(从左到右)。

 lpop/rpop <key> 从左边/右边吐出一个值

值在键在,值光键亡。。


rpoplpush <key1> <key2>    从<key1>列表右边吐出一个值,插到<key2>列表左边

lindex <key> <index>    按照索引下标获得元素(从左到右
llein <key>    获得列表长度。
linsert <key> before <value> <newvalue>    在<value>的后面插入<newvalue>插入值.
Irem <key> <n> <value>    从左边删除n个value(从左到右)。
lset<key> <index> <value>    将列表key下标为index的值替换成valuev
linsert <key> before <value> <newvalue>    在<value>的后面插入<newvalue>插入值
Irem <key> <n> <value>     从左边删除n个value(从左到右)。
lset<key> <index> <value>    将列表key下标为index的值替换成valuer

Set(Redis集合)
 

 简介

Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的。还有就是提供了判断是否包含此元素,和java里的功能很相像。Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是0(1)。

数据结构

set的数据结构是dic字典,字典使用hash表实现的,Java中HashSet的内部实现使用的是HashMap ,只不过所有的value都指向同一个对象。Redis的set结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部值。

命令

sadd <key> <value1> <value2> ....将-个或多个member元素加入到集合key中,已经存在的member元素将被忽略.


smembers <key>取出该集合的所有值。


sismember <key> <value>判断集合<key>是否为含有该<value>值,有1 ,没有0


scard<key>返回该集合的元素个数。。

spop <key>随机从该集合中吐出一个值。

sinter <key1> <key2>返回两个集合的交集元素。
sunion <key1> <key2>返回两个集合的并集元素。


sdiff <key1> <key2>返回两个集合的差集元素(key1中的,不包含key2中的)。 

 

smove <source> <destination>    value把集合中一个值从一 个集合移动到另一个集合

srem <key> <value1> <value2> ... 删除集合中的某个元素。。
srandmember <key> <n>随机从该集合中取出n个值。不会从集合中删除。。

Hash(Redis哈希)

简介

redis hash 是一个键对值集合。是一个String类型的filed 和value的映射表,hash特别适合用于存储对象。类似与java里边的Map<String , Object>。

 


数据结构

Hash类型对应的数据结构是两种: ziplist (压缩列表),hashtable (哈希表)。当
field-value长度较短且个数较少时,使用ziplist, 否则使用hashtable. 。
 

命令


hset <key><field><value>      给<key>集 合中的<field>键赋值 <value>


hget <key1><field> 从<key1>集合<field>取出value。


hmset <key1><field1><value1><field2><value2>... 批量设置hash的值。


hexists<key1><field>查看哈希表key中,给定域field 是否存在。


hkeys <key>列出该hash集合的所有fields


hvals <key>列出该hash集合的所有values


hincrby <key><field><increment>为哈希表 key 中的域field 的值加上增量1 -14
hsetnx <key><field><value>将哈希表 key 中的域field 的值设置为value, 当且仅当域
field不存在

Zset(redis有序集合)

简介

Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分( score) ,这个评分( score )被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的 ,但是评分可以是重复了。因为元素是有序的,所以你也可以很快的根据评分( score )或者次序( position )来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。

数据结构

SortedSet (zset)是Redis提供的一个非常特别的数据结构, 一方面它等价于Java的数据结构Map<String, Double> ,可以给每一个元素 value赋予一个权重 score ,另一方面它又类似于TreeSet ,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。
zset底层使用了两个数据结构。
(1) hash , hash的作用就是关联元素value和权重score ,保障元素value的唯一性,可以通过元素value找到相应的score值。
(2)跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。

跳跃表/跳表(会有单独博客讲解)

简介:有序集合在生活中比较常见,例如根据成绩对学生排名,根据得分对玩家排名等。对于有序集合的底层实现,可以用数组、平衡树、链表等。数组不便元素的插入、删除;平衡树或红黑树虽然效率高但结构复杂;链表查询需要遍历所有效率低。Redis采用的是跳跃表。跳跃表效率堪比红黑树,实现远比红黑树简单。
 

命令操作

zadd <key> <score1> <value1> <score2> <value2>   将一个或多个member元素及其score值加入到有序集key当中。


zrange <key> <start> <stop> [WITHSCORES]   返回有序集key中,下标在<start><stop>之间的元素。


带WITHSCORES ,可以让分数-起和值返回到结果集。


zrangebyscore key  [withscores] [imit offset count]   返回有序集key中,所有score 值介于min和max之间(包括等于min或max )的成员,有序集成员按score值递增(从小到大)次序排列。。



zrevrangebyscore key  [withscores] [imit offset count]   同上,改为从大到小排列。

 

zincrby <key> <increment> <value>为元素的score加上增量。
zrem <key> <value>删除该集合下,指定值的元素↓
zcount <key> <min> <max>统计该集合,分数区间内的元素个数。
zrank <key> <value>返回该值在集合中的排名,从0开始。

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值