一、list列表
1.list列表
基于linked list实现
元素是字符串类型
列表头尾增删快,中间增删慢,增删元素是常态
元素可以重复实现
最多包含2^32-1元素
2.列表的索引
从左至右,从0开始
从右至左,从-1开始
3.命令
(1)命令说明
B block 块,阻塞
L left 左
R right 右
X exist 存在
(2)左右或者头尾压入元素
lpush key value [value ..]
lpushx key value
rpush key value [value ...]
rpushx key value
(3)左右或者头尾弹出元素
lpop key
rpop key
(4)从一个列表尾部弹出元素并压入到另一个列表的头部
rpoplpush source destination
(5)返回列表中指定范围元素
lrange key start stop
lrange key 0 -1 表示返回所有元素
(6)获取指定位置的元素
lindex key index
(7)设置指定位置元素的值
lset key index value
(8)列表长度,元素个数
llen key
(9)从列表头部开始删除值等于value的元素count次
lren 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
(10)去除指定范围外元素
ltrim key start stop
举例:
RPUSH listkey c abc c ab 123 ab bj ab redis list
LREM listkey 2 ab
LRANGE listkey 0 -1
微博的评论最后500条
ltrim u1234:forumid:comments 0 499
(11)在列表中某个存在的值(pivot)前或后插入元素
linsert key before|after pivot value
key和pivot不存在,不进行任何操作
举例:
RPUSH lst Clojure C Lua
LINSERT lst AFTER C Python
LINSERT lst BEFORE C Ruby
(12)阻塞
如果弹出的列表不存在或者为空,就会阻塞
超出时间设置为0,就是永久阻塞,直到有数据可以弹出
如果多个客户端阻塞在同一个列表上,使用first in first service原则,先到先服务
(13)左右或者头尾阻塞弹出元素
blpop key [key ...] timeout
brpop key [key ...] timeout
(14)从一个列表尾部阻塞弹出元素压入到另一个列表的头部
brpoplpush source destination timeout
二、hash散列
1.hash散列
由field和关联的value组成的map键值对
field和value是字符串类型
一个hash中最多包含2^32-1键值对
2.命令
(1)设置单个字段
hset key field value
hsetnx key field value
key的field不存在的情况下执行,key不存在直接创建
(2)设置多个字段
hmset key field value [field value ...]
(3)返回字段个数
hlen key
(4)判断字段是否存在
hexists key field
key或者field不存在,返回0
(5)返回字段值
hget key field
(6)返回多个字段值
hmget key field [field ...]
(7)返回所有的键值对
hgetall key
(8)返回所有字段名
hkeys key
(9)返回所有值
hvals key
(10)在字段对应的值上进行整数的增量计算
hincrby key field in increment
(11)在字段对应的值上进行浮点数的增量计算
hincrbyfloat key field increment
(12)删除指定的字段
hdel key field [field ...]
举例:
HINCRBY numbers x 100
HINCRBY numbers x -50
HINCRBYFLOAT numbers x 3.14
HDEL numbers
3.hash用途
(1)节约内存空间
(2)没创建一个键,它都会为这个键储存一些附加的管理信息(比如这个键的类型,这个键最后一次被访问的时间等等)
(3)所以数据库里面的键越多,redis数据库服务器在储存附加管理信息方面耗费的内存就越多,花在管理数据库键上的CPU也会越多在字段对应的之上进行分浮点数的增量计算
(4)不适合hash的情况
a:使用二进制位操作命令:因为redis目前支持对字符串键进行setbit、getbit、bitop等操作,如果你想使用这些操作,那么只能使用字符串键,虽然散列也能保存二进制数据
b:使用过期键功能:redis的键过期功能目前只能对键进行过期操作,而不能对散列的字段进行过期操作,因此如果你要对键值对数据使用过期功能的话,那么只能把键值对储存在字符串里面。
4.案例
微博的好友关注
用户ID为key,Field为好友ID,Value为关注时间
user:1000 user:606 20150808
用户维度统计
统计数包括:关注数、粉丝数、喜欢商品数、发帖数
用户为Key,不同维度为Field,Value为统计数
比如关注了5人
HSET user:100000 follow 5
HINCRBY user:100000 follow 1