Redis6的数据类型

Redis数据类型和操作:

1:键-Key

命令功能
keys *查看当前库的所有key
exists key判断当前key是否存在
type key查看当前key的类型
del key删除指定key
unlink key根据value选择非阻塞删除:仅将key从keyspace元数据中删除,真正的删除会在后续异步操作
expire key s(秒)为给定的key设置过期时间
ttl key查看key的过期时间 -1永不过期 -2已经过期

关于库的操作:

命令功能
select 0-15切换数据库
dbsize查看当前数据的key数量
flushdb清空当前库
flushall通杀全部库

2:字符串String类型

  1. String是Redis最基本的类型,一个key对应一个value。
  2. String类型是二进制安全的。意味着Redis的String可以包含任何数据。比如jpg图片或者序列化的对象。
  3. String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M。
命令功能
set key value添加键值对(相同key覆盖之前的内容)
get key获取key的value
append key value追加value到key的原value后
strlen key获取value的长度
setnx key value当key不存在时设置value
incr key(原子操作)将key的value的数字值加1
decr key将key的value的数字值减1
incrby/decrby key 步长将key的value增加/减少 自定义步长
mset key value key value同时设置多个kv
mget key key key同时获取多个v
msetnx key value key value(原子性)同时设置多个kv,如果有任何一个key存在,则所有的都会失败
getrange key 起始位置 结束位置获取范围内的值,类似于字符串截取
setrange key 起始位置 value覆写key所存储的值,从起始位置开始 索引从0开始
setex key 过期时间 value设置键的过期时间 s为单位
getset key value以旧换新,设置新值同时获得旧值

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

在这里插入图片描述

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

3:列表List类型

单键多值,Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
在这里插入图片描述

命令功能
lpush/rpush key value value从左/右插入多个数据
lpop/rpop key x从左/右吐出x个数据,当所有的value吐出后key消亡
rpoplpush key1 key2从key1的右边取出值插入到key2的左边
lrange key 开始位置 结束位置从左到右,取出开始位置到结束位置的value 如果为0 -1 则取出所有
lindex key index根据索引下标(从0开始)取出原始,-1代表最后一个索引位置
llen key获取列表的长度
linsert key before/after value newvalue在value的前/后插入newvalue的值
lrem key n value从左边开始累计删除n个相同的value的值
lset key index value将列表下标为index的值替换为value

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

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

4:集合Set类型

Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的 复杂度都是O(1)

命令功能
sadd key value value将一个或者多个元素添加到set中,已经存在的元素将被忽略
smembers key取出该集合的所有成员
sismember key value判断集合中是否存在value 有返回1没有返回0
scard key返回集合元素个数
srem key value value删除集合中某些元素
spop key随机吐出一个元素,值吐完则键消亡
srandmembe key n随机从集合取出一些元素,不会删除
smove source(集合1) destination(集合2) value把集合中的值从一个集合1移动到集合2
sinter key1 key2返回两个集合交集元素
sunion key1 key2返回两个集合并集元素
sdiff key1 key2返回两个几个的差集元素,key1存在,key2不存在

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

5:哈希Hash类型

Redis hash 是一个键值对集合。Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。类似Java里面的Map<String,Object>。
在这里插入图片描述

命令功能
hset key filed value filed value为key的filed赋值value
hget key field取出key的field 属性
hmset key filed value filed value为多个filed赋值
hexists key field查看哈希表key中给定的filed是否存在,存在返回1,不存在返回0
hkeys key列出所有field
hvals key列出所有values
hincrby key filed increment为key的field域加increment
hsetnx key field value当field不存在则为其赋值为value

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

6:有序集合Zset类型

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

命令功能
zadd key score1 value1 score2 value2将一个或者多个值放入key中
zrange key start stop返回下标在start和stop之间的元素(包含start/stop)
zrange key start stop WITHSCORES返回且带SCORE
zrangebyscore key min max返回Score在min和max之间的成员(包含min,max) 按照score递增
zrangebyscore key min max [ WITHSCORES]
zrangebyscore key min max
zrevrange key min max [WITHSCORES]按照score从大到小排序
zincrby key increment value为元素score加上increment
zrem key value删除指定value元素
zcount key min max统计指定score区间的元素个数
zrank key value返回值在集合中的排名 从 0 开始

SortedSet(zset)是Redis提供的一个非常特别的数据结构,一方面它等价于Java的数据结构Map<String, Double>,可以给每一个元素value赋予一个权重score,另一方面它又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。

zset底层使用了两个数据结构

(1)hash,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。

(2)跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值