Redis五种数据类型剖析

Redis 五种数据类型详解

一、引言

Redis 是一款高性能的键值对存储数据库,它支持多种数据类型,这些丰富的数据类型使得 Redis 在不同的应用场景中都能发挥强大的作用。本文将详细介绍 Redis 的五种主要数据类型:字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。

二、字符串(String)

(一)概述

字符串是 Redis 中最基本的数据类型,它可以存储任何形式的字符串,包括文本、序列化后的对象、二进制数据等。一个字符串类型的键值对在 Redis 中就是一个简单的 key - value 结构,其中 value 是字符串。

(二)常用操作

  1. 设置值
    使用 SET 命令可以设置一个字符串类型的键值对。例如:SET mykey "Hello Redis",这里 mykey 是键,"Hello Redis" 是值。
  2. 获取值
    通过 GET 命令获取字符串的值,如 GET mykey 将返回 "Hello Redis"
  3. 数值操作
    如果字符串存储的是整数,可以对其进行自增(INCR)、自减(DECR)操作。例如,对于键 count,初始值为 5,执行 INCR count 后值变为 6。
命令作用示例
get 查询对应键值get mykey
set 添加键值对set mynewkey “Hello World”
append 将给定的追加到原值的末尾append mykey " Redis"(假设原mykey值为Hello)
strlen 获取值的长度strlen mykey(假设mykey值为Hello,返回5)
setnx 只有在key不存在时设置key的值(SET if Not eXists)setnx unique_key “value”
incr 将key中存储的数字值增1(只能对数字值操作,如果为空,新增值为1)incr count(若count不存在,初始化为1后加1)
decr 将key中存储的数字值减1(只能对数字值操作,如果为空,新增值为 -1)decr number(若number不存在,初始化为 -1后减1)
incrby / decrby 步长将key中存储的数字值增减,自定义步长incrby mynum 5或decrby anothernum 3
mset 同时设置一个或多个key - value对mset key1 “value1” key2 “value2”
mget 同时获取一个或多个valuemget key1 key2 key3
msetnx 同时设置一个或多个key - value对,当且仅当所有给定的key都不存在msetnx new_key1 “value1” new_key2 “value2”
getrange 起始位置 结束位置获得值的范围,类似java中的substringgetrange mystring 1 3(假设mystring值为Hello,返回ell)
setrange 起始位置 用覆盖所存储的字符串值,从<起始位置>开始setrange mystring 2 “a”(假设mystring值为Hello,变为Helao)
setex 过期时间 设置键值的同时,设置过去时间,单位秒setex temp_key 60 “temp_value”
getset 以新换旧,设置了新值的同时获取旧值getset old_key “new_value”

(三)应用场景

  1. 缓存
    可以将数据库查询结果等数据序列化为字符串后缓存到 Redis 中,下次查询时直接从 Redis 获取,减少数据库压力。
  2. 计数器
    如网站的访问量计数,利用 INCR 命令实现简单高效的计数功能。

(四)深层次点:

(一)内部结构与编码优化
字符串在 Redis 中并非简单的字符数组。当存储较短的字符串时,Redis 采用简单动态字符串(SDS)结构。SDS 在长度计算等操作上有优化,避免了 C 字符串长度计算的复杂度(O (n)),其时间复杂度为 O (1)。而且,随着数据量变化,Redis 会根据字符串长度动态选择不同的编码方式,如 int、embstr 和 raw。对于整数,使用 int 编码可直接存储,节省空间且操作高效。
(二)高级应用与分布式锁实现
除了基本的缓存和计数功能,字符串在分布式系统中有重要应用。利用 SETNX(SET if Not eXists)命令可以实现简单的分布式锁。当多个客户端竞争锁时,只有一个客户端能成功设置键值对(通过 SETNX),其他客户端则等待或重试。解锁时需要确保是加锁的客户端来删除键,常结合 Lua 脚本保证原子性。
(三)内存管理与性能考量
字符串存储的数据大小会影响 Redis 的内存使用。大字符串可能导致内存碎片,尤其是频繁修改字符串长度时。可以通过配置合适的内存分配策略和定期的内存整理操作来优化内存使用。同时,大量的小字符串也可能占用较多内存,因为每个字符串都有其元数据开销。合理设计数据结构和使用场景,如将相关小字符串合并存储,可以减少这种开销。

