Redis几种对外的数据结构:String(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)。

1、字符串
字符串是Redis最基本的数据结构,字符串类型的值实际可以是字符串、数字,甚至是二进制(图片、音频、视频),但是最大值不能超过512MB。
常用命令:
(1)设置值
set key value[ex second] [px millisenconds] [nx|xx]
set命令有几个选项:
ex seconds:为键设置秒级过期时间
px milliseconds:为键设置毫秒过期时间
nx:键必须不存在,才可以设置成功,用于添加
xx:与nx相反,键值必须存在才可以设置成功,用于更新
(2)获取值
get key
如果键值不存在则返回nill(空)
(3)批量获取值
mget key [key ....]
(4)批量设置值
mset key value [key .....]
(5)计数
Redis提供了incr(自增)、decr(自减)、incrby(自增指定数字)、decrby(自减指定数字)、incrbyfloat(自增浮点数):
incr key
decr key
incrby key increment
decrby key decrement
incrbyfloat key increment
不常用命令:
(1)追加值
append key value
(2)字符串长度
strlen key
(3)设置并返回原值
getset key value
(4)设置指定位置的字符
setrange key offset value
(5)获取部分字符串
getrange key start end
内部编码
int:8个字节的长整形
embstr:小于等于39个字节的字符串
raw:大于39个字节的字符串
Redis会根据当前值的类型和长度决定使用哪种内部编码实现。
2、哈希
在Reids中,哈希类型是指键值本身又是一个键值对结构,形如value = {{field1,value1},....{fieldN,valueN}}..
命令
(1)设置值
hset key field value
hset user:1 name tom
(2)获取值
hget key field
(3)删除field
hdel key field [field .....]
(4)计算field个数
hlen key
(5)批量设置或获取field - value
hmget key field [field ....]
hmset key field value [field value]
(6)判断field是否存在
hexists key field
(7)获取所有的field
hkeys key
(8)获取所有value
hvals key
(9)获取所有的key - value
hgetall key
在使用hgetall时,如果哈希元素比较多,会有阻塞Redis的可能,如果要获取全部field-value,可以使用hscan命令,该命令会渐进式遍历哈希类型。
(10)计算value的字符串长度
hstrlen key field
内部编码
1、ziplist(压缩列表):当hash-max-ziplist-entries配置(默认为512个)、同属所有值都小于hash-max-ziplist-value配置(默认为64字节)时,Redis会使用ziplist作为哈希内部实现。
2、hashtable(哈希表):当不满足ziplist条件时,会采用hashtable作为哈希内部实现。
3、列表
列表(list)类型是用来存储多个有序的字符串,列表中每个字符串称为元素(element),一个列表可以存储2的32次方减1个元素,在Redis中可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等。
列表类型两个特点:一、列表中元素有序。二:列表中的元素可重复。
命令
1、添加操作
(1)从右边 | 左边插入元素
rpush | lpush key value [value ....]
(2)向某个元素前或后插入元素
linsert key before | after pivot value
2、查找操作
(1)获取指定范围内的元素列表
lrange key start end
索引下标从左到右分别是0到N-1,但是从右。到左分别是-1到-N。
lrange中的end选项包含了自身。
(2)获取列表指定索引下标的元素
lindex key index
(3)获取列表长度
llen key
3、删除
(1)从列表左侧 | 右侧弹出元素
lpop | rpop key
(2)删除指定元素
lrem key count value
count > 0,从左到右,删除最多count个元素
count < 0,从右到左,删除最多count个元素
count = 0,删除所有
(3)按照索引范围修剪列表
ltrim key start end
(4)修改指定索引下标元素
lset key index newValue
(5)阻塞操作
blpop key [key ...] timeout
brpop key [key ...] timeout
lpop he rpop的阻塞版本
key [key ....]:多个列表的键值
timeout:阻塞时间
内部编码
1、ziplist(压缩列表):当hash-max-ziplist-entries配置(默认为512个)、同属所有值都小于hash-max-ziplist-value配置(默认为64字节)时,Redis会使用ziplist作为哈希内部实现。
2、linkedlist(链表):当列表类型无法满足ziplist条件时,Redis会采用linkedlist作为列表的内部实现。
使用场景
1、消息队列:Redis的lpush和brpop命令组合即可实现阻塞队列。
2、文章列表:分页展示文章列表。
lpush + lpop = Stack(栈)
lpush + rpop = Queue(队列)
lpush + ltrim = Capped Collection(有限集合)
lpush + brpop = Message Queus(消息队列)
4、集合
集合(set)类型也是用来保存多个字符串元素,集合中不允许重复元素,且集合中的元素是无序的,不能通过索引下标获取元素。Redis除了支持集合内的增删查改,同时还支持多个集合取交集、并集、差集。
命令
1、集合内的操作
(1)添加元素
sadd key element [element ...]
返回结果为添加成功的元素个数。
(2)删除元素
srem key element [element ...]
返回结果为删除成功元素个数。
(3)计算元素个数
scard key
(4)判断元素是否在集合中
sismember key element
在集合内则返回1,反正则返回0.
(5)随机从集合返回指定个数元素
srandmember key [count]
(6)从集合随机弹出元素
spop key
(7)获取所有元素
smembers key
2、集合间的操作
(1)求多个集合的交集
sinter key [key ...]
(2)求多个集合的并集
suinon key [key ...]
(3)求多个集合的差集
sdiff key [key ...]
(4)将交集、并集、差集的结果保存
sinterstore destination key [key ...]
suionstore destination key [key ...]
sdiffstore destination key [key ...]
内部编码
1、intset(整数集合):当集合中的元素都是整数且元素个数小于set-max-intset-entries配置(默认512个)时,Redis会采用intset来作为集合的内部实现。
2、hashtable(哈希表):当集合类型无法满足intset条件时,Redis会采用hashtable来作为集合内部实现。
使用场景
集合类型适合比较典型的使用场景是标签。
5、有序集合
保留了集合不能有重复成员的特性,但不同的是,有序集合中的元素可以排序。但是它和列表中使用的索引下标作为排序依据不同的是,它给每一个元素设置一个分数(score)来作为排序依据。
命令
1、集合内
(1)添加成员
zadd key score member [sore member ...]
返回结果代表成功添加成员个数。
Redis3.2为zadd命名添加了nx、xx、ch、incr四个选项:
nx:member必须不存在才可以设置成功,用于添加。
xx:member必须存在才可以设置成功,用于更新。
ch:返回此操作后,有序集合元素和分数发生变化的个数。
incr:对score做增加。
(2)计算成员个数
zcard key
(3)计算某个成员的分数
zscore key member
(4)计算成员的排名
zrank key member
zrevrank key member
zrank是从分数从低到高返回排名。
zrevrank是从分数从高到低排名。
(5)删除成员
zrem key member [member ...]
(6)增加成员分数
zincrby key increment member
(7)返回指定排名范围的成员
zrange key start end [withscores]
zrevrange key start end [withscores]
加上withscores会返回成员的分数。
(8)返回指定分数范围的成员
zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key max min [withscores] [limit offset count]
其中zrangebyscore按照分数从低到高返回,zrevrangebyscore反之,[limit offset count]限制输出的起始位置和个数。
(9)返回指定分数分为成员个数
zcount key min max
(10)删除指定排名内的升序元素
zremrangebyrank key start end
(11)删除指定分数范围的成员
zremrangebyscore key min max
2、集合间的操作
(1)交集
zinterstore destination numkeys key [key ...] [weights weight [weight ...] ] [aggregate sum | min | max ]
destination:交集计算结果保存到这个键。
numkeys:需要做交集的个数。
key [key ...]:需要做交集计算的键。
weights weight [weight ...] :每个键值的权重,在做交集计算时,每个键中的每个member会将自己分数乘以这个权重,每个键的权重默认是1.
aggregate sum | min | max :计算成员交集后,分值可以按照sum(和)、min(最小值)、max(最大值)做汇总,默认是sum。
(2)并集
zunionstore destination numkeys key [key ...] [weights weight [weight ...] ] [aggregate sum | min | max ]
内部编码
1、ziplist(压缩列表):当hash-max-ziplist-entries配置(默认为512个)、同属所有值都小于hash-max-ziplist-value配置(默认为64字节)时,Redis会使用ziplist作为哈希内部实现。
2、skiplist(跳跃表):当ziplist不满足条件时,有序集合就会使用skiplist作为内部实现。
使用场景
有序集合比较典型的使用场景就是排行榜系统。
参考:
Redis开发与运维