redis的五种基本类型

Redis启动

首先修改redis.conf配置文件

image-20200819143722343

配置完成后,保存退出,再次通过 redis-server redis.conf 命令启动 Redis,此时,就是在后台启
动了。

image-20200819143811191

String

String 是 Redis 里边最最简单的一种数据结构。在 Redis 中,所以的 key 都是字符串,但是,不同的
key 对应的 value 则具备不同的数据结构,我们所说的五种不同的数据类型,主要是指 value 的数据类
型不同。
Redis 中的字符串是动态字符串,内部是可以修改的,像 Java 中的 StringBuffer,它采用分配冗余空间
的方式来减少内存的频繁分配。在 Redis 内部结构中,一般实际分配的内存会大于需要的内存,当字符
串小于 1M 的时候,扩容都是在现有的空间基础上加倍,扩容每次扩 1M 空间,最大 512M。

指令功能
key就是给一个 key 赋值的。
append使用 append 命令时,如果 key 已经存在,则直接在对应的 value 后追加值,否则就创建新的键值对。
decr可以实现对 value 的减 1 操作(前提是 value 是一个数字),如果 value 不是数字,会报错,如果value 不存在,则会给一个默认的值为 0,在默认值的基础上减一。
decrby和decr类似,但是可以设置步长,该命令的第二个参数就是步长
get用来获取一个key的value
getrangegetrange可以用来返回key对应的value的子串,这有点类似于 Java 里边的 substring。这个命令第二个和第三个参数就是截取的起始和终止位置,其中,-1 表示最后一个字符串,-2 表示倒数第二个字符串,以此类推…
getset获取并更新一个key
incr给一个key的value自增
incrby给一个key自增,同时还可以设置步长
incrbyfloat和incrby类似,但是步长可以设置为浮点数
mget和mset批量获取和批量存储
ttl查看key的有效期
setex在个key设置value的同时,还设置过期时间
psetex和setex类似,单位是毫秒
setnxset命令会覆盖已经存在的key,setnx不会
msetnx批量设置
setrange覆盖一个已经存在的key的长度
strlen查看字符串长度

BIT命令

在redis中,字符串都是以二进制的方式来存储的,例如set k1 a,a对应的ascii码是97,97转换为二进制是01100001,BIT相关的命令就是对二进制进行操作的

指令功能
getbitkey对应的value在offset处的bit值
setbit修改key对应的value在offset处的bit值
bitcount统计二进制数据中1的个数

List

列表这种对象支持存现一组有序的,不重复的数据,因为其有序性,它可以获取指定范围的元素列表,可以在O(1)的时间复杂度获取指定索引的下标的元素

image-20200819220824866

在Redis3.2版本以前列表类型的内部编码有两种。当满足下面两个条件的时候,Redis 列表对象使用ziplist(压缩列表)来实现。

  • 当列表的元素个数小于list-max-ziplist-entries配置(默认512个)
  • 当列表中每个元素的值都小于list-max-ziplist-value配置时(默认64字节)

当列表类型无法满足ziplist条件时,Redis会使用linkedList作为列表的内部实现。而在Redis3.2版本开始对列表数据结构进行改造,使用quickList代替了zipList和linkedList。由于列表对象的有序且不可重复的特性,它比较适合用来做文章商品等列表的存储。

列表类型可以lpush(左侧push),同时又可以使用rpop(右侧弹出)第一个元素,所以列表类型具有先进先出的特性,可以用来实现消息队列,也可以lpush(左侧push)和lpop(左侧弹出),具有后进先出的特性,因此开发中需要使用栈的时候,我们可以使用列表对象来实现。

先进先出:lpush(左侧push) rpop(右侧pop) 做消息队列

后进先出:lpush(左侧push) lpop(左侧弹出)做栈

关于List更详细的介绍,参考这篇博客

指令功能
lpush将所有指定的值插入到存于 key 的列表的头部。如果 key 不存在,那么在进行 push 操作前会创建一个空列表。 如果 key 对应的值不是一个 list 的话,那么会返回一个错误。
lrange返回列表指定区间内的元素。
rpush向存于 key 的列表的尾部插入所有指定的值。
rpop移除并返回列表的尾元素。
lpop移除并返回列表的头元素。
lindex返回列表中,下标为 index 的元素。
ltrim可以对一个列表进行修剪。
blpop阻塞式的弹出,相当于 lpop 的阻塞版。

Set

集合对象是一个无序且唯一的键值集合。它的存储顺序不会按照插入的先后顺序进行存储,与列表不同的是,它存储的数据是无序且不重复的

image-20200819221738330

集合对象的内部编码也有两种,intest(整数集合)与hashtable(哈希表),当满足下面两个条件的时候,集合对象使用intset来实现

  • 集合中的元素都是整数
  • 集合中元素的个数小于 set-maxintset-entries配置(默认512个)