三、哈希(Hash)

(一)概述

哈希类型可以理解为是一个键值对的集合,不过这里的键值对是在一个 Redis 的键下。它非常适合存储对象,将对象的属性作为哈希的字段,属性值作为哈希的字段值。

(二)常用操作

  1. 设置字段值
    使用 HSET 命令。例如:HSET user:1 name "Alice" age 25,这里 user:1 是 Redis 的键,nameage 是哈希中的字段,"Alice" 和 25 是相应字段的值。
  2. 获取字段值
    HGET 命令用于获取单个字段的值,如 HGET user:1 name 返回 "Alice"HMGET 可以获取多个字段的值。
  3. 获取所有字段和值
    HGETALL 命令会返回哈希中的所有字段和值,如 HGETALL user:1 将返回 name"Alice"age、25 等。
命令作用示例
hset 给集合中的 键赋值hset myhash key1 “value1”
hget 从集合取出 valuehget myhash key1
hmset …批量设置hash的值hmset myhash field1 “value1” field2 “value2”
hexists key 查看哈希表 key中,给定域 field是否存在。hexists myhash key1
hkeys 列出该hash集合的所有fieldhkeys myhash
hvals 列出该hash集合的所有valuehvals myhash
hincrby 为哈希表 key中的域 field的值加上增量 incrementhincrby myhash key1 5
hsetnx 将哈希表 key中的域 field的值设置为 value,当且仅当域 field不存在hsetnx newhash newfield “newvalue”

(三)应用场景

  1. 存储对象
    如存储用户信息、商品信息等,方便对对象的部分属性进行修改和查询,而不需要像字符串那样整体更新。
  2. 数据结构存储
    可以将一些具有关联关系的数据存储在哈希中,提高数据的组织和访问效率。

(四)深层次点:

(一)哈希表实现与冲突解决
Redis 哈希类型底层是通过哈希表实现的。当插入新的键值对时,通过哈希函数计算索引位置。为了应对可能的哈希冲突,Redis 采用了链地址法,即将冲突的元素以链表形式存储在同一个桶中。当链表过长时,会自动转换为红黑树结构,以保证查找、插入和删除操作的时间复杂度在最坏情况下仍能维持在 O (log n)。
(二)多层嵌套与数据建模
哈希类型不仅可以存储简单的单层键值对,还可以实现多层嵌套结构。这种特性在存储复杂对象时非常有用,比如存储具有多层属性的用户配置信息。通过合理设计哈希键和字段,可以在一定程度上模拟关系数据库中的表结构,同时又能利用 Redis 的高性能存储和访问优势。
(三)更新与查询优化
在更新哈希中的部分字段时,Redis 只需要对相应字段进行修改,而不会影响其他字段,这相比存储整个对象的字符串类型在更新效率上有很大提升。在查询方面,通过合理使用 HSCAN 命令可以避免一次性获取大量数据导致的阻塞问题,尤其是在处理大型哈希数据时。HSCAN 可以分批返回哈希中的键值对,实现渐进式遍历。

四、列表(List)

(一)概述

列表是一个字符串元素的有序集合,可以在列表的头部或尾部添加或删除元素。列表中的元素可以重复。

(二)常用操作

  1. 添加元素
    在列表头部使用 LPUSH 命令,在尾部使用 RPUSH 命令。例如:LPUSH mylist "element1"RPUSH mylist "element2",这样 mylist 列表中就有了两个元素,顺序为 "element1""element2"
  2. 获取元素
    LRANGE 命令可以获取列表中的部分元素,如 LRANGE mylist 0 -1 将返回整个列表的元素。
  3. 删除元素
    LPOP 从列表头部删除元素,RPOP 从尾部删除元素。
