这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战
本章主要是介绍 redis 中常规的数据结构以及常用的方法,我们需要知道 redis 支持哪些数据结构,提供有哪些方法,能满足我们哪些需求,才能更好的驾驭这门利器
我的 redis 系列,感兴趣的朋友也可以来看看
String(字符串)
字符串是最基本的一种Redis值。Redis字符串是二进制安全的,这意味着Redis字符串可以包含任何类型的数据,例如JPEG图像或序列化的Ruby对象。字符串的长度可以是最大512MB
命令总结:
设置值
set key value [ex seconds | px milliseconds]
- 设置 key-value,可选携带过期时间
mset key value [key value...]
- 一次设置多组 key-value
获取值
get key
- 获取指定 key 的 value
mget key [key...]
- 一次获取多个指定 key 的数据
查看过期时间
ttl key
- 返回指定 key 的过期时间
-2
表示 key 不存在-1
表示 key 永不过期>=0
表示剩余时间,单位是 s
Hash(哈希)
Redis散列是字符串字段和字符串值之间的映射,因此它们是表示对象的最佳数据类型(例如,具有多个字段(如name、姓氏、年龄等)的用户)
命令总结:
赋值操作
- 为 key 赋予多个键值对
hmset -> hash more set
hmset key field value [field value...]
- 为 key 设置一对 key-value
hset key field value
取值操作
- 获取指定 key 的全部字段
hgetall -> hash get all
hgetall key
- 获取 key 中多个字段的值
HMGET key field1 [field...]
- 获取 key 中单个字段的值
HGET key field
删除 key 上的多个字段
HDEL key field1 [field...]
检查 key 中某个 field 是否存在
HEXISTS key field
List(有序列表)
列表的最大长度是2^32 - 1个元素(4294967295,每个列表可以包含超过40亿个元素)。从时间复杂性的角度来看,Redis列表的主要特性是支持在头和尾附近不断地插入和删除元素,即使插入了数百万元素。访问元素在列表的极端位置非常快,但是如果你试图访问一个非常大的列表的中间位置,则速度会很慢,因为这是一个O(N)操作。
一些可以实现的功能:
- 为社交网络中的时间轴建模,使用LPUSH在用户时间线上添加新元素,使用LRANGE检索最近插入的一些项。
- 可以使用LPUSH和LTRIM一起创建一个列表,该列表的元素数量不会超过给定的元素数量,但是只记住最新的N个元素。
命令总结:
阻塞式操作
- 超时的单位为
秒
- 阻塞等待,弹出列表左边第一个元素,或者等待超时后停止
blpop key [key...] timeout
- 阻塞等待,弹出列表右边第一个元素,或等待超时
brpop key [key...] timeout
- 阻塞等待,从 a 列表移除右边第一个元素,并添加到 b 列表的左边,或等待超时
brpoplpush fromList toList timeout
- 可以理解为
brpop + lpush
组合使用
插入操作
- 将一个或多个值插入到列表
- 左侧插入
lpush key value [value...]
- 右侧插入
rpush key value [value...]
- 将一个值插入到已存在的列表
- 左侧插入
lpushx key value
- 右侧插入
rpushx key value
移除操作
- 弹出列表中左侧第一个
lpop key
- 弹出列表中右侧第一个
rpop key
获取元素
- 获取指定范围内的元素
lrange key startIndex endIndex
- 根据索引来获取单个元素,获取失败会返回
(nil)
lindex key index
特殊操作
- 修剪列表,保存指定区间的数据
ltrim key startIndex endIndex
- 获取列表的长度
llen key
- 在列表中某个元素的 前|后 插入元素
linsert key before|after valueInList targetValue
- 如果列表中存在重复的元素,该命令会对顺序检索到的第一个元素进行操作
有很多资料都将 redis 中 list 结构的左边称为列表的头部,右边称为列表的尾部,为了避免误导大伙,文中都是称呼为左右操作 (或许在我看来,将右边称为队列的头部更合适?)
但实际上,调用诸如
lindex, lrange, linsert
等命令,会发现,redis 会从右往左来使用 list
比如,
lpush name 1 2 3
,lrange name 0 10
显示的顺序是3 2 1
并且
lindex name 0
返回值3
linsert name before 2 10
的结果是 10 插入在了 2 和 3 之间
要是觉得不错的话,大佬们赏个赞呗~
近期评论