Redis的五种基础数据类型
Redis是非关系型数据库,它是以键值对的形式将数据存储在内存中的,当然它有完善持久化的机制保证服务的HA,这里所说的数据类型是指value的数据类型。以reidis5.0.4版本为例,记录这五种基础数据类型的用法和注意事项。
在linux上安装redis服务后启动,使用redis自带的客户端连接工具,连接到redis服务,通过输入help @ + 对应的数据类型的名称,就可以看到和该数据类型相关的指令,下面我是把bitmap这种高级数据类型,也放在下面,待五种基础数据类型都补充完, 会把bitmap迁到高级数据类型中去。
1.字符串(String)
输入 help @String后
String类型的数值操作有这么多指令,那我们一一来看
1.1 set、get指令
指令 | 解释说明 |
set | 给键设置值 |
get | 获取键对应的值 |
set还有一些复杂的操作,我们看图中指令的提示
1.2 getset指令
指令 | 解释说明 |
getset key value | 设置key对应的新值,返回旧值 |
1.3 setex、psetex、ttl指令
指令 | 解释说明 |
setex key second value | 设置键过期时间(单位秒)再设置值 |
ttl | 获取键的有效期是多久,也就是还有多久这个键值对就会被redis清除掉。 |
相同的指令如下:
指令 | 解释说明 |
set key ex 5 | 设置key的过期时间为5秒 |
指令 | 解释说明 |
psetex key milliseconds value | 设置键过期时间(单位毫秒)再设置值 |
指令 | 解释说明 |
set key value px | 设置键过期时间(单位毫秒)再设置值 |
那么说到有效期的事情,todo 待补充 可以看下redis的缓存过期清除策略。
1.4 setnx指令
指令 | 解释说明 |
setnx key value | 当键不存在时,才会将键值对添加到redis中 |
指令 | 解释说明 |
set key value nx | 当键不存在时,才会将键值对添加到redis中 |
指令 | 解释说明 |
set key value xx | 当键存在时,才会将键值对添加(本质是覆盖)到redis中 |
1.5 mset、msetnx、mget指令
指令 | 解释说明 |
mset key value key value … | 批量添加键值对 |
mget key key … | 批量获取键值对的值 |
mset key value key value … | 批量添加的键值对都不存在时,才会将所有的键值对添加到redis中 |
1.6 setrange、getrange指令
列1 | 列2 | 列3 | 列4 | 列5 | 列6 | 列7 | 列8 | 列9 | 列10 | 列11 |
正向索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
value | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
反向索引 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
指令 | 解释说明 |
getrange key start end | 当end为正数时,获取索引start到end为止的值; 当end为负数,且为-1时,获取start到最后一个索引的值 当end为负数,且超过范围时默认返回start索引位置的值 (例子中最大的反向索引是-10,你可以说是最小的因为是负值) |
1.7 strlen、append指令
指令 | 解释说明 |
strken key | 获取key对应值的长度 |
append key value | 在key对应的值后追加字符串value |
1.8 incr、decr、incrby、decrby、incrbyfloat指令
指令 | 解释说明 |
incr key | 对key的value数值加1 |
decr key | 对key的value数值减1 |
incrby key increment | 对key的value数值加指定的数 |
decrby key increment | 对key的value数值减指定的书 |
incrbyfloat key incement | 对key的value数值加指定的浮点数 |
2.散列(hash)
涉及到相关指令如下
2.1 hset、hget、hdel指令
把hash想成java数据结构中的的map
指令 | 解释说明 |
hset key field vaue | 设置key对应map的键值对,field和value为map新增的键值对 |
hget key field | 获取key对应map键field映射的值 |
hdel key field | 删除key对应map键fied及其映射的值 |
2.2 hmset、hmget指令
指令 | 解释说明 |
hmset key field value field value … | 批量设置key对应map的键值对,field和value为map新增的键值对 |
hmget key field field … | 批量获取key对应map中field对应的值 |
2.3 hsetnx指令
指令 | 解释说明 |
hsetnx key field vaue | key对应的map中,不存在field的键,再进行添加,同setnx指令是一样的道理 |
2.4 hexists指令
指令 | 解释说明 |
hexists key field | key对应的map中,是否存在field键,0 不存在 1 存在 |
2.5 hkeys、hvals、hgetall指令
指令 | 解释说明 |
hkeys key | 获取key对应map所有的键 |
hvals key | 获取key对应map所有的值 |
hgetall | 获取key对应map所有的键值对 |
2.6 hlen、hstrlen指令
指令 | 解释说明 |
hlen key | 获取key对应map中键的数量 |
hstrlen key field | 获取key对应map中,键对应值的长度 |
2.7 hscan指令
指令 | 解释说明 |
hscan key cursor match pattern count num | 从某个游标开始获取key对应map中,匹配表达式的游标位置、键、值 |
2.8 hincrby、hincrbyfloat指令
指令 | 解释说明 |
hincrby key field increment | 增加指定数量,key对应map的field的值 |
hincrbyfloat key field increment | 增加指定浮点数,key对应map的field的值 |
3.列表(lists)
涉及到的指令如下
3.1 lpush、lpop、rpush、rpop指令
可以将list理解为一个队列
指令 | 解释说明 | 指令执行完成后的值 |
lpush key value value value | 从左侧向队列列表添加值 | 4 3 2 1 |
rpush key value value value | 从右侧向队列列表添加值 | 4 3 2 1 5 6 7 8 |
lpop key | 从左侧移除第一个元素并返回 | 3 2 1 5 6 7 8 |
rpop key | 从左侧移除第一个元素并返回 | 3 2 1 5 6 7 |
3.2 blpop、brpop指令
todo 搞成动图
指令 | 解释说明 |
blpop key timeout | 阻塞从左侧获取元素,直到超时,如果timeou为0则一直阻塞 |
brpop key timeout | 阻塞从右侧获取元素,直到超时,如果timeou为0则一直阻塞 |
3.3 rpoplpush、brpoplpush指令
todo 搞成动图
指令 | 解释说明 |
rpoplpush source destination | 从一个list右侧获取元素,添加到另一个list的最左侧 |
brpoplpush source destination timeout | 阻塞从一个list右侧获取元素,添加到另一个list的最左侧 如果timeout为0,获取不到元素就一直阻塞 如果timeout不为0就阻塞指定的时间后结束指令 |
3.4 lpushx、rpushx、llen指令
指令 | 解释说明 |
lpushx key value | 当列表存在时,才向左侧添加元素 |
rpushx key value | 当列表存在时,才向右侧添加元素 |
3.5 lset、lrem、lrange指令
指令 | 解释说明 |
lset key index vaue | lset 设置指定索引位置的值 |
lrem key count value | 移除list中指定元素,当count=0,移除全部指定元素; 当count>0,从左侧移除count个指定元素;当count<0,从右侧移除count个指定元素 |
lrange key start end | 获取list,索引start到end的元素,支持正反向索引 |
3.6 lindex、linsert指令
指令 | 解释说明 |
lindex key index | 获取list指定索引位置的元素 |
linsetr key after/before pivot value | 在list从左查找到的元素前或后,添加元素 |
3.7 ltrim指令
指令 | 解释说明 |
ltrim key start stop | 移除指定start到stop索引区间外的元素,支持正反向索引 |
4. 集合(sets)
4.1 sadd、srem、smembers、sismember指令
指令 | 解释说明 |
sadd key member member… | 向key的集合中添加元素(自带去重) |
smembers key | 获取key对应集合中所有的元素 |
srem key member member … | 移除key对应集合中的指定的元素 |
sismember key member | 判断给定的元素是否为key对应集合中的元素 |
4.2 spop、srandmember、smove指令
指令 | 解释说明 |
spop key count | 从key对应的集合中随机移除count个元素并返回 |
srandmember key count | 从key对应的集合中随机获取(不移除)count个元素并返回 |
smove source destination member | 将元素从source移除添加到destination集合中 |
4.3 scard、sscan指令
指令 | 解释说明 |
scard key | 获取key对应集合的元素数量 |
sscan key cursor match pattern count num | 从某个游标开始获取key对应集合中,匹配表达式的元素,count表示每次获取的数量 |
4.4 sinter、sinterstore指令
指令 | 解释说明 |
sinter key key … | 获取多个key对应集合中元素的交集 |
sinterstore destination key key … | 获取多个key对应集合中元素的交集并保存到destination集合中 |
4.5 sunion、sunionstore指令
指令 | 解释说明 |
sunion key key … | 获取多个key对应集合中元素的并集 |
sunionstore destination key key … | 获取多个key对应集合中元素的并集并保存到destination集合中 |
4.6 sdiff、sdiffstore指令
指令 | 解释说明 |
sdiff key key … | 获取多个key对应集合中元素的差集 |
sdiffstore destination key key … | 获取多个key对应集合中元素的差集(实际获取是和第一个key对应的集合相比,缺少的元素)并保存到destination集合中 |
5. 有序集合(sorted sets)
有序集合,那么是怎么样达到有序的呢?按照什么排序呢?
5.1 zadd、zrange、zrevrange、zcard、zrem指令
指令 | 解释说明 |
zadd key [nx xx] score member [score member…] | 添加一个元素及其分数到有序集合中,nx就是不存在再添加,xx就是存在再添加 |
zrange key start stop | 获取有序集合中,获取指定升序序索引范围内元素 |
zrevrange key start stop | 获取有序集合中,获取指定降序索引范围内元素 |
zcard key | 获取有序集合中元素的数量 |
zrem key | 移除有序集合中指定元素 |
5.2 zincrby、zscore、zcount指令
指令 | 解释说明 |
zincrby key increment member | 增加有序集合中指定元素的分数 |
zscore key member | 获取有序集合对应元素的分数 |
zcount key min max | 统计有序集合中分数再max和min之间的元素 |
5.3 zpopmax、zpopmin指令
指令 | 解释说明 |
zpopmax key count | 移除有序集合中分数最大的count个元素 |
zpopmin key count | 移除有序集合中分数最小的count个元素 |
5.4 zrank、zrevrank指令
指令 | 解释说明 |
zrank key member | 获取有序集合中指定元素升序排序索引 |
zrevrank key member | 获取有序集合中指定元素降序排序索引 |
5.5 zrangebyscore、zrevrangebyscore、zrangebylex、zrevrangebylex指令
指令 | 解释说明 |
zrangebyscore key min max | 根据分数范围获取有序集合中的元素按照升序排序返回 |
zrevreangebyscore key max min | 根据分数范围获取有序集合中的元素按照降序排序返回 |
zrangebylex key min max | todo 待补充 |
zrevrangebylex key | todo 待补充 |
5.6 zremrangebyrank、zremrangebyscore、zremrangebylex指令
指令 | 解释说明 |
zremrangebyrank key start stop | 根据降序索引范围移除有序集合中的元素 |
zremrangebyscore key min max | 根据分数范围移除有序集合中的元素 |
zremrangebylex key min max | todo 待补充 |
5.7 zscan、zlexcount指令
指令 | 解释说明 |
zscan key cursor match pattern count count | 从某个游标开始获取有序集合中,匹配表达式的元素,count表示每次获取的数量 |
zlexcount key min max | todo 待补充 |
5.8 zinterstore、zunionstore指令
指令 | 解释说明 |
zinterstore destination key key weight agreegate [max min sum] | 去多个集合的交集中的元素,weight权重,argeegate取最大值 最小值或者和,保存到另一个集合中 |
zunionstore destination key key weight agreegate [max min sum] | 去多个集合的集中的元素,weight权重,argeegate取最大值 最小值或者和,保存到另一个集合中 |
5.9 bzpopmax、bzpopmin指令
指令 | 解释说明 |
bzpopmax key timeout | 阻塞获取有序集合中分数最大的元素及其分数,timeout为-1则会一直阻塞,直到有序集合中有元素 |
bzpopmin key timeout | 阻塞获取有序集合中分数最小的元素及其分数,timeout为-1则会一直阻塞,直到有序集合中有元素 |
那我们通过这些指令的学习可以得出上面问题的结论,有序集合是按照什么排序的,是按照设置的score进行排序的,他支持降序查询、升序查询等等复杂的查询。
我们是不是应该思考为什么redis为我们提供了这么多的数据类型?
思考1:是不是为了减少网络io的数据量,才这么涉及的,我们知道影响请求和响应速度的瓶颈是io,各种io,磁盘IO,网络IO等
思考2:计算向数据移动,也是为了减少IO