Redis-字符串的相关操作

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 字符串值的正数索引以0为开始,从字符串的开头向结尾不断递增。字符串值的负数索引以-1为开始,从字符串的结尾向开头不断递减。

上篇文章中,已经介绍了Redis是什么,以及如何使用docker在服务器上安装redis,接下来看一下字符串在redis中是如何进行相关操作的。

先在服务器上用命令行连接上redis服务:

docker exec -it redis bash
redis-cli -h 127.0.0.1 -p 6379

说明:一般redis默认的端口都是6379,-h可以理解为host的缩写,-p可以理解为端口port的缩写,这样比较容易记住命令,也可以输入redis-cli --help去查看命令的可选参数的含义。



Redis中针对字符串的基本操作



  • SET    为字符串键设置值

语法:set key value

可选参数 NX | XX

NX:只有在指定的键没有值的时候才会去设置

XX:对已有的值进行覆盖更新的时候用XX,如果key不存在,用这个会返回nil,gui工具上的命令行操作可能返回null。目前的版本不加参数默认是会覆盖更新,不确定以后是否会更改。

set name libo
set wx xiaobotester
set name zhangsan NX --name已经指定值,无法更新,会返回nil
set name zhangsan XX --会将name的值更新
set a 123 XX -- 如果不存在key为a的数据,则这样使用会返回a
以上的nx和xx我在命令行试了不区分大小写
  • GET:获取字符串键的值

语法:get key

如果给定的key值在数据库中没匹配到对应的数据,就会返回空

get name
get phone
  • GETSET:获取旧值并设置新值

首先获取字符串键目前已有的值,接着为键设置新值,最后把之前获取到的旧值返回给用户。

如果key本身不存在,则会创建key,然后写入新的值。

127.0.0.1:6379> get a
"4"
127.0.0.1:6379> getset a 1
"4"
127.0.0.1:6379> get a
"1"
127.0.0.1:6379> get f
(nil)
127.0.0.1:6379> getset f 1
(nil)
127.0.0.1:6379> get f
"1"
  • MSET:一次为多个字符串键设置值

语法:mset key1 value1 key2 value2 ...  

127.0.0.1:6379> mset name libo age 29 email none@qq.com 
OK
127.0.0.1:6379> mget name age email
1) "libo"
2) "29"
3) "none@qq.com"
127.0.0.1:6379> 
  • MSETNX:只在键不存在的情况下,一次为多个字符串键设置值

语法:msetnx key1 value1 key2 value2 ...

MSETNX与MSET的主要区别在于,MSETNX只会在所有给定键都不存在的情况下对键进行设置,而不会像MSET那样直接覆盖键已有的值:如果在给定键当中,即使有一个键已经有值了,那么MSETNX命令也会放弃对所有给定键的设置操作。MSETNX命令在成功执行设置操作时返回1,在放弃执行设置操作时则返回0。


  • STRLEN:获取字符串值的字节长度  

语法:STRLEN key


  • APPEND:追加新内容到值的末尾

语法:append key value

APPEND命令在执行追加操作之后,会返回字符串值当前的长度作为命令的返回值。



 Redis中针对字符串以索引的方式进行操作


字符串值的正数索引以0为开始,从字符串的开头向结尾不断递增。

字符串值的负数索引以-1为开始,从字符串的结尾向开头不断递减。


  • GETRANGE:获取字符串值指定索引范围上的内容

getrange key start end

127.0.0.1:6379> set str abcdefghijklmnopqrstuvwxyz
OK
127.0.0.1:6379> getrange str 0 6
"abcdefg"
127.0.0.1:6379> getrange str -7 -1
"tuvwxyz"
  • SETRANGE:对字符串值的指定索引范围进行设置

语法:setrange key index string

将字符串键的值从索引index开始的部分替换为指定的新内容,被替换内容的长度取决于新内容的长度,命令执行完之后,会返回字符串值当前的长度作为结果。

127.0.0.1:6379> get str
"abcdefghijklmnopqrstuvwxyz"
127.0.0.1:6379> setrange str 7 17665367850
(integer) 26
127.0.0.1:6379> get str
"abcdefg17665367850stuvwxyz"

当输入的索引值比字符串的总长度大,或者说替换之后的新内容的长度超过原来字符串长度的时候,会自动扩展长度保证值可以写入。





 写在最后


那作为测试人员,学redis的这些基本操作到底有没有用呢?

   答案当然是有用的。有些数据可能是存在redis的,当你想快速验证某个场景,找数据比较麻烦的时候,除了用mock,就可以自己去改redis里面的数据,验证页面显示的效果是否同步发生变化。


那一般用命令行操作还是GUI工具去操作比较好呢?

   建议先熟悉一下命令行的操作,再考虑用GUI的工具,毕竟GUI工具打开占用的内存什么的要多一些,而且有的服务可能不能直连,在登录服务器后,用命令行操作会方便一点。


