重学redis系列之String

191 阅读10分钟

前言

提到大名鼎鼎的redis,做开发的特别是后端对于它几乎是无人不知无人不晓。作为一个后端开发必须要掌握的技术之一,提到它,我们都知道它是一个key-value类型的基于内存的键值对存储的数据库,它相较于之前memcache提供了更加丰富的数据类型的支持,同时提供了对数据持久化的需求。作为面试官喜欢考察的考点之一,我们可以不加思索的答出它所支持的数据类型,所支持的持久化方式以及适用场景----缓存(减轻数据库压力,提高应用的吞吐量)等等。我之前一直是这么认为的,面试也是这么答的,直到上周接到一个需求,我才知道redis的强大远不至此。 事情是这样的,上周接到一个需求,需要对我们app的用户做一个活跃度统计,我们app的用户量不算太大也不是很小(3000多w),需求提到需要统计任意时间段内的用户活跃度(一个用户在一定时间段内登录我们app的天数,一定时间段内登录天天数达到xx的用户数等等),要求要快速响应。拿到需求之后,第一反应是直接拿mysql来查,因为之前业务用mysql做过日志记录,用户每次登录都会产生一条日志,但是针对这个用户量所产生的数据量,要想做到秒级响应还是有点困难的(登录日志一天内登陆多次会产生多条,需要考虑去重之类的问题),因此mysql的方案被否定了,针对这种情况,数据肯定是要被存储下来,除了mysql,做为几乎所有项目不可或缺的一个组件,我们想到了redis,通过进一步了解,redis还真有针对这种场景的比较合适的解决方案。于是也就有了这篇文章,我希望通过这种方式对所学的redis知识进一步巩固并通过案例来实现上面的需求。今天我们来学习一下redis所支持的数据类型之一string。 安装redis的步骤就不在此赘述了,网上很有多,如果有必要下次再介绍。学习redis,当然最好是在linux环境下,因此windows装虚拟机可以模拟linux环境。笔者有一台去年腾讯做活动时购买的低配版云服务器用来学习,安装了centOs7.x环境,好了,至此,我们一起来学习redis吧。

redis-cli链接服务器

连接云服务器,键入redis-cli,回车,我们发现已经连接上了redis服务器。 在这里插入图片描述

不知道怎么使用,我们可以通过键入help来查看帮助。 在这里插入图片描述

下面计入今天的主题,redis之string,通过 help @String 查看redis对string类型所支持的命令。 在这里插入图片描述 可以看到回车键之后redis列出了一系列命令包括对命令的介绍以及使用方法(这也是我推荐大家使用linux环境学习redis的原因,linux环境下,我们可以通过帮助命令查看命令的说明以及使用方式,虽然工作的时候为了方便查看数据我们常用到redis desktop manager之类的可视化工具,但是在学习的时候这些可视化工具却少了许多linux环境下命令行所具有的优势)。下面我们将一一通过实验来了解这些命令的使用,最终使用它们中的部分命令来完成我们的案例需求。

APPEND

用法 APPEND key value 说明 Append a value to a key (为一个key追加一个value) 这个很好理解,直接看案例。 在这里插入图片描述 首先清空数据库,保证里面没有脏数据。 append key value,如果key不存在,则append命令和set命令的效果一样,类似于set key value,如果key在数据库中已经存在,则在其key对应的value后追加对应的值,见上图。

SET

用法 SET key value 说明 Set the string value of a key (为一个key设置一个string类型的值) 在这里插入图片描述

同时set命令还有附加参数,可以设置一个key的有效期。 在这里插入图片描述 可以看到set命令后跟ex(秒)时间值 px(毫秒)对一个key增加有效期,有效期内该key可以正常访问,超过有效期则返回nil。同时还可以在set命令后追加nx(不存在该key时设置)、 xx(存在该key时设置),感兴趣的朋友可以动手试试。

GET

用法 GET key 说明 Get the value of a key(获取一个key对应的value) 这个命令上面我们已经多次使用,就不在此演示了。

GETSET

用法 GETSET key value 说明 set the string value of a key and return its old value(为一个key设置一个新的value并返回该key旧的value,如果该key不存在则返回nil) 在这里插入图片描述

INCR

用法 INCR key 说明 Increment the integer value of a key by one(为一个值为integer的key的值增加1,当然对于不能增加的值会报错) 在这里插入图片描述

INCRBY

用法 INCRBY key increment 说明 Increment the integer value of a key by the given amount(为一个值为integer的key的值增加指定的数)

在这里插入图片描述

INCRBYFLOAT

用法 INCRBYFLOAT key increment 说明 Increment the float value of a key by the given amount(为一个值为integer的key的值增加指定的数(浮点数)) 该命令同INCRBY命令类似,从名字也可以看出它是为一个值为integer的key的值增加一个浮点数。

DECR

用法 Decr key 说明 Decrement the integer value of a key by one(为一个值为integer的key的值减少1,当然对于不能计算的值会报错,该命令对应于incr命令)。

