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

本文涉及的产品
云数据库 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
相关文章
|
3天前
|
存储 缓存 NoSQL
【Go语言专栏】Go语言中的Redis操作与缓存应用
【4月更文挑战第30天】本文探讨了在Go语言中使用Redis进行操作和缓存应用的方法。文章介绍了Redis作为高性能键值存储系统,用于提升应用性能。推荐使用`go-redis/redis`库,示例代码展示了连接、设置、获取和删除键值对的基本操作。文章还详细阐述了缓存应用的步骤及常见缓存策略,包括缓存穿透、缓存击穿和缓存雪崩的解决方案。利用Redis和合适策略可有效优化应用性能。
|
2天前
|
NoSQL 算法 Java
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
|
3天前
|
NoSQL Java Redis
在Java中操作Redis
在Java中操作Redis
12 0
|
3天前
|
NoSQL Java Unix
Redis基础操作 String List
Redis基础操作 String List
10 0
|
3天前
|
存储 NoSQL 安全
java 中通过 Lettuce 来操作 Redis
java 中通过 Lettuce 来操作 Redis
java 中通过 Lettuce 来操作 Redis
|
3天前
|
消息中间件 数据采集 SQL
DataWorks操作报错合集之通过dataworks把表数据发送到kafka,表字段全是string类型如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
23 2
|
3天前
|
NoSQL 关系型数据库 Redis
数据管理DMS产品使用合集之要通过 DMS 登录到 RDS、DRDS 或 Redis,我该怎么操作
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
3天前
|
存储 NoSQL 安全
Redis入门到通关之Redis数据结构-String篇
Redis入门到通关之Redis数据结构-String篇
35 1
|
3天前
|
存储 缓存 NoSQL
Redis入门到通关之String命令
Redis入门到通关之String命令
19 0
|
3天前
|
存储 消息中间件 缓存
Redis 命令全解析之 String类型
Redis 命令全解析之 String类型
15 1