Redis五种基本数据类型

五种基本数据类型

redis无论什么数据类型,在数据库中都是以key-value形式保存,并且所有的key(键)都是字符串,所以讨论基础数据结构都是讨论的value值的数据类型

主要包括常见的5种数据类型,分别是:String、List、Set、Zset、Hash
在这里插入图片描述

结构类型 结构存储的值 结构的读写能力
String字符串 可以是字符串、整数或浮点数 对整个字符串或字符串的一部分进行操作;对整数或浮点数进行自增或自减操作;
List列表 一个链表,链表上的每个节点都包含一个字符串 对链表的两端进行push和pop操作,读取单个或多个元素;根据值查找或删除元素;
Set集合 包含字符串的无序集合 字符串的集合,包含基础的方法有看是否存在添加、获取、删除;还包含计算交集、并集、差集等
Hash散列 包含键值对的无序散列表 包含方法有添加、获取、删除单个元素
Zset有序集合 和散列一样,用于存储键值对 字符串成员与浮点数分数之间的有序映射;元素的排列顺序由分数的大小决定;包含方法有添加、获取、删除单个元素以及根据分值范围或成员来获取元素

String字符串

简介

String是redis最基本的类型,一个key对应一个value。

  • String类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。
  • String类型是redis最基本的数据类型,一个redis中字符串value最多可以是512M

命令

基本操作

  • set (key) (value):设置键值对
  • setnx (key) (value):防止覆盖,设置键值对,
    • 如果key不存在就设置,返回1
    • 如果key已经存在就不设置,返回0
  • get(key):获取key对应的value
  • getset (key) (value) :先get再set,返回旧值,如果没有旧值返回nil
  • append (key) (value):向指定的key的value后追加字符串
  • del (key) :删除key
  • strlen (key):获取key对应值的字符串长度

数字value的加减

  • incr (key) :value + 1
  • decr (key) :value - 1
  • incrby (key) (number):value + number
  • decrby (key) (number):value - number

获取或者设置指定范围内的值

  • getrange (key) (begin) (end) :获取[begin,end]下标范围内的值,如果是(0,1)就是获取所有值
  • setrange (key) (begin) (xxxx) :从begin下标开始设置xxx值,将原有的替换掉

设置键值过期时间

  • setex (key) (seconds) expire:设置键过期时间
  • ttl (key) :查看key剩余存活时间

同时设置或获取多个key-value

  • met (key1) (value1) (key2) (value2):用于同时设置一个或多个 key-value 对
  • mget (key1) (key2) :返回所有(一个或多个)给定 key 的值(如果某个key不存在,不存在的key返回null)
  • msetnx(key1) (value1) (key2) (value2):当所有 key 都成功设置,返回 1 。 如果有一个key设置失败,所有的key设置都会失败,返回 0 。原子操作

使用场景

实战场景

  • 缓存: 经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力
  • 计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。
  • session:常见方案spring session + redis实现session共享,

编码与底层结构

字符串是Redis最基本的数据类型,不仅所有key都是字符串类型,其它几种数据类型构成的元素也是字符串。注意字符串的长度不能超过512M。

编码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hYsLFl0o-1651558697727)(Redis.assets/image-20220106194438014.png)]

字符串对象的编码可以是intraw或者embstr

  1. int 编码:保存的是可以用 long 类型表示的整数值
  2. embstr 编码:保存长度小于44字节短字符串(redis3.2版本之前是39字节,之后是44字节)
  • 对其进行修改后变成raw编码,无论是否达到44字节
  1. raw 编码:保存长度大于44字节长字符串(redis3.2版本之前是39字节,之后是44字节)
img
内存布局

