0
点赞
收藏
分享

微信扫一扫

Redis数据类型——List列表数组


01 Redis数据模型

Redis数据类型——List列表数组_字段

02 List 列表数组

  • 基于Linked List实现
  • 元素是字符串类型
  • 列表头尾增删快,中间增删慢,增删元素是常态
  • 元素可以重复出现
  • 最多包含2^32-1元素

Redis数据类型——List列表数组_redis_02

  • 列表的索引n从左至右,从0开始
  • 从右至左,从-1开始
list:
  • 队列:L/R R/L
  • 栈: L/L R/R
  • 数组:LINDEX LSET
  • 阻塞:BL BR

Redis数据类型——List列表数组_字段_03

2.1 命令说明

B block #块,阻塞
L left #左
R right #右
X exist #存在

# 左右或者头尾压入元素 string set key “abc”
LPUSH key value [value ...]
LPUSHX key value
RPUSH key value [value ...]

2.2 双端队列,栈,数组

# 左右或者头尾弹出元素
LPOP key
RPOP key

# 从一个列表尾部弹出元素压入到另一个列表的头部 string getset
RPOPLPUSH source destination
# 返回列表中指定范围元素

2.3 获取指定位置元素

# 获取指定位置的元素
LINDEX key index
# 设置指定位置元素的值
LSET key index value
# 列表长度,元素个数 string strlen

2.4 从列表头部开始删除值等于value的元素count次,LIST 可以重复出现

LREM key count value
count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值
count = 0 : 移除表中所有与 value 相等的值

# 举例

Redis数据类型——List列表数组_字段_04

2.5 去除指定范围外元素

LTRIM key start stop

# 举例
RPUSH listkey c abc c ab 123 ab bj ab redis list
LTRIM listkey 0 -1
LTRIM listkey 1 -1
LTRIM listkey 1 10000
# 微博的评论最后500条:盖楼

2.6 在列表中某个存在的值(pivot)前或后插入元素

# key和pivot不存在,不进行任何操作
LINSERT key BEFORE|AFTER pivot value


#举例

Redis数据类型——List列表数组_redis_05


Redis数据类型——List列表数组_redis_06

2.7 阻塞

# 如果弹出的列表不存在或者为空,就会阻塞
# 超时时间设置为0,就是永久阻塞,直到有数据可以弹出
# 如果多个客户端阻塞在同一个列表上,使用First In First Service原则,先到先服务

# 左右或者头尾阻塞弹出元素
BLPOP key [key ...] timeout
BRPOP key [key ...] timeout

# 从一个列表尾部阻塞弹出元素压入到另一个列表的头部
BRPOPLPUSH source destination timeout

2.8 Hash 散列

  • 由field和关联的value组成的map键值对
  • field和value是字符串类型
  • 一个hash中最多包含2^32-1键值对
  • Redis数据类型——List列表数组_字段_07

2.8.1 命令

#  设置单个字段,key的filed不存在的情况下执行,key不存在直接创建
HSET key field value
HSETNX key field value

# 设置多个字段
HMSET key field value [field value ...]

# 返回字段个数
HLEN key
# 判断字段是否存在,key或者field不存在,返回0
HEXISTS key field

# 返回字段值
HGET key field
#返回多个字段值
HMGET key field [field ...]
# 返回所有的键值对
HGETALL key
# 返回所有字段名
HKEYS key
# 返回所有值

2.8.2 在字段对应的值上进行整数的增量计算

HINCRBY key field increment
# 在字段对应的值上进行浮点数的增量计算
HINCRBYFLOAT key field increment
# 删除指定的字段
HDEL key field [field ...]


# 案例

2.8.3 Hash 用途

  • 节约内存空间
  • 每创建一个键,它都会为这个键储存一些附加的管理信息(比如这个键的类型,这个键最后一次被访问的时间等等)
  • 所以数据库里面的键越多,redis数据库服务器在储存附加管理信息方面耗费的内存就越多,花在管理数据库键上的CPU也会越多在字段对应的值上进行浮点数的增量计算
  • Redis数据类型——List列表数组_字符串_08

2.8.4 不适合Hash情况

  • 使用二进制位操作命令:因为Redis目前支持对字符串键进行SETBIT、GETBIT、BITOP等操作,如果你想使用这些操作,那么只能使用字符串键,虽然散列也能保存二进制数据
  • 使用过期键功能:Redis的键过期功能目前只能对键进行过期操作,而不能对散列的字段进行过期操作,因此如果你要对键值对数据使用过期功能的话,那么只能把键值对储存在字符串里面


举报

相关推荐

0 条评论