在这里插入图片描述

DECRBY

用法 Decrby key decrement 说明 Decrement the integer value of a key by the given number(为一个值为integer的key的值减少指定的数,当然对于不能计算的值会报错,该命令对应于incrby命令,decr命令没有对应的decrbyfloat命令,不过我们可以通过incrbyfloat命令加一个负的浮点数来实现减法的效果)。 在这里插入图片描述

MSET

用法 MSet key value [key value......] 说明 Set multiple keys to multiple values(一次设置多个键值对)

MGET

用法 Mget key [key......] 说明 Get the values of all the given keys(对应于上面的mset命令,一次获取多个key对应的值)

在这里插入图片描述

SETNX

用法 Setnx key value 说明 Set the value of a key, only if the key does not exist(为一个key设置其string类型value,当且仅当该key不存在时才可以设置成功,这个命令和我们之前提到的set命令后追加nx参数实现的效果一样)。

在这里插入图片描述

MSETNX

用法 Msetnx key value [key value......] 说明 Set multiple keys to multiple values, only if none of the keys exist(从命名上可以看出这个命令是mset命令和setnx命令的合体,可以一次设置多个key-value键值对(仅当该key不存在时才可以设置成功),同时该命令具有事务性质)。 在这里插入图片描述

PSETEX

用法 Psetex key milliseconds value 说明 Set the value and expiration in milliseconds of a key(以毫秒为单位设置 key 的生存时间,类似于set命令追加px参数)。

在这里插入图片描述

PSETEX

用法 Psetex key seconds value 说明 Set the value and expiration of a key(以秒为单位设置 key 的生存时间,类似于set命令追加ex参数)。

SETRANGE

用法 Setrange key offset value 说明 Overwrite part of a string at key starting at the specified offset(按指定的偏移量对一个key的值进行覆盖)。

在这里插入图片描述

GETRANGE

用法 Getrange key start end 说明 Get a substring of the string stored at a key(按指定偏移量返回该key对应的value,类似于substring的效果)。

在这里插入图片描述

STRLEN

用法 Strlen key 说明 Get the length of the value stored in a key(返回该key对应的value长度)。 在这里插入图片描述

上面针对redis的string类型的常用命令我们做了介绍,下面将介绍剩下的可能你不太用到的命令,同时他们也是我们完成案例的主角。

SETBIT

用法 Setbit key offset value 说明 Sets or clears the bit at offset in the string value stored at key(设置或清除指定偏移量上的位(bit))。 这个操作理解起来相对复杂一点,对位(bit)操作其实就是操作对应偏移量的二进制位,大白话解释就是修改指定偏移量上的位(把对应位修改为0或1)。 在这里插入图片描述 通过上面的两次setibt操作我们将那么的值由a改为了b,怎么实现的呢?听我细细道来。 我们知道'a'的ASCII码是97,转换为二进制是:01100001,针对这个二进制数对应的偏移量(offset)就是0到7,要想把a变为b,其实只需要对a对应的二进制编码加1变为:01100010,对应到bit操作也就是要修改偏移量为6和7的位置,把7位置的1改为0,把6位置的0改为1即可,因此也就有了上面的操作。其实bit操作是一个更细粒度的操作,是针对二进制的每一个位的操作。

GETBIT

用法 Getbit key offset 说明 Returns the bit value at offset in the string value stored at key(返回指定key指定偏移量上的位(bit)值)。 有了上面的基础,相信对于gitbit的操作就很好理解,看下面的例子。 在这里插入图片描述

BITCOUNT

用法 Bitcount key [start end] 说明 Count set bits in a string(大白话理解,返回一个key对应value的二进制位上1的数量(可以添加 start end参数查找指定范围的数量),注意这个start end针对的是value值而不是bit位)。

在这里插入图片描述

BITOP

用法 Bitop operation destkey key [key......] 说明 Perform bitwise operations between strings(对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。)。 operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种:

BITOP AND destkey key [key ...] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey 。 BITOP OR destkey key [key ...] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey 。 BITOP XOR destkey key [key ...] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey 。 BITOP NOT destkey key ,对给定 key 求逻辑非,并将结果保存到 destkey 。 除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入。 在这里插入图片描述 说明:a的二进制表示是:01100001 b的二进制表示是:01100010 对a和b进行逻辑或操作,我们得到了:01100011,因此通过get dest命令得到了c。

BITPOS

用法 Bitpos key bit [start] [end] 说明 Find first bit set or clear in a string(返回字符串里面第一个被设置为1或者0的bit位)。
在这里插入图片描述

BITFIELD

用法 Bitfield key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL] 说明 尴尬,这个命令我也还没弄清楚,感兴趣的可以看看官网的说明 redis国内官网
好了,今天的介绍就到这里,鉴于篇幅较长,本文提到的案例将在下一篇进行实现(java代码),感兴趣的朋友可以关注,本人能力有限,如有描述不准确的地方,欢迎大家批评、指证,谢谢。