redis—String字符串

这篇具有很好参考价值的文章主要介绍了redis—String字符串。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

1.字符串数据类型

2.常见命令

3.典型应用场景


前言

字符串类型是Redis最基础的数据类型,关于字符串需要特别注意: 1)首先Redis中所有的键的类型都是字符串类型,而且其他几种数据结构也都是在字符串类似基础.上构建的,例如列表和集合的
元素类型是字符串类型,所以字符串类型能为其他4种数据结构的学习奠定基础。2) 其次,如图2-7所示,字符串类型的值实际可以是字符串,包含-般格式的字符串或者类似JSON、XML 格式的字符串;数字,可以是整型或者浮点型;甚至是二进制流数据,例如图片、音频、视频等。不过一个字符串的最大值不能超过512 MB。

由于Redis内部存储字符串完全是按照二进制流的形式保存的,所以Redis是不处理字符集
编码问题的,客户端传入的命令中使用的是什么字符集编码,就存储什么字符集编码。

1.字符串数据类型

redis—String字符串,开发语言,redis

2.常见命令

SET
将string类型的value设置到key中。如果key之前存在,则覆盖,无论原来的数据类型是什么。之
前关于此key的TTL也全部失效。
语法:

SET key value [expiration EX seconds|PX milliseconds] [NX|XX] 

命令有效版本: 1.0.0之后
时间复杂度: 0(1)
选项:
SET命令支持多种选项来影响它的行为:
EX seconds一使用秒作为 单位设置key的过期时间。
PX milliseconds 一使用毫秒作为 单位设置key的过期时间。
NX —只在key不存在时才进行设置,即如果key之前已经存在,设置不执行。
XX一只在key存在时才进行设置,即如果key之前不存在,设置不执行。
注意:由于带选项的SET命令可以被SETNX、SETEX、 PSETEX 等命令代替,所以之后的版本
中,Redis 可能进行合并。
返回值:
●如果设置成功,返回OK。.
●如果由于SET指定了NX或者XX但条件不满足,SET不会执行,并返回(nil)。
示例:

redis> EXISTS mykey
(integer) 0
redis> SET mykey "Hello"
OK
redis> GET mykey
"Hello"
redis> SET mykey "World" NX
(nil)
redis> DEL mykey
(integer) 1
redis> EXISTS mykey
(integer) 0
redis> SET mykey "World" XX
(nil)
redis> GET mykey
(nil)
redis> SET mykey "World" NX
OK
redis> GET mykey
"World"
redis> SET mykey "Will expire in 10s" EX 10
OK
redis> GET mykey
"Will expire in 10s"
redis> GET mykey # 10秒之后
(nil)

GET
获取key对应的value。如果key不存在,返回nilo如果value的数据类型不是string,会报错。
语法:

GET KEY

命令有效版本: 1.0.0之后
时间复杂度: O(1)
返回值: key 对应的value,或者nil当key不存在。
示例:

redis> GET nonexisting
(nil)
redis> SET mykey "Hello"
"OK"
redis> GET mykey
"Hello"
redis> DEL mykey
(integer) 1
redis> EXISTS mykey
(integer) 0
redis> HSET mykey name Bob
(integer) 1
redis> GET mykey
(error) WRONGTYPE Operation against a key holding the wrong kind of value

MGET
一次性获取多个 key的值。如果对应的key不存在或者对应的数据类型不是string,返回nilo
语法:

MGET key [key ...] 

命令有效版本: 1.0.0之后
时间复杂度: O(N) N是key数量
返回值:对应value的列表
示例:

redis> SET key1 "Hello"
"OK"
redis> SET key2 "World"
"OK"
redis> MGET key1 key2 nonexisting
1) "Hello"
2) "World"
3) (nil)

MSET
一次性设置多个key的值。
语法:

MSET key value [key value ...] 

命令有效版本: 1.0.1 之后
时间复杂度: O(N) N是key数量
返回值:永远是OK
示例:

redis> MSET key1 "Hello" key2 "World"
"OK"
redis> GET key1
"Hello"
redis> GET key2
"World"