这么多的命令,需要一个个去记吗?

   不需要全部记住这么多命令,但是最起码要知道通过命令行可以做一些什么事情,要知道个大概,其实这些命令也比较好记,一般set和get是配套使用的,一个用来设置值,一个用来取值,前缀加m表示可批量操作,剩下的一些命令在用的时候查查资料也行,前提是要知道可以用来干什么事情,在需要的才知道


在自己购买的阿里云或者腾讯云之类的服务器上搭建redis的时候,要记得在安全组里面开启端口防火墙,而且数据库记得要设置密码,否则就会出现像下面的情况:(之前没有设置密码,也没有改默认端口,可能被人攻击了)


微信图片_20220114111728.jpg


针对这个情况,我更改了一下docker启动redis的命令:

docker run -itd --name redis -p 映射到服务器对外暴露的端口:6379   -v /root/docker_volume/redis/data:/data redis --requirepass 这里填入为数据库设置的密码 --appendonly yes 

1、加入了映射数据卷,以及数据持久化的参数,可以把数据映射到服务器的目录,至于为什么要加这些参数,有什么好处,可以自己思考/百度一下

2、设置了密码,没这么容易被破解,容器内部的话还是用6379端口去连接就行:

redis-cli -h 127.0.0.1 -p 6379 -a 密码
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
5月前
|
存储 缓存 NoSQL
redis数据结构-字符串
redis数据结构-字符串
47 1
|
7月前
|
存储 NoSQL Redis
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
91 1
|
3月前
|
NoSQL Redis
Redis 字符串(String)
10月更文挑战第16天
55 4
|
4月前
|
存储 缓存 NoSQL
3)深度解密 Redis 的字符串
3)深度解密 Redis 的字符串
49 1
|
5月前
|
NoSQL 安全 Java
Redis6入门到实战------ 三、常用五大数据类型(字符串 String)
这篇文章深入探讨了Redis中的String数据类型,包括键操作的命令、String类型的命令使用,以及String在Redis中的内部数据结构实现。
Redis6入门到实战------ 三、常用五大数据类型(字符串 String)
|
5月前
|
C# 开发者 UED
WPF开发者必备秘籍:深度解析文件对话框使用技巧,打开与保存文件原来如此简单!
【8月更文挑战第31天】在WPF应用开发中,文件操作是常见需求。本文详细介绍了如何利用`Microsoft.Win32`命名空间下的`OpenFileDialog`和`SaveFileDialog`类来正确实现文件打开与保存功能。通过示例代码展示了如何设置文件过滤器、初始目录等属性,并使用对话框进行文件读写操作。正确使用文件对话框能显著提升用户体验,使应用更友好易用。
119 0
|
6月前
|
NoSQL Linux Redis
Redis性能优化问题之想确认Redis延迟变大是否因为fork耗时导致的,如何解决
Redis性能优化问题之想确认Redis延迟变大是否因为fork耗时导致的,如何解决
|
5月前
|
存储 NoSQL Redis
【Redis 探秘】SDS 简单动态字符串:揭秘 Redis 高效字符串处理的秘密武器!
【8月更文挑战第24天】Redis采用的简单动态字符串(SDS)是一种专为优化内存存储和字符串操作而设计的数据结构。相较于C语言的标准字符串,SDS改进了字符串长度计算、内存重分配及字符串比较等问题。其特性包括预分配冗余空间减少未来的内存重分配、显式存储长度以加快获取速度等。这些改进使Redis能更高效地管理字符串数据。例如,在Redis中,SDS被广泛应用于键值对的存储,显著提升了字符串操作的性能。了解SDS不仅对于深入理解Redis的工作原理至关重要,也是开发者技能树中的重要一环。
77 0
|
5月前
|
存储 JSON NoSQL
揭秘Redis字符串String的隐藏技能!从基础到进阶,让你的数据存储操作秒变高大上!
【8月更文挑战第24天】Redis中的字符串类型作为其基石,不仅能够存储从简单文本到复杂格式如JSON的各种数据,还能通过多样化的命令实现包括但不限于自增自减、设置过期时间等高级功能,极大提升了其实用性和灵活性。例如,使用`SET`命令可添加或更新键值对,`GET`获取值,`DEL`删除键;同时,`INCR`和`DECR`支持对整数值的原子性增减操作,非常适合实现计数器等功能;通过`EXPIRE`命令设置过期时间,则适用于需要限时存储的应用场景。尽管名为“字符串”,但实际上还可存储图片、音频文件的Base64编码等形式的数据,为开发者提供了强大而灵活的工具。
64 0
|
5月前
|
NoSQL Java Redis
Redis字符串数据类型之INCR命令,通常用于统计网站访问量,文章访问量,实现分布式锁
这篇文章详细解释了Redis的INCR命令,它用于将键的值增加1,通常用于统计网站访问量、文章访问量,以及实现分布式锁,同时提供了Java代码示例和分布式锁的实现思路。
170 0