不满足上面两个条件时,集合对象使用hashtable来实现

集合对象的主要两个特性就是:无序不可重复支持并交差,因此可以用来做标签系统

而集合中的 SPOP(随机移除并返回集合中一个或多个元素) 和 SRANDMEMBER(随机返回集合中一个或多个元素)命令可以帮助我们实现一个抽奖系统

spop

image-20200819224052608

srandmember

image-20200819224301241

有关Set更详细的介绍,参考这篇博客

指令功能
sadd添加一个元素到一个key中
smembers获取一个 key 下的所有元素
srem移除指定的元素
sismemeber返回某一个成员是否在集合中
scard返回集合的数量
srandmember随机返回一个元素
spop随机返回并且出栈一个元素。
smove把一个元素从一个集合移到另一个集合中去。
sdiff返回两个集合的差集。
sinter返回两个集合的交集。
sdiffstore这个类似于 sdiff ,不同的是,计算出来的结果会保存在一个新的集合中。
sinterstore类似于 sinter,只是将计算出来的交集保存到一个新的集合中。
sunion求并集。
sunionstore求并集并且将结果保存到新的集合中。

Hash

hash结构中,key是一个字符串 ,value则是一个key/value键值对

哈希对象用来存储一组数据对。每个数据对又包含键值两部分

Hash对象也有两种实现方式:ziplist(压缩列表)hashtable(哈希表)

同样,只有当存储的数据量比较小的情况下,Redis才使用压缩列表来实现哈希对象,具体需要满足两个条件

  • 字典中保存的键和值的大小都要小于64字节
  • 字典中键值对的个数要小于512个

当不能同时满足上面的两个条件时,Redis就使用哈希表来实现Hash对象

当存储的内容是对象的时候,Redis字符串对象很多功能使用Redis 哈希对象也可以实现,如缓存用户信息的时候,使用Redis哈希对象存储,简单直观,如果使用合理可以减少内存空间的使用。

但是也有其缺点,就是要控制哈希在ziplist和hashtable两种内部编码的转换,hashtable将会消耗更多的内存。

此外,Hash对象还可以实现购物车和计数器等功能,更详细的介绍,参考这篇博客

image-20200819224421406

指令功能
hset添加值
hget获取值
hmset批量设置
hmget批量获取
hdel删除一个指定的 field
hsetnx默认情况下,如果 key 和 field 相同,会覆盖掉已有的 value,hsetnx 则不会。
hvals获取所有的 value
hkeys获取所有的 key
hgetall同时获取所有的 key 和 value
hexists返回 field 是否存在
hincrby给指定的 value 自增
hincrbyfloat可以自增一个浮点数
hlen返回 某一个 key 中 value 的数量
hstrlen返回某一个 key 中的某一个 field 的字符串长度

ZSet

有序集合类型 (Sorted Set或ZSet) 相比于集合类型多了一个排序属性 score(分值),对于有序集合 ZSet 来说,每个存储元素相当于有两个值组成的,一个是有序结合的元素值,一个是排序值。有序集合保留了集合不能有重复成员的特性(分值可以重复),但不同的是,有序集合中的元素可以排序

image-20200819224912144

有序集合是由 ziplist (压缩列表)skiplist (跳跃表) 组成的。

当数据比较少时,有序集合使用的是 ziplist 存储的,有序集合使用 ziplist 格式存储必须满足以下两个条件:

  • 有序集合保存的元素个数要小于 128 个;
  • 有序集合保存的所有元素成员的长度都必须小于 64 字节。

如果不能满足以上两个条件中的任意一个,有序集合将会使用 skiplist 结构进行存储。

有序集合比较典型的使用场景就是排行榜系统例如学生成绩的排名。某视频(博客等)网站的用户点赞播放排名、电商系统中商品的销量排名等。

有关Redis有序集合对象的更详细的介绍,参考这篇博客

指令功能
zadd将指定的元素添加到有序集合中
zscore返回 member 的 score 值
zrange返回集合中的一组元素
zrevrange返回一组元素,但是是倒序
zcard返回元素个数
zcount返回 score 在某一个区间内的元素
zrangebyscore按照 score 的范围返回元素
zrank返回元素的排名(从小到大
zrevrank返回元素排名(从大到小
zincrbyscore 自增
zinterstore给两个集合求交集
zrem弹出一个元素
zlexcount计算有序集合中成员数量
zrangebylex返回指定区间内的成员

key

指令功能
del删除一个 key/value
dump序列化给定的 key
exists判断一个 key 是否存在
ttl查看一个 key 的有效期
expire给一个 key 设置有效期,如果 key 在过期之前被重新 set 了,则过期时间会失效。
persist移除一个 key 的过期时间
keys *查看所有的 key
pttl和 ttl 一样,只不过这里返回的是毫秒
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值