目录
简介
数据结果具体方法解析
字符串(String)
操作命令
set设置值
setex
setnx
get获取值
del删除key
mset批量设置值
incr数字运算
append追加指令
strlen字符串长度
getset设置并返回原值
setrange设置指定位置的字符
getrange截取字符串
命令的时间复杂度
使用场景
缓存功能
计数
共享Session
限速
哈希(Hash)
操作命令
hset设值
hget取值
hdel删除field
hlen计算field个数
hmset批量设值
hget批量取值
hexists判断field是否存在
hvals获取所有value
hgetall获取所有field与value
hincrby自增指定数字
hstrlen计算value的字符串长度
命令的时间复杂度
使用场景
列表(list)
列表类型有两个特点
操作命令
lrange 获取指定范围内的元素列表(不会删除元素)
rpush 向右插入
lpush向左插入
linsert在某个元素前或后插入新元素
lpop从列表左侧弹出(会删除元素)
rpop从列表右侧弹出(会删除元素)
lrem对指定元素进行删除
ltrim按照索引范围修剪列表
lset修改指定索引下标的元素
lindex获取列表指定索引下标的元素
llen获取列表长度
blpop和brpop阻塞式弹出元素
使用场景
消息队列
实现其他数据结构
集合(set)
集合内操作命令
sadd添加元素
srem删除元素
scard计算元素个数
sismember判断元素是否在集合中
srandmember随机从集合返回指定个数元素
spop从集合随机弹出元素
smembers获取所有元素(不会弹出元素)
集合间操作命令
sinter求多个集合的交集
sunion求多个集合的并集
sdiff求多个集合的差集
将交集、并集、差集 的结果保存
使用场景
有序集合(ZSET)
集合内操作命令
zadd添加成员
zcard计算成员个数
zscore计算某个成员的分数
zrank计算成员的排名
zrem删除成员
zincrby增加成员的分数
zrange和zrevrange返回指定排名范围的成员
zrange
zrevrange
zrangebyscore返回指定分数范围的成员
zcount返回指定分数范围成员个数
zremrangebyrank按升序删除指定排名内的元素
zremrangebyscore删除指定分数范围的成员
集合间操作命令
zinterstore交集
zunionstore并集
使用场景
简介
Redis提供的基础数据结构常用的有5种,分别是字符串(String)、哈希(Hash)、列表(list)、集合(Set)、有序集合(zset)。
数据结果具体方法解析
字符串(String)
字符串类型是Redis最基础的数据结构。首先键都是字符串类型,而且其他几种数据结构都是在字符串类型基础上构建的,所以字符串类型能为其他四种数据结构的学习奠定基础。字符串类型的值实际可以是字符串(简单的字符串、复杂的字符串(例如JSON\XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过512MB。
虽然Redis是C写的,C里面有字符串<本质使用char数组来实现>,但是处于种种考虑,Redis还是自己实现了字符串类型
操作命令
set设置值
set key value [EX seconds | PX milliseconds | EXAT timestamp | PXAT milliseconds-timestamp | KEEPTTL] [NX | XX] [GET]
set命令有几个选项:
- ex seconds:为键设置秒级过期时间
- px milliseconds:为键设置毫秒级过期时间
- nx:键必须不存在,才可以设置成功,用于添加(分布式锁使用)
- xx:与nx相反,键必须存在,才可以设置成功,用于更新
从执行效果上看,ex参数和expire命令基本一样。还有一个需要特别注意的地方是如果一个字符串已经设置了过期时间,然后调用了set方法修改了它,它的过期时间会消失。
而nx和xx执行效果如下
除了set选项,Redis还提供了setex和setnx两个命令:
setex
为键设置秒级过期时间
setex key seconds value
setnx
键必须不存在,才可以设置成功,用于添加
setnx key value
setex和setnx的作用和ex和nx选项是一样的,
setex为键设置秒级过期时间,
setnx设置时键必须不存在,才可以设置成功。
get获取值
如果要获取的键不存在,则返回nil(空)
get key
del删除key
del key [key ...]
mset批量设置值
通过mset命令一次性设置4个键值对;
通过mget批量获取值;
mset key value [key value ...]
批量获取了键a、b、c、d的值:
如果有些键不存在,那么它的值为nil(空),结果是按照传入键的顺序返回。
批量操作命令可以有效提高效率;
1.假如没有mget这样的命令,要执行n次get命令具体耗时:
n次 get时间 = n次网络时间 + n次命令时间
2.使用mget命令后,要执行n次get命令操作具体耗时如下:
n次get时间 = 1次网络时间 + n次命令时间
incr数字运算
incr命令用于对值做自增操作,返回结果分为三种情况:
- 值不是整数,返回错误。
- 值是整数,返回自增后的结果。
- 键不存在,按照值为0自增,返回结果为1.
incr key
除了incr命令,
- Redis提供了decr(自减)、
- incrby(自增指定数字)、
- decrby(自减指定数字)、
- incrbyfloat(自增浮点数)
append追加指令
append可以向字符串尾部追加值
append key value
strlen字符串长度
返回字符串长度
strlen key
注意:每个中午占3个字节
getset设置并返回原值
getset和set一样会设置值,但是不同的是,它同时会返回键原来的值
getset key value
setrange设置指定位置的字符
下标从0开始计算。
setrange key offset value
getrange截取字符串
getrange截取字符串中的一部分,形成一个子串,需求指明开始和结束的偏移量,截取的范围是个闭区间。
getrange key start end
命令的时间复杂度
字符串这些命令中,
除了del、mset、mget支持多个键的批量操作,时间复杂度和键的个数相关,为O(n),
getrange和字符串长度相关,也是O(n),
其余的命令基本上都是O(1)的时间复杂度,在速度上还是非常快的。
使用场景
字符串类型的使用场景很广泛:
-
缓存功能
Redis作为缓存层,MySQL作为存储层,绝大部分请求的数据都是从Redis中获取。由于Redis具有支撑高并发的特性,所以缓存通常能起到加速读写和降低后端压力的作用。
-
计数
使用Redis作为计数的基础工具,它可以实现快速计数、查询缓存的功能,同时数据可以异步落地到其他数据源。
-
共享Session
一个分布式Web服务将用户的Session信息(例如用户登录信息)保存在各自服务器中,这样会造成一个问题,处于负载均衡的考虑,分布式服务会将用户的访问均衡到不同服务器上,用户刷新一次访问可能会发现需求重启登录,这个问题是用户无法容忍的。
为了解决这个问题,可以使用Redis将用户的Session进行集中管理,在这种模式下只要保证Redis是高可用和扩展性的,每次用户更新或者查询登录信息都直接从Redis中集中获取。
-
限速
比如,很多应用处于安全的考虑,会在每次进行登录时,让用户输入手机验证码,从而确定是否是用户本人。但是为了短信接口不被频繁访问,会限制用户每分钟获取验证码的频率,例如一分钟不能超过5次。一些网站限制一个IP地址不能在一秒钟之内访问超过n次也可以采用类似的思路。
哈希(Hash)
Java里提供了HashMap,Redis中也有类似的数据结构,就是哈希类型。但是要注意,哈希类型中的映射关系叫作field-value,注意这里的value是指field对应的值,不是键对应的值。
操作命令
基本上,哈希的操作命令和字符串的操作命令很类似,很多命令在字符串类型的命令前面加上了h字母,代表是操作哈希类型,同时还要指明操作的field的值。
hset设值
如果设置成功会返回1,反之会返回0. 此外Redis提供了hsetnx命令,它们的关系就像set和setnx命令一样,只不过作用域由键变为field。
hset key field value [field value ...]
hget取值
如果键或field不存在,会返回nil。
hget key field
hdel删除field
hdel会删除一个或多个field,返回结果为成功删除field的个数。
hlen计算field个数
hmset批量设值
hget批量取值
hexists判断field是否存在
若存在返回1,不存在返回0
hkeys获取所有field
它返回指定哈希键所有的field