Redis 中对 string 的操作 | 学习笔记

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 快速学习 Redis 中对 string 的操作

开发者学堂课程【Go语言核心编程 - 面向对象、文件、单元测试、反射、TCP编程Redis 中对 string 的操作】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/626/detail/9785


Redis 中对 string 的操作

 

一、Redis 数据类型和 CRUD

1、总括

Redis 的五大数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)和 zset (sorted set:有序集合)。要知道它支持字符串,支持哈希,支持 List,支持集合和有序集合。字符串都很清楚,但是对哈希、List(列表)和集合很陌生,因为此前没有学过数据结构。

2、哈希

字符串肯定知道是什么,但是哈希如果不知道怎样理解的话则一定知道 map。其实 map 是多对 key value。假设存入了一个用户信息,例如这样的 map,然后在里面有一个名字叫 user1 的一个 map。这个 user1里面有很多内容,例如其中可以放名字,假设叫张三;还可以放它的性别,假设为男并以此类推。哈希就有点像这个 map。一个哈希对应的名字里面可以有多对 key value。和 map 一样,一个 map 可以有多对 key value。所以从这里可以看出它只是数据的一种组织形式。没有一种真正的数据叫哈希,它只是把数据以哈希的这种方式来管理。

3、List

List 也很好理解。List 虽然没有学过,但学过管道。在前面学过 channel,另外学过一个“站”。这个 List 有点像“站”加“管道”的一种结合。它既可以往末尾后面追,也可以从头前面加。这个 List 非常的灵活,对其可以总结出“站”加一个“队列”的一种结构。

4、Set(集合)

Set(集合)就很容易理解,这是一些数据堆聚在一起。以前学过一种数据就是一个可以放很多东西进去。它这种就是类似的可以放很多数据进去的。比如要放这个人名 names。如果有一个集合 names,就可以在里面放很多人名,但是它是无序的。还有一个就是在 names 这个集合里面放很多人名,它是有序的。大体就是这样一个说明。

5、字符串

(1)字符串的操作

string 是 redis 的最基本的数据类型,它是一个 key 对应一个 value。比如在学 go 的时候是这样定义一个字符串的。例如 str1:=“hello”,这个就是一个字符串;str2:=“张三”。那可以这样进行理解:这个 key 就有点类似于str1和 str2这个名字。这个 value 就类似于赋的值。这样一次就可以理解了。即用一个 key 来标识一个字符串。那在 go 里面用一个名字来标识一个字符串,这样意思一次就到位了。就这样一个简单的东西,并没有难度。String 类型是二进制安全的,它既可以存放字符串普通的文本,也可以存放图片。Redis 的字符串是可以存放图片的。比如在以前学过文件的读写,则可以用 read 的那个 bell ,它一读进来就是那个 bad 欺骗。理论上能够把这个东西整个一起装进 redis 里面。也就是说把图片保存在数据库里面了,别人是无法看到的。要读的时候把它一读出来然后再写回去,它就变成一个图片了。但是一般也不会把图片存到数据库里面。因为图片很大,把10MB 的图片存到内存里是很浪费的。因为内存本身是很珍贵的,10个 G 就存满了,因此不会把电影存到内存里面去,另外电影看起来也不方便。所以一般是不会这么做的,但理论上是可以支持的。

image.png

Redis 中字符串 value 最大是512M,它默认支持512。这是它在设计层面上就这么做的。其言外之意说别存的太大,但是指的是一个字符串只能存的这么大。那两个字符串就是二倍了。对此来演示一下存放一个地址信息:address:北京天安门。说明:key:北京天安门;value:北京天安门。

演示一下:写一个127.0.0.1:6379>set address 这里在输入中文时是不能进去的,一输中文就变成空格了。一点回车就进去了。但是我一获取就得到了。\xb1\xb1\xbe\xa9,这个就是北京天安门。但有时侯变成这样是因为它在存放的时候是转变了码的。对此也不用担心,在程序面度出来的时候不会是这样的。如果当你读出来时是以字符串的形式打出来,它就变成正确的代码了。\xb1\xb1\xbe\xa9,这个地方只是在这里的控制台是这样的,因为这里的控制台编码是 GBK。它有可能显示不正确。但使用程序读出来它会正确显示。所以不用特别担心这件事。这是北京天安门,很简单,在此把它列到这里。举例,存放一个地址信息: address:北京天安门。说明:key:北京天安门;value:北京天安门。对其是这样存放的:127.0.0.1:6379>set address beijing