命令作用示例
sadd …将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。sadd myset value1 value2
smembers 取出该集合的所有值。smembers myset
sismember 判断集合是否含有该值,有返回1,没有返回0。sismember myset value1
scard 返回该集合的元素个数。scard myset
srem …删除集合中的某个元素。srem myset value1
spop 随机从该集合中吐出一个值。spop myset
srandmember 随机从该集合中取出n个值,不会从集合中删除。srandmember myset 3
sinter 返回两个集合的交集元素。sinter set1 set2
union 返回两个集合的并集元素。union set1 set2
sdiff 返回两个集合的差集元素。sdiff set1 set2

(三)应用场景

  1. 消息队列
    生产者将消息使用 RPUSH 推送到列表中,消费者从列表头部(使用 LPOP)获取消息进行处理。
  2. 最新消息列表
    如社交网络中用户的最新动态列表,可以使用列表来存储和展示。

(四)深层次点:

(一)链表与压缩列表实现
列表在 Redis 中可以基于链表或压缩列表(ziplist)实现。当列表元素较少且每个元素长度较小时,使用压缩列表,它可以节省内存空间,因为它是连续内存存储,没有额外的指针开销。当列表元素增多或元素长度变大时,会自动转换为链表结构,链表的优点是插入和删除操作的复杂度不受元素数量的影响,始终为 O (1)。
(二)阻塞式操作与消息队列可靠性
在消息队列应用场景中,BLPOP 和 BRPOP 等阻塞式操作命令使消费者在列表为空时可以阻塞等待新消息到来,避免了频繁轮询带来的资源浪费。同时,结合 RPUSH 命令的原子性,可以保证消息在队列中的顺序和完整性。此外,可以通过多个消费者从同一个列表中消费消息(不同消费者使用不同的阻塞命令)来实现消息的负载均衡处理。
(三)数据持久化与内存限制
列表数据的持久化需要考虑数据的一致性和恢复问题。Redis 的持久化机制(如 RDB 和 AOF)对列表的存储有特定的处理方式。在内存使用方面,由于列表可能无限增长,需要设置合适的内存限制策略,如限制列表的最大长度或使用定期清理机制,以防止 Redis 实例因内存耗尽而出现问题。

五、集合(Set)

(一)概述

集合是一个无序的、不包含重复元素的字符串集合。

(二)常用操作

  1. 添加元素
    使用 SADD 命令,如 SADD myset "element1" "element2",将元素添加到集合 myset 中。
  2. 判断元素是否在集合中
    SISMEMBER 命令用于判断,如 SISMEMBER myset "element1" 返回 1(存在)或 0(不存在)。
  3. 集合运算
    可以进行交集(SINTER)、并集(SUNION)、差集(SDIFF)等运算。例如,有集合 set1set2SINTER set1 set2 将返回两个集合的交集元素。
命令作用示例
SADD […]向集合key中添加一个或多个成员。如果成员已存在,忽略添加。SADD myset “element1” “element2”
SMEMBERS 返回集合key中的所有成员。SMEMBERS myset
SISMEMBER 判断成员是否在集合中,是则返回1,否则返回0。SISMEMBER myset “element1”
SCARD 返回集合key的成员数量。SCARD myset
SREM […]从集合key中移除一个或多个成员。SREM myset “element1”
SPOP []随机移除并返回集合key中的一个或多个(指定count时)成员。SPOP myset或SPOP myset 2
SRANDMEMBER [ [WITHWEIGHTS]]随机返回集合key中的一个或多个(指定count时)成员,不会从集合中移除成员。若指定WITHWEIGHTS,则返回成员及其权重。SRANDMEMBER myset或SRANDMEMBER myset 3
SINTER […]返回给定集合的交集。SINTER set1 set2
SINTERSTORE […]将给定集合的交集存储到destination集合中。SINTERSTORE newset set1 set2
SUNION […]返回给定集合的并集。SUNION set1 set2
SUNIONSTORE […]将给定集合的并集存储到destination集合中。SUNIONSTORE newset set1 set2
SDIFF […]返回key1与其他集合(key2等)的差集。SDIFF set1 set2
SDIFFSTORE […]将key1与其他集合(key2等)的差集存储到destination集合中。SDIFFSTORE newset set1 set2
SMOVE 将成员从集合移动到集合。SMOVE set1 set2 “element”