图2-8多次get vs单次mget:

redis—String字符串,开发语言,redis

如图2-8所示,使用mget / mset由于可以有效地减少了网络时间,所以性能相较更高。假设网络耗
时1毫秒,命令执行时间耗时0.1毫秒,则执行时间如表2-2所示。

表2-21000次get和1次mget对比:

redis—String字符串,开发语言,redis

学会使用批量操作,可以有效提高业务处理效率,但是要注意,每次批量操作所发送的键的数量也不是无节制的,否则可能造成单一命令执行时间过长,导致Redis阻塞。

SETNX
设置key-value但只允许在key之前不存在的情况下。
语法:

SETNX key value 

命令有效版本: 1.0.0之后
时间复杂度: 0(1)
返回值: 1表示设置成功。0表示没有设置。
示例:

redis> SETNX mykey "Hello"
(integer) 1
redis> SETNX mykey "World"
(integer) 0
redis> GET mykey
"Hello"

SET、SET NX和SET XX的执行流程如图2-9所示。
图2-9SET、SET NX、SET XX执行流程

redis—String字符串,开发语言,redis

INCR
将key对应的string表示的数字加- -。如果key不存在,则视为key对应的value是0。如果key对
应的string不是一个整型或者范围超过了64位有符号整型,则报错。
语法:

INCR key

命令有效版本: 1.0.0之后
时间复杂度: O(1)
返回值: integer 类型的加完后的数值。.
示例:

redis> EXISTS mykey
(integer) 0
redis> INCR mykey
(integer) 1
redis> SET mykey "10"
"OK"
redis> INCR mykey
(integer) 11
redis> SET mykey "234293482390480948029348230948"
"OK"
redis> INCR mykey
(error) value is not an integer or out of range
redis> SET mykey 'not a number'
"OK"
redis> INCR mykey
(error) value is not an integer or out of range

INCRBY
将key对应的string表示的数字加上对应的值。如果key不存在,则视为key对应的value是0。如
果key对应的string不是一个整型或者范围超过了64 位有符号整型,则报错。
语法:

INCRBY key decrement 

命令有效版本: 1.0.0 之后
时间复杂度: O(1)
返回值: integer 类型的加完后的数值。
示例:

redis> EXISTS mykey
(integer) 0
redis> INCRBY mykey 3
(integer) 3
redis> SET mykey "10"
"OK"
redis> INCRBY mykey 3
(integer) 13
redis> INCRBY mykey "not a number"
(error) ERR value is not an integer or out of range
redis> SET mykey "234293482390480948029348230948"
"OK"
redis> INCRBY mykey 3
(error) value is not an integer or out of range
redis> SET mykey 'not a number'
"OK"
redis> INCRBY mykey 3
(error) value is not an integer or out of range

DECR
将key对应的string表示的数字减- -。如果key不存在,则视为key对应的value是0。如果key对
应的string不是一个整型或者范围超过了64位有符号整型,则报错。
语法:

DECR key 

命令有效版本: 1.0.0之后
时间复杂度: O(1)
返回值: integer 类型的减完后的数值。
示例:

redis> EXISTS mykey
(integer) 0
redis> DECR mykey
(integer) -1
redis> SET mykey "10"
"OK"
redis> DECR mykey
(integer) 9
redis> SET mykey "234293482390480948029348230948"
"OK"
redis> DECR mykey
(error) value is not an integer or out of range
redis> SET mykey 'not a number'
"OK"
redis> DECR mykey
(error) value is not an integer or out of range

DECYBY
将key对应的string表示的数字减去对应的值。如果key不存在,则视为key对应的value是0。如
果key对应的string不是一个整型或者范围超过了64位有符号整型,则报错。
语法:

DECRBY key decrement

命令有效版本: 1.0.0之后
时间复杂度: O(1)
返回值: integer 类型的减完后的数值。
示例:

redis> EXISTS mykey
(integer) 0
redis> DECRBY mykey 3
(integer) -3
redis> SET mykey "10"
"OK"
redis> DECRBY mykey 3
(integer) 7
redis> DECRBY mykey "not a number"
(error) ERR value is not an integer or out of range
redis> SET mykey "234293482390480948029348230948"
"OK"
redis> DECRBY mykey 3
(error) value is not an integer or out of range
redis> SET mykey 'not a number'
"OK"
redis> DECRBY mykey 3
(error) value is not an integer or out of range

INCRBYFLOAT
将key对应的string表示的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。如果
key不存在,则视为key对应的value是0。如果key对应的不是string,或者不是一个浮点数,则报
错。允许采用科学计数法表示浮点数。
语法:

INCRBYFLOAT key increment 

命令有效版本: 2.6.0之后
时间复杂度: O(1)
返回值:加/减完后的数值。
示例:

redis> SET mykey 10.50
"OK"
redis> INCRBYFLOAT mykey 0.1
"10.6"
redis> INCRBYFLOAT mykey -5
"5.6"
redis> SET mykey 5.0e3
"OK"
redis> INCRBYFLOAT mykey 2.0e2
"5200"

很多存储系统和编程语言内部使用CAS机制实现计数功能,会有一定的CPU开销,但在Redis中完全不存在这个问题,因为Redis是单线程架构,任何命令到了Redis服务端都要顺序执行。

APPEND
如果key已经存在并且是一个string,命令会将value追加到原有string的后边。如果key不存在,
则效果等同于SET命令。
语法:

APPEND KEY VALUE 

命令有效版本: 2.0.0 之后
时间复杂度: O(1).追加的字符串-般长度较短, 可以视为O(1). 
返回值:追加完成之后string的长度。
示例:

redis> EXISTS mykey
(integer) 0
redis> APPEND mykey "Hello"
(integer) 5
redis> GET mykey
"Hello"
redis> APPEND mykey " World"
(integer) 11
redis> GET mykey
"Hello World"

GETRANGE
返回key对应的string的子串,由start和end确定(左闭右闭)。可以使用负数表示倒数。-1 代表倒数第一个字符, -2代表倒数第二个,其他的与此类似。超过范围的偏移量会根据string的长度调整成正确的值。
语法:

GETRANGE key start end 

命令有效版本: 2.4.0之后
时间复杂度: O(N). N为[start, end]区间的长度.由于string通常比较短,可以视为是O(1)
返回值: string 类型的子串
示例:

redis> SET mykey "This is a string"
"OK"
redis> GETRANGE mykey 0 3
"This"
redis> GETRANGE mykey -3 -1
"ing"
redis> GETRANGE mykey 0 -1
"This is a string"
redis> GETRANGE mykey 10 100
"string"

SETRANGE
覆盖字符串的一部分,从指定的偏移开始。
语法:

SETRANGE key offset value

命令有效版本: 2.2.0之后
时间复杂度: O(N), N为value的长度.由于一般给的value比较短,通常视为0(1).
返回值:替换后的string的长度。
示例: 

redis> SET key1 "Hello World"
"OK"
redis> SETRANGE key1 6 "Redis"
(integer) 11
redis> GET key1
"Hello Redis"

STRLEN 
获取key对应的string的长度。当key存放的类似不是string时,报错。
语法:

STRLEN key 

命令有效版本: 2.2.0之后
时间复杂度: O(1)
返回值: string 的长度。或者当key不存在时,返回0。
示例:

redis> SET mykey "Hello world" 1
"OK"
redis> STRLEN mykey
(integer) 11
redis> STRLEN nonexisting
(integer) 0

命令小结
表2-3是字符串类型命令的效果、时间复杂度,开发人员可以参考此表,结合自身业务需求和数
据大小选择合适的命令。

字符串类型命令小结:

redis—String字符串,开发语言,redis

内部编码
字符串类型的内部编码有3种:
●int: 8个字节的长整型。
●embstr:小于等于39个字节的字符串。
●raw:大于39个字节的字符串。
Redis会根据当前值的类型和长度动态决定使用哪种内部编码实现。
整型类型示例如下:

127.0.0.1:6379> set key 6379
OK
127.0.0.1:6379> object encoding key
"int"

短字符串示例如下:

# ⼩于等于 39 个字节的字符串
127.0.0.1:6379> set key "hello"
OK
127.0.0.1:6379> object encoding key
"embstr"

长字符串示例如下:

# ⼤于 39 个字节的字符串
127.0.0.1:6379> set key "one string greater than 39 bytes ........"
OK
127.0.0.1:6379> object encoding key
"raw"

3.典型应用场景

缓存功能:

redis作为缓冲层,MySQL作为存储层,绝大部分的请求数据都是从redis中获取,由于redis支持高并发的特性,所以缓存能够起到加速读写降低后端压力的作用。

redis和MySQL组成的缓存存储结构

redis—String字符串,开发语言,redis

计数(Counter) 功能
许多应用都会使用Redis作为计数的基础工具,它可以实现快速计数、查询缓存的功能,同时数
据可以异步处理或者落地到其他数据源。如图2-11所示,例如视频网站的视频播放次数可以使用
Redis来完成:用户每播放- -次视频,相应的视频播放数就会自增1。
图2-11记录视频播放次数

redis—String字符串,开发语言,redis

共享会话(Session)
如图2-12所示,一个分布式Web服务将用户的Session信息(例如用户登录信息)保存在各自的服务器中,但这样会造成一个问题:出于负载均衡的考虑,分布式服务会将用户的访问请求均衡到不同的服务器上,并且通常无法保证用户每次请求都会被均衡到同一台服务器上,这样当用户刷新一
次访问是可能会发现需要重新登录,这个问题是用户无法容忍的。
图2-12 Session分散存储

redis—String字符串,开发语言,redis

为了解决这个问题,可以使用Redis将用户的Session信息进行集中管理,如图2-13所示,在这种模
式下,只要保证Redis是高可用和可扩展性的,无论用户被均衡到哪台Web服务器上,都集中Redis中查询、更新Session信息。
图2-13 Redis集中管理Session

redis—String字符串,开发语言,redis

手机验证码
很多应用出于安全考虑,会在每次进行登录时,让用户输入手机号并且配合给手机发送验证码,然后让用户再次输入收到的验证码并进行验证,从而确定是否是用户本人。为了短信接口不会频繁访
问,会限制用户每分钟获取验证码的频率,例如一分钟不能超过5次,如图2-14所示。
图2-14短信验证码

redis—String字符串,开发语言,redis

此功能可以使用以下伪代码说明基本实现思路:文章来源地址https://www.toymoban.com/news/detail-781653.html

String 发送验证码(phoneNumber) {
    key = "shortMsg:limit:" + phoneNumber;
    // 设置过期时间为 1 分钟(60 秒)
    // 使⽤ NX,只在不存在 key 时才能设置成功
    bool r = Redis 执⾏命令:set key 1 ex 60 nx
    if (r == false) {
        // 说明之前设置过该⼿机的验证码了
        long c = Redis 执⾏命令:incr key
        if (c > 5) {
            // 说明超过了⼀分钟 5 次的限制了
            // 限制发送
            return null;
        }
    }
    // 说明要么之前没有设置过⼿机的验证码;要么次数没有超过 5 次
    String validationCode = ⽣成随机的 6 位数的验证码();
    validationKey = "validation:" + phoneNumber;
    // 验证码 5 分钟(300 秒)内有效
    Redis 执⾏命令:set validationKey validationCode ex 300;
    // 返回验证码,随后通过⼿机短信发送给⽤⼾
    return validationCode ;
}
// 验证用户输⼊的验证码是否正确
bool 验证验证码(phoneNumber, validationCode) {
    validationKey = "validation:" + phoneNumber;
    String value = Redis 执⾏命令:get validationKey;
    if (value == null) {
        // 说明没有这个⼿机的验证码记录,验证失败
        return false;
    }
    if (value == validationCode) {
        return true;
    } else {
        return false;
    }
}

