十五、redis的使用

目录

  • 一、简介
    • 1.1 nosql介绍
    • 1.2 redis特性
    • 1.3 redis优势
    • 1.4 redis应用场景
  • 二、安装
    • 2.1 Macos下安装
    • 2.2 Linux下安装
    • 2.4 客户端连接
    • 2.5 切换数据库
  • 三、数据库操作
    • 3.1 string类型
    • 3.2 键的操作
    • 3.3 Hash类型
    • 3.4 list类型
    • 3.5 set类型
    • 3.6 zset类型
  • 四、和python交互
    • 4.1 安装redis包
    • 4.2 string方法操作
    • 4.3 在django使用redis

一、简介

  • Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
  • Redis是 NoSQL技术阵营中的一员,它通过多种键值数据类型来适应不同场景下的存储需求,借助一些高层级的接口使用其可以胜任,如缓存、队列系统的不同角色
  • 官网介绍

1.1 nosql介绍

一类新出现的数据库(not only sql),它的特点有:

  • 不支持SQL语法
  • 不支持事务
  • 存储结构跟传统关系型数据库中的那种关系表完全不同,nosql中存储的数据都是KV形式
  • NoSQL的世界中没有一种通用的语言,每种nosql数据库都有自己的api和语法,以及擅长的业务场景
  • NoSQL中的产品种类相当多:
    • Mongodb
    • Redis
    • Hbase hadoop
    • Cassandra hadoop

1.2 redis特性

Redis 与其他 key - value 缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

1.3 redis优势

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

1.4 redis应用场景

  • 用来做缓存(ehcache/memcached)——redis的所有数据是放在内存中的(内存数据库)
  • 可以在某些特定应用场景下替代传统数据库——比如社交类的应用
  • 在一些大型系统中,巧妙地实现一些特定的功能:session共享、购物车

二、安装

2.1 Macos下安装

(1) 通过brew去安装

brew install redis

在这里插入图片描述
安装路径位于

/opt/homebrew/opt/redis

在这里插入图片描述
(2) 在前台启动和停止 Redis
要测试 Redis 安装,可以运行下面命令:

redis-server

如果成功,您将看到 Redis 的启动日志,Redis 将在前台运行。
在这里插入图片描述
可以看到这种启动方式, 终端会一直工作, 要停止 Redis,输入 Ctrl-C 。
(3) 在后台启动和停止 Redis
通过 launchd 后台启动, 命令如下:

brew services start redis

在这里插入图片描述
这将启动 Redis 并在登录时重新启动它。您可以通过运行以下命令来检查 launchd 托管 Redis 的状态:

brew services info redis

在这里插入图片描述
要停止该服务,运行如下命令:

brew services stop redis

2.2 Linux下安装

(1) 下载源文件

wget https://download.redis.io/redis-stable.tar.gz

(2) 解压/复制

tar -zxvf redis-stable.tar.gz
sudo mv ./redis-stable /usr/local/redis/

(3) 编译安装

cd /usr/local/redis/
sudo make
sudo make test
sudo make install

(4) 查看安装文件

cd /usr/local/bin
ls -all

在这里插入图片描述

- redis-server: redis服务器
- redis-cli: redis命令行客户端
- redis-benchmark: redis性能测试工具
- redis-check-aof: AOF文件修复工具
- redis-check-rdb: RDB文件检索工具

(5) 移动配置文件

sudo cp /usr/local/redis/redis.conf /etc/redis/

2.3 个性化配置
Macos的配置文件位于:

/opt/homebrew/etc/redis.conf

Linux的配置文件位于:

/etc/redis/redis.conf

(1) 绑定ip
如果需要远程访问,可将此⾏注释,或绑定⼀个真实ip, 默认是配置了本机地址
在这里插入图片描述
(2) 端⼝,默认为6379
在这里插入图片描述
(3) 是否以守护进程运⾏

  • 如果以守护进程运⾏,则不会在命令⾏阻塞,类似于服务
  • 如果以⾮守护进程运⾏,则当前终端被阻塞
  • 设置为yes表示守护进程,设置为no表示⾮守护进程
  • 推荐设置为yes

