01 Redis数据模型
02 List 列表数组
- 基于Linked List实现
- 元素是字符串类型
- 列表头尾增删快,中间增删慢,增删元素是常态
- 元素可以重复出现
- 最多包含2^32-1元素
- 列表的索引n从左至右,从0开始
- 从右至左,从-1开始
list:
- 队列:L/R R/L
- 栈: L/L R/R
- 数组:LINDEX LSET
- 阻塞:BL BR
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 ...]
RPUSHX key value
2.2 双端队列,栈,数组
# 左右或者头尾弹出元素
LPOP key
RPOP key
# 从一个列表尾部弹出元素压入到另一个列表的头部 string getset
RPOPLPUSH source destination
# 返回列表中指定范围元素
LRANGE key start stop
LRANGE key 0 -1 表示返回所有元素
2.3 获取指定位置元素
# 获取指定位置的元素
LINDEX key index
# 设置指定位置元素的值
LSET key index value
# 列表长度,元素个数 string strlen
LLEN key LRANGE KEY 0 -1
2.4 从列表头部开始删除值等于value的元素count次,LIST 可以重复出现
LREM key count value
count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值
count = 0 : 移除表中所有与 value 相等的值
# 举例
RPUSH listkey c abc c ab 123 ab bj ab redis list
LREM listkey 2 ab
LRANGE listkey 0 -1
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条:盖楼
lpush u1234:forumid:comments comments
LTRIM u1234:forumid:comments 0 499
2.6 在列表中某个存在的值(pivot)前或后插入元素
# key和pivot不存在,不进行任何操作
LINSERT key BEFORE|AFTER pivot value
#举例
RPUSH lst Clojure C Lua
LINSERT lst AFTER C Python
LINSERT lst BEFORE C Ruby
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键值对
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
# 返回所有值
HVALS key
2.8.2 在字段对应的值上进行整数的增量计算
HINCRBY key field increment
# 在字段对应的值上进行浮点数的增量计算
HINCRBYFLOAT key field increment
# 删除指定的字段
HDEL key field [field ...]
# 案例
HINCRBY numbers x 100
HINCRBY numbers x -50
HINCRBYFLOAT numbers x 3.14
HDEL numbers x
2.8.3 Hash 用途
- 节约内存空间
- 每创建一个键,它都会为这个键储存一些附加的管理信息(比如这个键的类型,这个键最后一次被访问的时间等等)
- 所以数据库里面的键越多,redis数据库服务器在储存附加管理信息方面耗费的内存就越多,花在管理数据库键上的CPU也会越多在字段对应的值上进行浮点数的增量计算
2.8.4 不适合Hash情况
- 使用二进制位操作命令:因为Redis目前支持对字符串键进行SETBIT、GETBIT、BITOP等操作,如果你想使用这些操作,那么只能使用字符串键,虽然散列也能保存二进制数据
- 使用过期键功能:Redis的键过期功能目前只能对键进行过期操作,而不能对散列的字段进行过期操作,因此如果你要对键值对数据使用过期功能的话,那么只能把键值对储存在字符串里面