(三)应用场景

  1. 标签系统
    如文章的标签,可以将每个标签存储在集合中,方便查询具有特定标签的文章。
  2. 去重功能
    对于需要保证元素唯一性的数据,可以使用集合来存储。

(四)深层次点:

(一)哈希表与整数集合实现
集合在 Redis 中有两种实现方式:当集合中的元素都是整数且元素个数较少时,使用整数集合(intset)实现,它是一个紧凑的数组结构,可以节省内存。当元素类型不限于整数或元素个数较多时,采用哈希表实现。这种根据数据特性自动选择实现方式的机制,使得集合在不同场景下都能有较好的性能表现。
(二)集合运算的底层原理与优化
集合的交集、并集和差集等运算在底层是通过对不同集合的元素遍历和比较实现的。在处理大规模集合时,为了提高运算效率,Redis 会尽量利用集合的有序性(如果有)和哈希表的快速查找特性。例如,在计算交集时,可以先对较小的集合进行遍历,然后在较大集合中查找匹配元素,减少不必要的比较次数。
(三)分布式系统中的应用与数据一致性
在分布式系统中,集合可以用于实现分布式去重功能,如在多个节点收集唯一的用户标识。在数据一致性方面,当多个节点对同一个集合进行操作时,需要考虑网络延迟和并发修改的问题。可以通过 Redis 的集群模式和数据同步机制来保证集合数据在分布式环境下的一致性。

六、有序集合(Sorted Set)

(一)概述

有序集合和集合类似,但是每个元素都关联一个分数(score),Redis 根据分数对元素进行排序。

(二)常用操作

  1. 添加元素
    使用 ZADD 命令,如 ZADD myzset 10 "element1" 20 "element2",这里 10 和 20 是分数。
  2. 获取元素排名
    ZRANK 命令可以获取元素在有序集合中的排名,如 ZRANK myzset "element1" 返回其排名。
  3. 获取指定分数范围的元素
    ZRANGEBYSCORE 命令可用于获取,如 ZRANGEBYSCORE myzset 10 20 将返回分数在 10 到 20 之间的元素。
命令作用示例
sadd …将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。sadd myset value1 value2
smembers 取出该集合的所有值。smembers myset
sismember 判断集合是否含有该值,有返回1,没有返回0。sismember myset value1
scard 返回该集合的元素个数。scard myset
srem …删除集合中的某个元素。srem myset value1
spop 随机从该集合中吐出一个值。spop myset
srandmember 随机从该集合中取出n个值,不会从集合中删除。srandmember myset 3
sinter 返回两个集合的交集元素。sinter set1 set2
union 返回两个集合的并集元素。union set1 set2
sdiff 返回两个集合的差集元素。sdiff set1 set2

(三)应用场景

  1. 排行榜系统
    如游戏排行榜、网站热门文章排行榜等,根据相应的指标(如分数、热度)对元素进行排序。
  2. 优先级队列
    可以根据任务的优先级(分数)来处理任务。

深层次点:

(一)跳跃表与哈希表结合的实现
有序集合是 Redis 中较为复杂的数据类型,它是通过跳跃表(skiplist)和哈希表结合实现的。哈希表用于快速查找元素是否存在以及获取元素对应的分数,而跳跃表用于实现元素的有序排列和快速的范围查询。跳跃表通过多层索引结构,在保证有序性的同时,能够以较低的时间复杂度(平均 O (log n))进行查找、插入和删除操作。
(二)分数更新与排名变化机制
当更新有序集合中元素的分数时,Redis 需要重新调整元素在跳跃表中的位置,这涉及到复杂的指针操作和排名更新。为了保证效率,Redis 在设计上尽量减少不必要的节点调整,只对受分数变化影响的局部节点进行操作。同时,在获取元素排名时,通过高效的索引遍历算法,可以快速确定元素在有序集合中的位置。
(三)排行榜应用中的性能优化与数据过期
在排行榜应用场景中,有序集合经常面临高并发的更新和查询操作。可以通过对排行榜数据进行分层存储、缓存热门排名数据等方式来提高性能。另外,随着时间推移,排行榜中的数据可能需要过期处理,比如只保留最近一段时间内的排名数据。可以结合 Redis 的过期机制或在应用层实现定时清理策略来实现数据的有效管理。