在这里插入图片描述
(4) 数据库文件
在这里插入图片描述
(5) 数据⽂件存储路径
在这里插入图片描述
(6) 配置日志文件
需要提前创建目录和文件在这里插入图片描述
(7) 默认数据库的个数
在这里插入图片描述

2.4 客户端连接

客户端连接的命令为

redis-cli

通过–help可以查看帮助选项
在这里插入图片描述
连接本机可以不需要指定-h和-p, 连接本机成功展示如下:
在这里插入图片描述
此时输入ping会返回pong
在这里插入图片描述

2.5 切换数据库

数据库没有名称,默认有16个,通过0-15来标识,连接redis默认选择第一个数据库
通过select n可以切换数据库, 其中n为0~15, 如下所示:
在这里插入图片描述

三、数据库操作

Redis支持以下5种主要的数据类型:

  • 字符串(String):最基本的数据类型,可以存储字符串、整数或浮点数。
  • 列表(List):有序的字符串列表,可以在列表的头部或尾部进行元素的插入、删除和获取。
  • 哈希(Hash):键值对的集合,适合存储对象的属性和值。
  • 集合(Set):无序的字符串集合,不允许重复的元素。
  • 有序集合(Sorted Set):类似于集合,每个元素都关联一个分数,可以根据分数进行排序,并且每个元素的分数必须是唯一的。

3.1 string类型

字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。
(1) 保存值
如果设置的键不存在则为添加,如果设置的键已经存在则修改

set key value

例如:
在这里插入图片描述
(2) 设置键值及过期时间,以秒为单位

setex key second value

例如:
在这里插入图片描述
(3) 设置多个键值
mset key1 value1 [key2 value2 …]
在这里插入图片描述
(4) 追加值
append key value
在这里插入图片描述
(5) 获取单个值

get key

(6) 根据多个键获取多个值

mget key1 key2 ...

在这里插入图片描述

3.2 键的操作

(1) 搜索键, 支持正则表达式

keys pattern

在这里插入图片描述
通配符*表示所有.

(2) 判断键是否存在

exists key1

在这里插入图片描述
存在返回1, 不存在返回0
(3) 查看键对应的value的类型

type key

在这里插入图片描述
(4) 删除键

del key1 key2 ...

在这里插入图片描述
(5) 设置过期时间,以秒为单位

expire key seconds

在这里插入图片描述
返回结果 (integer) 1 表示命令执行成功,且设置过期时间成功。

(6) 查看有效时间,以秒为单位
ttl key
返回结果 (integer) -2 表示该键不存在或已过期。具体含义如下:

  • -1 表示键存在但没有设置过期时间。
  • -2 表示键不存在或已过期。
  • 其他正整数表示键的剩余生存时间(以秒为单位)。
    在这里插入图片描述
    过期后, 这个键值对会删除掉.

3.3 Hash类型

  • hash⽤于存储对象,对象的结构为属性、值
  • 值的类型为string
    (1) 增加、修改
    设置单个属性
hset key field value [field value...]

在这里插入图片描述
(2) 获取指定键所有的属性名

hkeys key

在这里插入图片描述
(3) 获取⼀个属性的值

hget key field

在这里插入图片描述
(4) 获取多个属性的值

hmget  key field [field...]

在这里插入图片描述
(5) 获取所有属性的值

hvals key

在这里插入图片描述
(6) 删除操作
删除整个hash键及值,使⽤del命令
删除属性,属性对应的值会被⼀起删除

hdel key field1 field2 ...

在这里插入图片描述

3.4 list类型

  • 列表的元素类型为string
  • 按照插⼊顺序排序
    (1) 添加
    在左侧插⼊数据
lpush key value1 value2 ...

在这里插入图片描述
在右侧插⼊数据

rpush key value1 value2 ...