到了这里,关于redis—String字符串的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • String字符串

    直接创建 代码简单,节约内存 使用new创建 有new就会开辟一个新的小空间,地址值不同不会复用浪费空间 案例:用户登录 遍历字符串 统计字符个数 拼接字符串 字符串反转 金额转换 手机号屏蔽 敏感词替换 使用场景:1.字符串拼接。2、字符串反转 常用方法练习 对称字符串

    2024年02月16日
    浏览(54)
  • 【string题解 C++】字符串相乘 | 翻转字符串III:翻转单词

    目录 字符串相乘 题面 错误记录 Way1 拆分成“先乘后加” 思路 实现 时空复杂度分析 反思 Way2 用数组 思路 实现 时空复杂度分析 翻转字符串III:翻转字符串中的单词 题面 错误记录 思路1 遍历找单词 实现 思路2 暴力解法 实现 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平

    2024年02月07日
    浏览(63)
  • C# 字符串(String)

    C#基础学习入门系列- C# 字符串(String) C#字符串(String)是一种不可变的序列字符。任何对字符串的操作都会返回一个新的字符串。字符串在C#中是一个引用类型,使用System.String类表示。 字符串可以通过使用双引号或者@符号来创建。双引号用于创建普通字符串 ,例如: @符

    2024年01月21日
    浏览(56)
  • 字符串分割(split),将字符串按照指定字符进行分割。split(String regex)和split(String regex, int limit)

    一、 split(String regex) 字符串分割,将字符串按照指定字符进行分割,返回的是一个字符串数组。 原理:参数名称是 regex 表示的是以某个字符串进行字符分割。 实例1:根据空格切割 输出结果: 实例2:根据特殊字符进行“.”分割 输出结果: 二、 split(String regex, int limit) 字符

    2024年02月11日
    浏览(52)
  • Java Base64字符串与String字符串互转方法

    在使用String转Base64和Base64转String上有点小问题,特此记录。 结果: 也是跟上面差不多的思路,将Base64转为byte数组,再转为String

    2024年02月15日
    浏览(60)
  • 6.string字符串的比较

    比较结果是真或假, 比较:字符串是1和1比较 然后9和2 比较 大后面就不用比了 对应字符比他大就行了。 结果:如果这个是符合比较运算符的就返回真。反之假 跟具不同的目的选择不同的运算符, 结果只有真和假,运算符不是最后的结果。 总结:如果这个是符合比较运算符

    2024年02月15日
    浏览(42)
  • rust 字符串(String)详解

    rust中的 String ,是一个非常常用的 crate ,它的底层涉及到了rust中的所有权概念,不过这不是本章的内容,如果对rust所有权概念感兴趣的,可以查看另一篇文章:rust所有权 本文的目的还是介绍 String 的基本用法,以及有哪些常用的函数可以使用 字符串,也就是由一系列字符

    2024年02月03日
    浏览(47)
  • 【学到一个新名词】String interning(字符串驻留/字符串内部化)

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 在阅读 VictoriaMetrics v1.95.1 的命令行手册的时候,发现这样一段: 什么是 String interning 呢?我通过了 wiki 链接学习了一下。 并且,我还找到了一个使用 String interning 技术

    2024年02月05日
    浏览(64)
  • Java中的字符串String

    目录 一、常用方法 1、字符串构造 2、String对象的比较 (1)、equals方法 (2)、compareTo方法 (3)、compareToIgnoreCase方法(忽略大小写进行比较) 3、字符串查找 4、转化 (1)数值和字符串转化 ​编辑 (2)大小写转换 (3)字符串转数组 (4)格式化 5、字符串替换 6、字符串

    2024年02月05日
    浏览(63)
  • Java中的String字符串练习

    目录 Java中的String字符串练习 01-用户登录 02-遍历字符串并统计字符个数 03-字符串拼接 04-字符串反转 注意点 05-金额转化(简单) 代码解释: 06-手机号屏蔽 07-身份证号码查看 易错点: 08-敏感词替换 注意点 toCharArray() 是Java中的一个方法,它用于将字符串转换为字符数组。 方法签

    2024年03月28日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包