七、总结

Redis 的五种数据类型在不同的场景中各有优势。字符串适合简单的值存储和计数;哈希用于存储对象;列表可用于消息队列和有序数据存储;集合用于去重和集合运算相关场景;有序集合则在需要排序功能的排行榜等场景中表现出色。合理运用这些数据类型能够充分发挥 Redis 的高性能和灵活性,提升应用系统的性能和功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/469632.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习方法——看差的书籍

CSAPP证明从1中午2点到下午3&#xff1a;40&#xff0c;但是还是只是推理证明而已&#xff0c;但是想起来了课上老师讲的东西了 还可以知道补码运算的大前提知识&#xff01;&#xff01;&#xff01; 但是最好不要一下学这个一下子学哪个&#xff0c;学哪一个都不能尽情投入。…

【人工智能】Transformers之Pipeline(二十三):文档视觉问答(document-question-answering)

​​​​​​​ 目录 一、引言 二、文档问答&#xff08;document-question-answering&#xff09; 2.1 概述 2.2 impira/layoutlm-document-qa 2.2.1 LayoutLM v1 2.2.2 LayoutLM v2 2.2.3 LayoutXLM 2.2.4 LayoutLM v3 2.3 pipeline参数 2.3.1 pipeline对象实例化…

Python酷库之旅-第三方库Pandas(206)

目录 一、用法精讲 961、pandas.IntervalIndex.mid属性 961-1、语法 961-2、参数 961-3、功能 961-4、返回值 961-5、说明 961-6、用法 961-6-1、数据准备 961-6-2、代码示例 961-6-3、结果输出 962、pandas.IntervalIndex.length属性 962-1、语法 962-2、参数 …

【论文阅读】利用SEM二维图像表征黏土矿物三维结构

导言 在油气储层研究中&#xff0c;黏土矿物对流体流动的影响需要在微观尺度上理解&#xff0c;但传统的二维SEM图像难以完整地表征三维孔隙结构。常规的三维成像技术如FIB-SEM&#xff08;聚焦离子束扫描电子显微镜&#xff09;虽然可以获取高精度的3D图像&#xff0c;但成本…

前端入门一之ES6--面向对象、够着函数和原型、继承、ES5新增方法、函数进阶、严格模式、高阶函数、闭包

前言 JS是前端三件套之一&#xff0c;也是核心&#xff0c;本人将会更新JS基础、JS对象、DOM、BOM、ES6等知识点&#xff0c;这篇是ES6;这篇文章是本人大一学习前端的笔记&#xff1b;欢迎点赞 收藏 关注&#xff0c;本人将会持续更新。 文章目录 JS高级 ES61、面向对象1.1…

数据安全、信息安全、网络安全区别与联系

关键字&#xff1a; 信息安全 数据安全 网络安全 [导读] 在 “互联网 ” 被广泛提及的今天&#xff0c;安全问题也越来越多的受到人们关注&#xff0c;然而很多人对于 “信息安全”、“数据安全”、“网络安全” 的概念并不是很清楚。我们汇总了官方机构给这三者的定义&#…

Linux——简单认识vim、gcc以及make/Makefile

前言&#xff1a;大佬写博客给别人看&#xff0c;菜鸟写博客给自己看&#xff0c;我是菜鸟。 1、vim操作&#xff1a; 默认打开vim时&#xff0c;vim处于命令模式。(在其他模式中&#xff0c;Esc就能够返回命令模式) 常用的命令有&#xff1a; n gg&#xff1a;跳转到n行&…

Java反序列化之CommonsCollections2链的学习

一、前言 Apache Commons Collections 是一个著名的辅助开发库&#xff0c;包含了一些Java中没有的数据结构和辅助方法&#xff0c;不过随着Java 9 以后的版本中原生库功能的丰富&#xff0c;以及反序列化漏洞的影响&#xff0c;它也在逐渐被升级或替代。 在2015年底的common…

前端web