在这里插入图片描述
(2) 在指定元素的前或后插⼊新元素
linsert key before或after 现有元素 新元素
在这里插入图片描述
(3) 获取元素
返回列表⾥指定范围内的元素
lrarge key start stop

  • start、stop为元素的下标索引
  • 索引从左侧开始,第⼀个元素为0
  • 索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素
    在这里插入图片描述
    (4) 设置指定索引位置的元素值
    lset key index value
  • 索引从左侧开始,第⼀个元素为0
  • 索引可以是负数,表示尾部开始计数,如-1表示最后⼀个元素
    在这里插入图片描述
    (5) 删除指定元素
    lrem key count value
  • 将列表中前count次出现的值为value的元素移除
  • count > 0: 从头往尾移除
  • count < 0: 从尾往头移除
  • count = 0: 移除所有

3.5 set类型

  • ⽆序集合
  • 元素为string类型
  • 元素具有唯⼀性,不重复
  • 说明:对于集合没有修改操作
    (1) 添加元素
sadd key member1 member2 ...

在这里插入图片描述
(2) 获取所有元素

smembers key

在这里插入图片描述
(3) 删除指定元素

srem key member [member...]

在这里插入图片描述
在这里插入图片描述

3.6 zset类型

  • sorted set,有序集合
  • 元素为string类型
  • 元素具有唯⼀性,不重复
  • 每个元素都会关联⼀个double类型的score,表示权重,通过权重将元素从⼩到⼤排序
  • 没有修改操作
    (1) 增加
zadd key score1 member1 score2 member2 ..

例如向键’a4’的集合中添加元素’lisi’、‘wangwu’、‘zhaoliu’、‘zhangsan’,权重(score)分别为4、5、6、3
在这里插入图片描述

(2) 获取

zrange key start stop
  • 返回指定范围内的元素
  • start、stop为元素的下标索引
  • 索引从左侧开始,第⼀个元素为0
  • 索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素
    在这里插入图片描述
    (3) 返回score值在min和max之间的成员
zrangebyscore key min max

在这里插入图片描述
(4) 返回成员member的score值
在这里插入图片描述
(5) 删除

zrem key member1 member2 ...

删除集合’a4’中元素’zhangsan’
在这里插入图片描述
删除权重在指定范围的元素

zremrangebyscore key minindex maxindex

在这里插入图片描述

四、和python交互

4.1 安装redis包

进入虚拟环境中安装

mkvirtualenv -p python3 redis_study
workon redis_study
pip install redis

使用pycharm创建项目
在这里插入图片描述
创建StrictRedis对象

from redis import *if __name__ == "__main__":try:# 创建StrictRedis对象,与redis服务器建⽴连接# 通过init创建对象,指定参数host、port与指定的服务器和端⼝连接,host默认为localhost,port默认为6379,db默认为0sr = StrictRedis(host='localhost', port=6379, db=0)# 简写# sr=StrictRedis()except Exception as e:print(e)

根据不同的类型,拥有不同的实例⽅法可以调⽤,与前⾯学的redis命令对应,⽅法需要的参数与命令的参数⼀致

4.2 string方法操作

(1) set操作
⽅法set,添加键、值,如果添加成功则返回True,如果添加失败则返回False
注意: Redis中存储的数据都是二进制的,所以存储的对象都是字节串, 字节串前是有一个b来区分的

if __name__ == "__main__":try:sr = StrictRedis()result = sr.set('name', '张三2')# 输出响应结果,如果添加成功则返回True,否则返回Falseprint(result)except Exception as e:print(e)

(2) string获取
⽅法get,添加键对应的值,如果键存在则返回对应的值,如果键不存在则返回None

if __name__ == "__main__":try:sr = StrictRedis()# 获取键name的值result = sr.get('name')# 有中文的话需要解码decoded_result = result.decode('utf-8')print(result)print(decoded_result)except Exception as e:print(e)

输出结果:

b'\xe5\xbc\xa0\xe4\xb8\x892'
张三2

(3) string修改
⽅法set,如果键已经存在则进⾏修改,如果键不存在则进⾏添加

from redis import *if __name__ == "__main__":try:sr = StrictRedis()# 获取键name的值sr.set('name', 'zhangsan')result = sr.get('name').decode('utf-8')print(f"修改前{result}")sr.set('name', 'lisi')result = sr.get('name').decode('utf-8')print(f"修改后{result}")except Exception as e:print(e)

输出结果:

修改前zhangsan
修改后lisi

(4) string删除
⽅法delete,删除键及对应的值,如果删除成功则返回受影响的键数,否则则返 回0

from redis import *if __name__ == "__main__":try:sr = StrictRedis()# 获取键name的值sr.set('name', 'zhangsan')sr.delete('name')result = sr.get('name')print(f"删除后{result}")except Exception as e:print(e)

结果:

删除后None

(5) 获取键
⽅法keys,根据正则表达式获取键

from redis import *if __name__ == "__main__":try:sr = StrictRedis()# 获取所有的键result = sr.keys()# 输出响应结果,所有的键构成⼀个列表,如果没有键则返回空列表print(result)except Exception as e:print(e)

输出结果:

[b'hobby', b'user', b'arr1']

4.3 在django使用redis

之前django的session默认是存在的数据库里面的,我们也可以把session存储在redis里面
(1) 创建django项目

 workon redis_study pip install djangopip install rediscd workspace/python/redis_studydjango-admin startproject session_test

(2) 修改settings文件,增加如下项

SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS = {'host': 'localhost','port': 6379,'db': 2, # 选择3个数据库'password': '','prefix': 'session','socket_timeout': 1
}
SESSION_COOKIE_AGE = 3600  # Session过期时间,单位为秒

其中,SESSION_ENGINE指定使用redis_sessions.session作为Session存储引擎。
SESSION_REDIS指定了Redis的连接配置,其中包括主机、端口、数据库、密码等信息。prefix参数指定了存储在Redis中的Session键的前缀,可以根据需要自行设置。
SESSION_COOKIE_AGE指定了Session的过期时间,单位为秒。具体的配置可以根据实际需求进行调整。

(3) 添加应用

cd session_test 
python manage.py startapp booktest

(4) 修改setting文件添加booktest和redis应用


INSTALLED_APPS = [...'booktest','redis'
]

(5) 配置项目的url文件
将booktest应用的url配置加到映射中

from django.contrib import admin
from django.urls import path, includeurlpatterns = [path('admin/', admin.site.urls),# 添加映射, 将booktest/路径 和 booktest.urls.py进行关联path('booktest/', include('booktest.urls')),
]

(6) 测试
打开booktest/views.py文件,创建session_set和session_get视图如下

from django.http import HttpResponse# 保存session
def session_set(request):request.session['name'] = '张三'return HttpResponse('ok')# 获取session
def session_get(request):name = request.session['name']return HttpResponse(name)

添加booktest/urls.py文件,配置url如下

from django.contrib import admin
from django.urls import path, includefrom booktest import viewsurlpatterns = [path('session_set/', views.session_set, name='session_set'),path('session_get/', views.session_get, name='session_get'),
]

(7) 启动项目

python manage.py runserver

输入地址:http://127.0.0.1:8000/booktest/session_set/ 进行session存储
输入地址http://127.0.0.1:8000/booktest/session_get/ 获取session值
然后通过redis-cli客户端查看
在这里插入图片描述
查看对应的value
在这里插入图片描述
Base64在线解码https://base64.us/
在这里插入图片描述
其中\u5f20\u4e09对应的中文就是张三
在这里插入图片描述

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

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

相关文章

【AI视野·今日Sound 声学论文速览 第三十二期】Tue, 24 Oct 2023

AI视野今日CS.Sound 声学论文速览 Tue, 24 Oct 2023 Totally 20 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;nvas3d, 基于任意录音和室内3D信息合成重建不同听角&#xff08;位置&#xff09;处的新的声音。(from apple cmu) website: htt…

