0
点赞
收藏
分享

微信扫一扫

猿创征文| redis基本数据类型




✨ redis基本数据类型

  • ​​Redis键(key)​​
  • ​​string类型​​
  • ​​基本介绍​​
  • ​​常用操作命令​​
  • ​​数据结构​​
  • ​​list类型​​
  • ​​基本介绍​​
  • ​​常用操作命令​​
  • ​​数据结构​​
  • ​​set类型​​
  • ​​基本介绍​​
  • ​​常用命令​​
  • ​​数据结构​​
  • ​​hash​​
  • ​​基本介绍​​
  • ​​常用命令​​
  • ​​注意事项​​
  • ​​数据结构​​
  • ​​Redis有序集合Zset(sorted set)​​
  • ​​基本介绍​​
  • ​​基本操作​​
  • ​​zset类型数据的扩展操作​​
  • ​​注意事项​​
  • ​​跳表数据结构​​



📃个人主页:不断前进的皮卡丘
🌞博客描述:梦想也许遥不可及,但重要的是追梦的过程,用博客记录自己的成长,记录自己一步一步向上攀登的印记
🔥个人专栏:微服务专栏
✔️redis常见的操作命令:​​http://www.redis.cn/commands.html​​


Redis键(key)

命令

功能

keys *

查看当前库的所有key

exists key

判断某个key是否存在

type key

查看某个key的数据类型

del key

删除指定key

unlink key

根据value选择非阻塞删除,仅仅把key从keyspace元数据中删除,真正的删除会在后续异步操作,也就是把删除操作放到其他线程中进行

expire key 10

为key设置过期时间为10秒钟

ttl key

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

select

切换数据库

dbsize

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

flushdb

清空当前数据库数据

flushall

清除所有数据库数据

猿创征文| redis基本数据类型_数据类型


猿创征文| redis基本数据类型_redis_02

string类型

基本介绍

  • String是Redis最基本的类型,一个key对应一个value。
  • String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。
  • String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M
  • 猿创征文| redis基本数据类型_缓存_03

  • 猿创征文| redis基本数据类型_缓存_04

  • 猿创征文| redis基本数据类型_数据库_05

常用操作命令

命令

说明

set

设置一个key/value

get

根据key获得对应的value

mset

一次设置多个key value

mget

一次获得多个key的value

getset

获得原始key的值,同时设置新值

strlen

获得对应key存储value的长度

append

为对应key的value追加内容

getrange 索引0开始

截取value的内容

setex

设置一个key存活的有效期(秒)

psetex

设置一个key存活的有效期(毫秒)

setnx

存在不做任何操作,不存在添加

msetnx原子操作(只要有一个存在不做任何操作)

可以同时设置多个key,只有有一个存在都不保存

decr

进行数值类型的-1操作

decrby

根据提供的数据进行减法操作

Incr

进行数值类型的+1操作

incrby

根据提供的数据进行加法操作

Incrbyfloat

根据提供的数据加入浮点数

猿创征文| redis基本数据类型_数据类型_06


猿创征文| redis基本数据类型_缓存_07


猿创征文| redis基本数据类型_数据类型_08

数据结构

  • String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配.
  • 猿创征文| redis基本数据类型_数据_09

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

list类型

基本介绍

  • 数据存储要求:存储多个数据,并且对数据进入存储空间的顺序进行区分
  • 数据的存储结构:一个存储空间保持多个数据,而且通过数据可以体系进入的顺序
  • list数据类型:保存多个数据,底层使用的是双向链表存储结构实现
  • 猿创征文| redis基本数据类型_数据_10

常用操作命令

命令

说明

lpush

将某个值加入到一个key列表头部

lpushx

同lpush,但是必须要保证这个key存在

rpush

将某个值加入到一个key列表末尾

rpushx

同rpush,但是必须要保证这个key存在

lpop

返回和移除列表左边的第一个元素

rpop

返回和移除列表右边的第一个元素

lrange

获取某一个下标区间内的元素

llen

获取列表元素个数

lset

设置某一个指定索引的值(索引必须存在)

lindex

获取某一个指定索引位置的元素

lrem

删除重复元素

ltrim

保留列表中特定区间内的元素

linsert

在某一个元素之前,之后插入新元素

猿创征文| redis基本数据类型_数据类型_11


猿创征文| redis基本数据类型_数据库_12