题目&#xff1a;制作带有下拉悬停菜单的导航栏 效果图 一、先制作标签 <body> <div id"menu"> <div id"container"> <div class"item">游戏1 <div class…

【大数据学习 | kafka高级部分】kafka中的选举机制

controller的选举 首先第一个选举就是借助于zookeeper的controller的选举 第一个就是controller的选举&#xff0c;这个选举是借助于zookeeper的独享锁实现的&#xff0c;先启动的broker会在zookeeper的/contoller节点上面增加一个broker信息&#xff0c;谁创建成功了谁就是主…

Android 开发指南:初学者入门

Android 是全球最受欢迎的移动操作系统之一&#xff0c;为开发者提供了丰富的工具和资源来创建各种类型的应用程序。本文将为你提供一个全面的入门指南&#xff0c;帮助你从零开始学习 Android 开发。 目录 1. 了解 Android 平台[1]2. 设置开发环境[2]3. 学习基础知识[3]4. 创…

漏洞挖掘 | 某医院小程序支付漏洞+越权

漏洞挖掘 | 某医院小程序支付漏洞越权 登陆后点击个人信息&#xff0c;抓包&#xff0c;放到repeter模块 修改strUserID参数可以越权查看别人信息 放intruder模块可以跑数据&#xff0c;这里有几万信息泄露 回到首页&#xff0c;点击医生咨询功能点 随便选一个需要付费的医…

MFC图形函数学习07——画扇形函数

绘制扇形函数是MFC中绘图的基本函数&#xff0c;它绘制的仍是由椭圆弧与椭圆中心连线构成的椭圆扇形&#xff0c;特例是由圆弧与圆心连线构成的圆扇形。 一、绘制扇形函数 原型&#xff1a;BOOL Pie(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4); …

基于Python的膳食健康系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

头歌网络安全(11.12)

头歌禁止复制解决 必须先下篡改猴&#xff01;&#xff01;&#xff01;&#xff01; 头歌复制助手 Educoder Copy Helperhttps://scriptcat.org/zh-CN/script-show-page/1860 Java生成验证码 第1关&#xff1a;使用Servlet生成验证码 任务描述 本关任务&#xff1a;使用se…

ROM修改进阶教程------安卓14 安卓15去除app签名验证的几种操作步骤 详细图文解析

在安卓14 安卓15的固件中。如果修改了系统级别的app。那么就会触发安卓14 15的应用签名验证。要么会导致修改的固件会进不去系统,或者进入系统有bug。博文将从几方面来解析去除安卓14 15应用签名验证的几种方法。 💝💝💝通过博文了解: 1💝💝💝-----安卓14去除…

第七部分:2. STM32之ADC实验--AD多通道(AD采集三路传感器模块实验:光敏传感器、热敏传感器、反射式传感器附赠温湿度传感器教程)

这个多通道采用非扫描模式--单次转换模式 1.代码配置链路图 2. ADC的输入通道 3.ADC的非扫描模式的转换模式&#xff08;单次和连续&#xff09; 4.ADC的扫描模式的转换模式&#xff08;单次和连续&#xff09; 5.采集校准 代码实验&#xff1a; 代码部分&#xff1a; #inclu…

crond 任务调度 (Linux相关指令:crontab)

相关视频链接 crontab 进行 定时任务 的设置 概述 任务调度&#xff1a;是指系统在某个时间执行的特定的命令或程序 任务调度的分类&#xff1a; 1.系统工作&#xff1a;有些重要的工作必须周而复始地执行。如病毒扫描等。 2.个别用户可能希望执行某些程序&#xff0c;比如…

基于python 的opencv 使用GrabCut算法分割图像代码

#利用grabcut算法分割图像import numpy as np import cv2 from matplotlib import pyplot as plt import warningswarnings.filterwarnings("ignore", module "matplotlib")imgpath E:/code/image_opencv_test/lena.jpg img cv2.imread(imgpath)Coords1x…

AndroidStudio-文本显示

一、设置文本的内容 1.方式&#xff1a; &#xff08;1&#xff09;在XML文件中通过属性&#xff1a;android:text设置文本 例如&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.andr…