字符串对象支持三种编码方式: RAW, INT, EMBSTR, 三种方式的内存布局分别如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SBpOnVpM-1651558697728)(https://pdai-1257820000.cos.ap-beijing.myqcloud.com/pdai.tech/public/_images/db/redis/db-redis-ds-x-21.png)]

🔊 raw 和 embstr 的区别

其实 embstr 编码是专门用来保存短字符串的一种优化编码,

embstr与raw都使用redisObject和sds保存数据,

  • embstr的使用只分配一次内存空间(因此redisObject和sds是连续的)
  • raw需要分配两次内存空间(分别为redisObject和sds分配空间)

只分配一次内存空间的好处是,创建时少分配一次空间,删除时少释放一次空间,以及对象的所有数据连在一起,寻找方便。

而embstr的坏处也很明显,如果字符串的长度增加需要重新分配内存时,整个redisObject和sds都需要重新分配空间因此redis中的embstr实现为只读。

💬 编码的转换

  • 当 int 编码保存的值不再是整数,或大小超过了long的范围时,自动转化为raw。
  • 对于 embstr 编码,由于 Redis 没有对其编写任何的修改程序(embstr 是只读的),在对embstr对象进行修改时,都会先转化为raw再进行修改,因此==,只要是修改embstr对象,修改后的对象一定是raw的,无论是否达到了44个字节。==

List列表

简介

Redis中的List其实就是双端链表

  • 使用List结构,我们可以轻松地实现最新消息排队功能(比如新浪微博的TimeLine)。List的另一个应用就是消息队列,可以利用List的 PUSH 操作,将任务存放在List中,然后工作线程再用 POP 操作将任务取出进行执行。
  • Redis还提供了操作List中某一段的api,你可以直接查询,删 除List中某一段的元素。
  • 使用列表的技巧
    • lpush+lpop=Stack(栈)
    • lpush+rpop=Queue(队列)
    • lpush+ltrim=Capped Collection(有限集合)
    • lpush+brpop=Message Queue(消息队列)

命令使用

命令 简述 使用
RPUSH 将给定值推入到列表右端 RPUSH key value
LPUSH 将给定值推入到列表左端 LPUSH key value
RPOP 从列表的右端弹出一个值,并返回被弹出的值 RPOP key
LPOP 从列表的左端弹出一个值,并返回被弹出的值 LPOP key
LRANGE 获取列表在给定范围上的所有值 LRANGE key 0 -1
LINDEX 通过索引获取列表中的元素。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。 LINEX key index

命令测试

# ===================================================
# Lpush:将一个或多个值插入到列表头部。(左)
# rpush:将一个或多个值插入到列表尾部。(右)
# lrange:返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。
# 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。
# 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此
类推。
# ===================================================
127.0.0.1:6379> LPUSH list "one"
(integer) 1
127.0.0.1:6379> LPUSH list "two"
(integer) 2
127.0.0.1:6379> RPUSH list "right"
(integer) 3
127.0.0.1:6379> Lrange list 0 -1
1) "two"
2) "one"
3) "right"
127.0.0.1:6379> Lrange list 0 1
1) "two"
2) "one"
# ===================================================
# lpop 命令用于移除并返回列表的第一个元素。当列表 key 不存在时,返回 nil 。
# rpop 移除列表的最后一个元素,返回值为移除的元素。
# ===================================================
127.0.0.1:6379> Lpop list
"two"
127.0.0.1:6379> Rpop list
"right"
127.0.0.1:6379> Lrange list 0 -1
1) "one"
# ===================================================
# Lindex,按照索引下标获得元素(-1代表最后一个,0代表是第一个)
# ===================================================
127.0.0.1:6379> Lindex list 1
(nil)
127.0.0.1:6379> Lindex list 0
"one"
127.0.0.1:6379> Lindex list -1
"one"
# ===================================================
# llen 用于返回列表的长度。
# ===================================================
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> Lpush list "one"
(integer) 1
127.0.0.1:6379> Lpush list "two"
(integer) 2
127.0.0.1:6379> Lpush list "three"
(integer) 3
127.0.0.1:6379> Llen list # 返回列表的长度
(integer) 3
# ===================================================
# lrem key 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。
# ===================================================
127.0.0.1:6379> lrem list 1 "two"
(integer) 1
127.0.0.1:6379> Lrange list 0 -1
1) "three"
2) "one"
# ===================================================
# Ltrim key 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区
间之内的元素都将被删除。
# ===================================================
127.0
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值