数据结构

  • ​​Redis快速表、压缩表和双向链表(重点介绍quicklist)​​
  • List的数据结构为快速链表quickList。
  • 首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。
  • 它将所有的元素紧挨着一起存储,分配的是一块连续的内存。
    当数据量比较多的时候才会改成quicklist。
    因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next。
  • 猿创征文| redis基本数据类型_redis_13

  • Redis将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。

set类型

基本介绍

  • 新需求:存储大量数据,并且查询效率要更高
  • 需要的存储结构:能存储大量数据,并且要有高效的内部存储机制,方便查询
  • set类型:和hash存储结构完全一样,但是仅仅存储键,不存储值,并且值不允许重复
  • Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)。
  • set:无序,不可重复
  • 猿创征文| redis基本数据类型_数据_14

  • 猿创征文| redis基本数据类型_数据_15

常用命令

命令

说明

sadd

为集合添加元素

smembers

显示集合中所有元素 无序

scard

返回集合中元素的个数

spop

随机返回一个元素 并将元素在集合中删除

smove

从一个集合中向另一个集合移动元素 必须是同一种类型

srem

从集合中删除一个元素

sismember

判断一个集合中是否含有这个元素

srandmember

随机返回元素

sdiff

去掉第一个集合中其它集合含有的相同元素

sinter

求交集

sunion

求和集

猿创征文| redis基本数据类型_redis_16

数据结构

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

hash

基本介绍

  • Redis hash 是一个键值对集合。
  • Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
    类似Java里面的Map<String,Object>
  • 猿创征文| redis基本数据类型_数据类型_17

  • 猿创征文| redis基本数据类型_数据类型_18

常用命令

命令

说明

hset key field1 value1 field2 value2

添加/修改数据

hget key field1 field2

获得多个数据

hgetall key

获得所有的数据

hdel key field1 field2

删除数据

hexists key field

获取哈希表中是否存在的字段

hlen key

获取哈希表中字段的数量

hkeys key

获得所有的key

hvals key

获得所有的value

hmset key field1 value1 field2 value2

添加/修改多个数据

hmget key field1 field2

获得多个数据

hsetnx key field value

设置一个不存在的key的值

hincrby key field increment

为value进行加法运算

hincrbyfloat key field increment

为value加入浮点值

猿创征文| redis基本数据类型_redis_19

注意事项

  • hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil)
  • 每个 hash 可以存储 2^32 - 1 个键值对
  • hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用
  • hgetall 操作可以获取全部属性,如果内部field过多,遍历整体数据效率就很会低,有可能成为数据访问瓶颈

数据结构

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

Redis有序集合Zset(sorted set)

基本介绍

  • 元素不重复
  • 有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。
  • 元素是有序的, 所以可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。
  • 猿创征文| redis基本数据类型_缓存_20

基本操作

功能

命令

添加数据

zadd key score1 member1 [score2 member2]

获取全部数据

zrange key start stop[withscores]

获取全部数据

zrevrange key start sto[withscores]

删除数据

zrem key member [member…]

按照条件获取数据

zrangebyscore key min max[withscores][limit] limt用来分页

按照条件获取数据

zrevrangebyscore key max min[withscores]

按照条件删除数据

zremrangebyrank key start stop

按照条件删除数据

zremrangebyscore key min max

获取集合数据总量

zcard key

获取集合数据总量

zcount key min max

集合交操作

zinterstore destination numkeys key[key…]

集合并操作

zunionstore destination numkeys key[key…]

猿创征文| redis基本数据类型_数据类型_21

zset类型数据的扩展操作

在生活中,其实排序是很常见的,比如好友亲密度,投票之类的都需要进行排序,我们需要为所有参加排名的资源来建立排序依据

功能

命令

获取数据对应的索引(排名)

zrank key member

获取数据对应的索引(排名)

zrevrank key member

score值获取

zscore key member

score值修改

zincrby key increment member

猿创征文| redis基本数据类型_数据库_22


猿创征文| redis基本数据类型_数据类型_23

注意事项

  • score保存的数据存储空间是64位,如果是整数范围是-9007199254740992~9007199254740992
  • score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时候要慎重
  • sorted_set 底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将被反复覆盖,保留最后一次修改的结果

跳表数据结构

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源码之跳表数据结构


举报

相关推荐

0 条评论