数据结构详细笔记——二叉树

文章目录 二叉树的定义和基本术语特殊的二叉树满二叉树完全二叉树二叉排序树平衡二叉树 二叉树的常考性质完全二叉树的常考性质二叉树的存储结构顺序存储链式存储 二叉树的先中后序遍历先序遍历&#xff08;空间复杂度&#xff1a;O&#xff08;h&#xff09;&#xff09;中序遍…

有奖快来抱走全新HUAWEI WATCH GT4

亲爱的openGauss用户&#xff0c; 为了给您提供更好的社区体验&#xff0c;现诚邀您参与openGauss社区满意度问卷调研。您的每一个宝贵建议都是我们进步的方向。 手机扫描二维码即可填写问卷&#xff0c;请根据您真实的体验情况填写问卷&#xff0c;问卷反馈越真实有效越有机…

vue3写nav滚动事件中悬停在顶部

1. 防抖类Animate, 使用requestAnimationFrame代替setTimeout 也可以使用节流函数, lodash有现成的防抖和节流方法 _.debounce防抖 _.throttle节流 export default class Animate {constructor() {this.timer null;}start (fn) > {if (!fn) {throw new Error(需要执行…

pmp到底有多难考?

单说通过&#xff0c;难度不算特别高&#xff0c;但也有几点难度&#xff1a; 1、试卷难度&#xff1a;是笔试&#xff0c;180道题&#xff0c;题量大&#xff0c;比较机试耗时间&#xff1b; 2、题目难度&#xff1a;题目是中英文对照&#xff0c;可能有翻译不到位的地方&am…

0基础学习PyFlink——事件时间和运行时间的窗口

大纲 定制策略运行策略Reduce完整代码滑动窗口案例参考资料 在 《0基础学习PyFlink——时间滚动窗口(Tumbling Time Windows)》一文中&#xff0c;我们使用的是运行时间(Tumbling ProcessingTimeWindows)作为窗口的参考时间&#xff1a; reducedkeyed.window(TumblingProcess…

第4章_运算符

文章目录 1. 算术运算符1.1 加法与减法运算符1.2 乘法与除法运算符1.3 求模运算符 2. 比较运算符2.1 等号运算符2.2 安全等于运算符2.3 不等于运算符2.4 空运算符2.5 非空运算符2.6 最小值运算符2.7 最大值运算符2.8 BETWEEN AND运算符2.9 IN运算符2.10 NOT IN运算符2.11 LIKE运…

代码随想录算法训练营第三十九天丨 动态规划part02

62.不同路径 思路 动态规划 机器人从(0 , 0) 位置出发&#xff0c;到(m - 1, n - 1)终点。 按照动规五部曲来分析&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j] &#xff1a;表示从&#xff08;0 &#xff0c;0&#xff09;出发&#…

利用win32的GetLastInputInfo函数实现锁屏(C#)

前两天看到群里面讨论这个问题&#xff0c;刚好我们上一家公司的系统也有这个功能&#xff0c;就研究了一下&#xff0c;我们这边实现这个功能的目的如下&#xff1a;当用户长时间不操作系统时&#xff0c;自动退出系统并退回到登录界面&#xff0c;想要使用系统&#xff0c;就…

【数据结构】数组和字符串(十三):链式字符串的基本操作(串长统计、查找、复制、插入、删除、串拼接)

文章目录 4.3 字符串4.3.1 字符串的定义与存储4.3.2 字符串的基本操作&#xff08;链式存储&#xff09;1. 结构体2. 初始化3. 判空4. 串尾添加5. 打印6. 串长统计7. 查找8. 复制9. 插入10. 删除11. 串拼接12. 销毁13. 主函数14. 代码整合 4.3 字符串 字符串(String)是由零个或…

Latex排版SIGGRAPH总结(持续总结中...)

本文学习总结自&#xff1a;How to use the ACM SIGGRAPH / TOG LaTeX template 相关文件&#xff1a;百度网盘 首先解压 “my paper” 中的文件&#xff0c;并用Latex打开mypaper.tex. 多行连等公式 \begin{equation}表示编号公式&#xff0c;\[ \]表示无编号公式 无编号\b…

双轮差速模型机器人通过线速度、角速度计算机器人位姿

已知上一时刻机器人位置P_OLD (x,y,),机器人当前时刻的线速度和角速度&#xff08;v,&#xff09;,短时间内t内&#xff0c;机器人在线性部分和非线性部分的增量为 线性部分&#xff1a; 非线性部分&#xff1a; 由于可能非常小&#xff0c;导致非线性部分数值不稳定&#xf…

【R统计】各式各样的插补法解决数据缺失的问题!

&#x1f482; 个人信息&#xff1a;酷在前行&#x1f44d; 版权: 博文由【酷在前行】原创、需要转载请联系博主&#x1f440; 如果博文对您有帮助&#xff0c;欢迎点赞、关注、收藏 订阅专栏&#x1f516; 本文收录于【R统计】&#xff0c;该专栏主要介绍R语言实现统计分析的…

【计算机视觉】对极几何

文章目录 一、极线约束&#xff08;Epipolar Constraint&#xff09;二、相机标定过的情况三、相机没有标定过的情况四、八点算法&#xff08;eight-point algorithm&#xff09; 我的《计算机视觉》系列参考UC Berkeley的CS180课程&#xff0c;PPT可以在课程主页看到。 在上一…

关于preempt count的疑问

Linux中的preempt_count - 知乎 https://www.cnblogs.com/hellokitty2/p/15652312.html LWN&#xff1a;关于preempt_count()的四个小讨论&#xff01;-CSDN博客 主要是参考这些文章 之前一直认为只要是in_interrupt()返回非0值&#xff0c;那么就可以认为当前在中断上下文。即…

阿昌教你如何优雅的数据脱敏

阿昌教你如何优雅的数据脱敏 Hi&#xff0c;我是阿昌&#xff0c;最近有一个数据脱敏的需求&#xff0c;要求用户可自定义配置数据权限&#xff0c;并对某种类型数据进行脱敏返回给前端 一、涉及知识点 SpringMVCJava反射Java自定义注解Java枚举 二、方案选择 1、需求要求…

Webpack打包图片-js-vue

文章目录 一、Webpack打包图片1.加载图片资源的准备2.认识asset module type3.asset module type的使用4.url-loader的limit效果 二、babel1.为什么需要babel2.babel命令行的使用3.babel插件的使用4.babel的预设preset5.babel-loader6.babel-preset 三、加载Vue文件1.编写App.v…

使用Ansible中的playbook

目录 1.Playbook的功能 2.YAML 3.YAML列表 4.YAML的字典 5.playbook执行命令 6.playbook的核心组件 7.vim 设定技巧 示例 1.Playbook的功能 playbook 是由一个或多个play组成的列表 Playboot 文件使用YAML来写的 2.YAML #简介# 是一种表达资料序列的格式,类似XML #特…

开关电源测试过压保护的测试标准及其方法

过压保护的原理 过压保护是电压超过预定值时降低电压的一种方式&#xff0c;原理是通过电路中的电压检测电路来检测电路中的电压是否超过了设定的阈值&#xff0c;如果超过了阈值&#xff0c;就会触发过压保护器件&#xff0c;使电源断开或使受控设备电压降低&#xff0c;保护电…

网络协议--TCP的交互数据流

19.1 引言 前一章我们介绍了TCP连接的建立与释放&#xff0c;现在来介绍使用TCP进行数据传输的有关问题。 一些有关TCP通信量的研究如[Caceres et al. 1991]发现&#xff0c;如果按照分组数量计算&#xff0c;约有一半的TCP报文段包含成块数据&#xff08;如FTP、电子邮件和U…