Redis04_五大基本数据类型


String 类型常用命令

set name blu # 设置键的值。如果键已存在,则覆盖原有值
append name hello # 向键的值的末尾追加指定的字符串。如果键不存在则相当于 SET
strlen name # 返回键的值的长度
get name # 获取键的值。如果键不存在,则返回 nil
incr views # 将键中存储的数字值加1 i++
decr views # 将键中存储的数字值减1	i--
incrby views 10 # 将键中存储的数字值加10
decrby views 7 # 将键中存储的数字值减7
getrange name 0 3 # 截取字符串(闭区间),0到-1表示获取全部字符串
setrange name 2 xx # 将索引2后面的两个字符替换为xx
setex name 30 echo # 设置键值的同时,设置过期时间(秒)
setnx name BLU # 创建键值(如果不存在)
mset key1 v1 key2 v2 key3 v3 # 批量创建
mget key1 key2 key3 # 批量获取键值
msetnx key1 v1 key2 v2 key3 v3 key4 v4 # 如果不存在,批量创建key(原子性操作,只要有一个存在都会创建失败)

List 类型常用命令

本质上是一个链表,可以存在重复的值。在两边插入或改动值效率较高,更新中间元素效率偏低。
左存右取相当于队列,左存左取相当于栈

lpush list1 one # 将值插入 list 头部
rpush list1 right # 将值插入 list 尾部
lrange list1 0 1 # 获取 list 中具体区间的值(0到-1表示获取所有)
lpop list1 # 移除 list 头部的值
rpop list1 # 移除 list 尾部的值
lindex list1 0 # 通过下标获取 list 中的值(从0开始)
llen list1 获取 list 的长度
lrem list1 2 three # 移除指定个数的指定值
ltrim list1 0 1 # 通过下标截断 list
rpoplpush list1 list2 # 移除 list1 尾部的值,并存入 list2 的头部
exists list1 # 判断指定 list1 是否存在
lset list1 0 item # 修改 list1 中指定下标的值
linsert mylist before world beautiful # 在 mylist 的 world 值之前插入 beautiful
linsert mylist after world everyday # 在 mylist 的 world 值之后插入 everyday

List 的底层实现(ZipList、LinkedList、QuickList)

Redis 3.2版本前:List的底层实现主要有两种:压缩列表(ZipList)和 双向链表(LinkedList)。当元素个数小于512并且元素大小小于64字节时,Redis会使用压缩列表来存储;否则,会使用双向链表。

Redis 3.2版本及以后:引入了 快速链表(QuickList)作为 List 的底层实现。QuickList 是 ZipList 和 LinkedList 的混合体,它将 LinkedList 按段切分,每一段使用 ZipList 来紧凑存储,多个 ZipList 之间使用双向指针串接起来。这样既满足了快速的插入删除性能,又避免了过大的空间冗余。


Set 类型常用命令

set 中的元素无序且不能重复

sadd myset hello # 往set里添加值
smembers myset # 获取set里的所有值
sismember myset BLU # 判断指定值在set里是否存在(存在返回1,不存在返回0)
scard myset # 获取set中元素的数量
srem myset hello # 移除set中指定的元素
srandmember myset 2 # 从set中随机取出指定个数的元素
spop myset # 从set中随机移除一个元素
smove myset myset2 BLU # >将myset中的指定元素移出至myset2
sdiff set1 set2 # 比较set1与set2,返回set1独有的元素(差集)
sinter set1 set2 # 比较set1与set2,返回两集合共有的元素(交集)
sunion set1 set2 # 比较set1与set2,返回两集合所有的元素(并集)

Set 的底层实现:哈希表(HashTable)、整数集合(IntSet)

  • 哈希表(HashTable):当Set集合中的元素数量较多或包含非整数元素时,Redis会使用哈希表来存储这些元素。哈希表通过键值对的形式存储数据,其中键是元素的字符串表示,而值则统一为NULL(因为Set只关心元素的存在性,而不关心元素的值)。
  • 整数集合(IntSet):当Set集合中的所有元素都是整数,并且元素数量不超过一定阈值(默认为512)时,Redis会使用整数集合来存储这些元素。整数集合内部是一个有序数组,通过二分查找的方式实现快速查找和插入操作。这种存储方式可以节省内存空间,并提高整数集合的访问效率。

Hash 类型常用命令

hset myhash field1 BLU # hset 存键值
hget myhash field1 # hget 取键值
hmset myhash field2 hello field3 world # hmset 批量存键值
hmget myhash field1 field2 field3 # hmget 批量取键值
hgetall myhash # hgetall 取出所有键和值
hdel myhash field3 # hdel 删除指定键
hlen myhash # hlen 获取哈希长度(键数量)
hexists myhash field1 # hexists 判断指定键是否存在
hkeys myhash # hkeys 获取所有的键
hvals myhash # hvals 获取所有的值
hincrby myhash amount 3 # 将指定键(amount)的数字值增加指定大小(3)
hsetnx myhash field4 hahaha # 存值(如果key不存在),如果key已存在,则存值失败

Hash 的底层实现:压缩列表(Ziplist)、哈希表(HashTable)

  1. 压缩列表(Ziplist):当Hash中的元素数量较少且元素大小较小时,Redis会使用压缩列表作为底层数据结构。压缩列表是一种为了节约内存而设计的线性数据结构,它可以在一定程度上替代数组、链表等数据结构。然而,在Redis 7.0版本中,压缩列表已被listpack数据结构所取代,但两者在功能和用途上相似。

  2. 哈希表(Hashtable):当Hash中的元素数量较多或元素大小较大时,Redis会使用哈希表作为底层数据结构。哈希表通过哈希函数将key映射到表中的一个位置,以支持快速的插入、删除和查找操作。


Zset 类型(Sorted Set)常用命令

zadd myzset 1 one # 往Zset里添加一个元素(分数为1)
zadd myzset 2 two 3 three 4 four # 往myzset里添加多元素
zrange myzset 0 -1 # 获取Zset中具体区间的值(默认根据score由低到高排序)
zrevrange myzset 0 -1 withscores # 获取Zset中具体区间的值(根据score倒序排序)withscores 表示显示分数
zrem salary lisi # 移除Zset里的指定值
zcard salary # 获取Zset里的元素数量
zcount myset 1 3 # 统计指定分数区间里的元素数量

Zset 的底层实现:压缩列表(Ziplist)、跳表(Skiplist)

  1. 压缩列表(Ziplist):当Zset中的元素数量较少且每个元素的大小较小时,Redis会使用压缩列表来存储Zset。压缩列表是一种为了节约内存而设计的线性数据结构,它可以在一定程度上替代数组、链表等数据结构。但在Redis 7.0及以后的版本中,压缩列表数据结构已被listpack数据结构所取代,但两者在功能和用途上相似。

  2. 跳表(Skiplist):当Zset中的元素数量较多或元素体积较大时,Redis会使用跳表作为底层数据结构。跳表是一种可以进行快速查找的有序数据结构,它通过维护多级索引来实现快速查找,其查找复杂度为O(logN)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值