Bootstrap

Redis自学之路—基础数据结构具体方法解析(五)

目录

简介

数据结果具体方法解析

字符串(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

hvals获取所有value

;