127.0.0.1:6379>get address“beijing”

把它添加到笔记中。这是操作指令的一个方式。这是字符串的操作,非常简单。

(2)字符串操作的注意事项

举例说明 redis 的 string 字符串的CRUD 操作。

set 指令【如果存在就相当于修改,不存在就是相当于添加】。刚才就是这样操作的。还有就是 get 和 delete。get 就是把键的名字写进去就可以了,那么 delete 就代表删除。比如因为某种情况不想要这个字符串了,可以把它 delete 掉。这些指令在 golang 里面也是一样的。这些指令在学完逻辑指令后仍然用得上,因为在 golang 里面它也是这样写的。Address 回车。

127.0.0.1:6379>del address<integer>1。这里是已经删掉了。我在获取 address,一回车就空了,这个就是删除之用。

127.0.0.1:6379>del address<integer>1  

127.0.0.1:6379>get address<nil>

这里先把它删掉了,然后在获取的时候就变成了一个 nil。到此 set 和 get 就讲解完了。举例说明 redis 的 string 字符串的 CRUD 操作。set 指令【如果存在就相当于修改,不存在就是相当于添加】。这个就是对它的一个说明。

(3) 字符串操作的细节

有一个地方需要注意。假设有这样一个功能能否实现,需要这个人在线最多登录上去过后30秒就让他消失,这是可以的。比如说有时候放一个留言是保留30秒,如果30秒之内去取就有,30秒之后就没有了。比如有些代码里有这个需求,发一个消息如果在30秒之内不取就把它删掉,这也是可以的。还有这样一个功能是一个用户在线时间最多在操作的时候为一分钟,一分钟如果未操作完的话直接退出,这也是可以的。那这个时候它有一个指令是 setex。这个 ex 翻译成英文就是 expire,就是超时、废除的意思。现在来演示一下。这个指令可以来设置有效时间。这个指令非常简单,set 把这个 key、second 和 value 写进去就行了。现在来这样演示一下。

127.0.0.1:6379>setex mess01 10 hello you。

比如有一个消息键message01,并给它设置10秒钟,这个值比如叫 hello you。现在是已经进去了。几次回车等到10秒过后就没有了。它自动在内存里面有一个机制,在设置了这个超时以后,发现10秒钟之后数据就自动给销毁了,这肯定是核心组件在不断扫描,等10秒之后再去取就没有了,就已经自动给销毁了。这个可以帮助满足一些比较特殊的需求,需要定时器的定时任务可以这样去做。这个就是字符串的使用细节。

setex(set with expire)键秒值

SETEX key seconds value

将值 value 关联到 key,并将 key 的生存时间设定为 seconds(以秒为单位)。如果 key 已经存在,SETEX 将覆写旧值。

这个命令类似于以下两个命令:

SET key value

EXPISE key seconds=设置生存时间

127.0.0.1:6379>setex mess01 10 hello you

//这里给它设置了一个 key,有效期为10秒,内容为 hello you。

127.0.0.1:6379>get mess01“hello you”

127.0.0.1:6379>get mess01“hello you”

127.0.0.1:6379>get mess01<nil>

(4)mset 和 mget

关于字符串的知识还有两个比较有用。一个是 mset,一个是 mget。mset 是指一次性可以设置多个 key value。一次性设置多个 key value 就有点类似于 golang 里面一次性定义多个字符串。在go 里面有这种语法。

var(name1=“tom”name2=“jack”)在 redis 里面也可以这么做,mset key value[key value…]。来演示一下 :

127.0.0.1:6379>mset worker01 tom worker02 scott

比如第一个人的名字是 worker01,他的名字是 Tom;再来一个 worker02,第二个功能的名字是 scott。这个时候就相当于定义了两个字符串。一个字符串为 worker01,一个字符串为 worker02。它这个关系是匹配的。在获取的时候完全可以一个一个获取,比如直接获取到 worker02,那它就是 scott。那一次性都获取过来这也是可以的,那就是 mget。要获取 worker01,还要获取 worker02,一回车,两个就都出来了。

翻译到 golang 语言中它会给返回一个切片,但也有可能是一个数图,所以它还是挺灵活的,对此完全可以类比来学习。

Mset key value[key value…]

同时设置一个或多个 key value 对,如果某个给定 key 已经存在,那么Mset会用新值覆盖原来的旧值。

Mget key[key…]

返回所有一个或多个给定 key 的值,如果给定的 key 里面有某个 key 不存在,那么这个 key 返回特殊值 ml。

学这个技术只要思路清晰了,还是很容易学好的,包括做项目时只要思路清晰,没有什么特别难的。在开发过程中会遇到一些难的问题,但是这些问题还不足以说完全不能解决。

mset[同时设置一个或多对 key-value]

mget[同时获取多个 key-value]

具体的案例在这里演示一份:

127.0.0.1:6379>mset worker01 tom worker02 scott

127.0.0.1:6379>get worker02127.0.0.1:6379>mget worker01 worker02 <1>“tom”<2>“scott”

在这里设置了两对:一对是 worker01 tom;另一对是 worker02 scott

获取的时候有两种方式:第一种方式是用传统的方法一个一个获取,当然也可以用这种 mget 的方式两个一起获取,只是用这种方式来获取的话在 golang 里面它会直接给你返回一个切片或者是数图,这样也可以获取到。至此关于字符串这一模块就讲解完毕。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
4月前
|
NoSQL 数据可视化 Linux
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
本文介绍了Redis的两个可视化管理工具:付费的Redis Desktop Manager和免费的Another Redis DeskTop Manager,包括它们的下载、安装和使用方法,以及在使用Another Redis DeskTop Manager连接Redis时可能遇到的问题和解决方案。
190 1
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
|
4月前
|
NoSQL Redis
Redis 字符串(String)
10月更文挑战第16天
63 4
|
4月前
|
NoSQL Linux Redis
Docker学习二(Centos):Docker安装并运行redis(成功运行)
这篇文章介绍了在CentOS系统上使用Docker安装并运行Redis数据库的详细步骤,包括拉取Redis镜像、创建挂载目录、下载配置文件、修改配置以及使用Docker命令运行Redis容器,并检查运行状态和使用Navicat连接Redis。
499 3
|
4月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
68 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
4月前
|
存储 Prometheus NoSQL
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
49 3
|
4月前
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
43 3
|
4月前
|
NoSQL 关系型数据库 MySQL
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
本文全面阐述了Redis事务的特性、原理、具体命令操作,指出Redis事务具有原子性但不保证一致性、持久性和隔离性,并解释了Redis事务的适用场景和WATCH命令的乐观锁机制。
567 0
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
|
5月前
|
存储 JSON NoSQL
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
这篇文章是关于Redis基本数据结构的学习笔记,包括了String、Hash、Set、List和SortedSet的介绍和常用命令。文章解释了每种数据结构的特点和使用场景,并通过命令示例演示了如何在Redis中操作这些数据结构。此外,还提供了一些练习示例,帮助读者更好地理解和应用这些数据结构。
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
|
4月前
|
NoSQL Redis
redis学习五、错误总结,redis正常运行时后会出现一些bug 总结。
本文介绍了Redis在正常运行时可能遇到的一个错误,即无法进行磁盘持久化的问题,并提供了通过设置`stop-writes-on-bgsave-error`为`no`来解决这一问题的方案。
181 0
|
6月前
|
C# 开发者 UED
WPF开发者必备秘籍:深度解析文件对话框使用技巧,打开与保存文件原来如此简单!
【8月更文挑战第31天】在WPF应用开发中,文件操作是常见需求。本文详细介绍了如何利用`Microsoft.Win32`命名空间下的`OpenFileDialog`和`SaveFileDialog`类来正确实现文件打开与保存功能。通过示例代码展示了如何设置文件过滤器、初始目录等属性,并使用对话框进行文件读写操作。正确使用文件对话框能显著提升用户体验,使应用更友好易用。
143 0