redis -- 基本介绍 -- 字符串、列表、集合、有序集合、哈希

2023-09-15 21:54:12

Redis

Redis(Remote Dictionary Server)是一个开源的、高性能的、内存中的数据存储系统

他可以用作数据库缓存和消息队列等各种场景

是目前最热门的NoSQL数据库之一

MySQL的磁盘IO读写速度与内存相比非常慢,在访问量非常大的情况下会遭遇性能瓶颈。如果能够把数据存储在内存中就可以大大提高性能,于是就有了Redis。
Redis主要将数据存储在RAM(随机存取内存)中,这使得读写操作非常快速。但如果需要,它也提供了将数据持久化到磁盘的选项

数据类型: 字符串String、列表List、集合Set、有序集合SortedSet、哈希Hash;消息流Stream、地理空间Geospatial、HyperLogLog、位图Bitmap、位域Bitfield

三种使用方式:
CLI(Command Line Interface) 命令行
API(Application Programming Interface) 应用程序接口,即用python等其他语言通过编写代码的方式来使用redis
CLI(Graphical User Interface) 图形用户界面

Redis优势:
性能高
数据类型丰富,单键值对最大支持512M大小的数据
简单易用,支持所有主流编程语言
支持数据持久化、主从复制、哨兵模式等高可用特性

生存时间(TTL):
TTL(Time To Live)可以为键设置生存时间,数据将在一定时间后自动过期。这个特性通常在缓存场景中使用

Linux安装Redis首先需要安装epel源

yum install epel-release -y
yum install redis -y

启动服务:

服务端
redis-server
客户端
redis-cli

退出:

quit

图形化界面工具:RedisInsight

字符串string

使用 set 命令来设置一个键值对,在命令行输入set之后,就会有相关提示

使用 get 命令获取某个键对应的值

使用 del 删除键值对

使用 exists 命令来查看键值对是否存在,若存在返回值为1,不存在返回值为0

使用 keys 命令查看数据库中有哪些键

使用 flushall 删除所有的键值对

使用 clear 清空屏幕

使用 ttl 来查看键值对的过期时间,如果显示 -1 表示没有设置过期时间,如果显示 -2 表示已经过期了

使用 expire 命令设置过期时间,单位为秒

使用 setex 设置一个带有过期时间的键值对

使用 setnx 只有当键值不存在时才会设置键的值,如果键已经存在,不做任何操作

使用 append 在值的末尾追加

使用 strlen 获取字符串长度

使用 mset 一次性设置多个键值对,使用 mget 一次性获取多个键的值

使用 incrdecr 命令来某个键的值进行递增或递减操作,前提是字符串值必须表示一个整数

redis的键值对区分大小写

redis默认使用字符串来存储数据

redis对于键值对的存储是二进制存储的

进入redis客户端时接 --raw 参数表示以原始的形式来显示内容

# 创建一个键值对
not connected> set name chen
OK
# 获取这个键的值
127.0.0.1:6379> get name
"chen"
# 键值对区分大小写
127.0.0.1:6379> set Name Chen
OK
127.0.0.1:6379> get Name
"Chen"
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> get age
"18"
# 删除键值对
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
# 判断一个键值对是否存在
127.0.0.1:6379> exists name
(integer) 0
127.0.0.1:6379> exists Name
(integer) 1
# 查看所有键值对
127.0.0.1:6379> keys *
1) "age"
2) "Name"
# 字符串存储一般是二进制形式
127.0.0.1:6379> set name 陈
OK
127.0.0.1:6379> get name
"\xe9\x99\x88"
127.0.0.1:6379> quit
# 接 --raw 表示按原来的形式显示,而非二进制
[root@localhost ~]# redis-cli --raw
127.0.0.1:6379> get name
陈
# 查看键值对过期时间,-1 表示没有设置时间
127.0.0.1:6379> ttl name
-1
# 设置键值对的过期时间为10s
127.0.0.1:6379> expire name 10
1
127.0.0.1:6379> ttl name
8
127.0.0.1:6379> ttl name
2
# -2 表示已过期
127.0.0.1:6379> ttl name
-2
127.0.0.1:6379> exists name
0
# 设置一个带有过期时间的键值对
127.0.0.1:6379> setex name 5 陈
OK
127.0.0.1:6379> ttl name
3
127.0.0.1:6379> ttl name
-2
127.0.0.1:6379> set name chen
OK
# 在字符串末尾添加
127.0.0.1:6379> append name 22
6
127.0.0.1:6379> get name
chen22
# 查看某个键对应的值的长度
127.0.0.1:6379> strlen name
6
127.0.0.1:6379> get age
18
# 对整数值进行自增操作
127.0.0.1:6379> incr age
19


列表list

列表中的元素是有序、可重复的

使用 lpush 在列表左侧插入元素,使用 rpush 在列表右侧插入元素

使用 lrange 命令按范围获取列表中的元素,从而实现分页和遍历

使用 lpop 从列表左侧删除元素,使用 rpop 从列表右侧删除元素

使用 ltrim 删除指定范围之外的元素(只保留范围之内的元素)

使用 llen 获取列表长度

使用 lindex 获取指定下标的元素

# 从左插入列表元素
127.0.0.1:6379> lpush lst1 a b
2
# 获取列表所有元素
127.0.0.1:6379> lrange lst1 0 -1
b
a
127.0.0.1:6379> lpush lst2 aaa
1
127.0.0.1:6379> lrange lst2 0 -1
aaa
127.0.0.1:6379> lpush ll a b c d
4
127.0.0.1:6379> lrange ll 0 -1
d
c
b
a
# 从左弹出元素
127.0.0.1:6379> lpop ll 
d
127.0.0.1:6379> lrange ll 0 -1
c
b
a
# 从右插入元素
127.0.0.1:6379> rpush ll e
4
127.0.0.1:6379> lrange ll 0 -1
c
b
a
e
# 缩短列表为指定下标之间的元素
127.0.0.1:6379> ltrim ll 1 2
OK
127.0.0.1:6379> lrange ll 0 -1
b
a
# 查看列表长度(元素个数)
127.0.0.1:6379> llen ll
2
# 查看指定下标的元素
127.0.0.1:6379> lindex ll 1
a

列表的阻塞操作

阻塞操作是指在执行操作时,如果条件不满足,客户端会进入等待状态,直到条件满足或超时才会继续执行

  • BLPOP:阻塞左侧弹出。当指定的列表为空时,BLPOP会阻塞客户端,直到列表中有元素出现或超时
  • BRPOP:阻塞右侧弹出。与BLPOP类似,但是从列表右侧弹出元素

这些阻塞操作通常用于实现队列模型,多个客户端可以在一个队列上等待任务的到来,而不需要轮询检查队列是否为空

集合set

set中的元素是无序且不重复的

使用 sadd 向集合中添加元素,添加失败返回0

使用 smenbers 获取集合中的所有元素

使用 sismember 检查一个元素是否存在于集合中,如果存在则返回1,不存在返回0

使用 srem 删除集合中的元素

使用 sinter 计算多个集合的交集,使用 sunion 计算多个集合的并集,使用 sdiff 计算多个集合的差集

使用 scard 获取集合的大小(元素数量)

使用 srandmember 随机获取集合中的一个或多个元素

使用 smove 将一个元素从一个集合移动到另一个集合

# 向集合里添加元素
127.0.0.1:6379> sadd s1 a b c
3
# 查看集合里的所有元素
127.0.0.1:6379> smembers s1
c
b
a
# 集合中的元素是不重复的
127.0.0.1:6379> sadd s1 a
0
127.0.0.1:6379> smembers s1
c
b
a
# 检查元素a是否在集合中
127.0.0.1:6379> sismember s1 a
1
127.0.0.1:6379> sismember s1 d
0
# 删除元素a
127.0.0.1:6379> srem s1 a
1
127.0.0.1:6379> smembers s1
c
b
127.0.0.1:6379> sadd s2 b c d
3
# s1和s2的交集
127.0.0.1:6379> sinter s1 s2
c
b
# s1和s2的并集
127.0.0.1:6379> sunion s1 s2
d
b
c
# s1与s2的差集
127.0.0.1:6379> sdiff s1 s2

# s2与s1的差集
127.0.0.1:6379> sdiff s2 s1
d
# 集合的大小(元素个数)
127.0.0.1:6379> scard s1
2
# 随机获取集合中的元素
127.0.0.1:6379> srandmember s1 1
c
127.0.0.1:6379> srandmember s1 1
c
127.0.0.1:6379> srandmember s1 1
b
# 把集合s2中的元素d移到s1中
127.0.0.1:6379> smove s2 s1 d
1
127.0.0.1:6379> smembers s1
d
c
b
127.0.0.1:6379> smembers s2
c
b

有序集合sorted set

与普通集合不同,有序集合中的每个元素都关联着一个分数(score),分数可以是任何浮点数值,默认按照分数从小到大排序

有序集合是唯一的,但分数是可以重复的。如果多个元素具有相同的分数,则按照成员的字典顺序排序

使用 zadd 向有序集合中添加一个元素

使用 zrange 按排名获取有序集合中的成员

使用 zscore 查看指定成员的分数

使用 zrank 查看指定成员的排名(返回下标值),使用 zrevrank 逆序排序

使用 zrem 删除一个或多个成员

使用 zincrby 为指定成员增加或减少分数

使用 zcard 获取有序集合的大小(成员数量)

使用 zrangebyscore 按分数范围获取成员,使用 zrevrangebyscore 逆序排序

# 向有序集合中添加成员,注明成员分数
127.0.0.1:6379> zadd score 85 zhang 60 li 90 wang 77 chen
4
# 按排名获取有序集合中的成员
127.0.0.1:6379> zrange score 0 -1
li
chen
zhang
wang
127.0.0.1:6379> zrange score 0 -1 withscores
li
60
chen
77
zhang
85
wang
90
# 查看指定成员分数
127.0.0.1:6379> zscore score chen
77
# 查看指定成员的排名(返回下标值)
127.0.0.1:6379> zrank score chen
1
127.0.0.1:6379> zrevrank score chen
2
# 删除一个成员
127.0.0.1:6379> zrem score chen
1
127.0.0.1:6379> zrange score 0 -1
li
zhang
wang
# 修改指定成员的分数
127.0.0.1:6379> zincrby score 10 li
70
127.0.0.1:6379> zincrby score 10 li
80
127.0.0.1:6379> zincrby score -10 li
70
127.0.0.1:6379> zcard score
3
# 按分数范围获取成员
127.0.0.1:6379> zrangebyscore score 70 80 withscores
li
70
127.0.0.1:6379> 

哈希hash

哈希,是一个字符类型的字段和值的映射表,简单来说就是一个键值对的集合

redis允许在hash中嵌套另一个hash

使用 hset 向hash中添加一个键值对,使用 hmset 设置多个键值对

使用 hget 获取hash中的某个键值对,使用 hmget 获取多个键值对,使用 hgetall 获取一个hash中的所有键值对

使用 hdel 删除hash中的某个键值对

使用 hexists 判断某个键值对是否存在,若存在则返回1,不存在返回0

使用 hkeys 获取hash中的所有key值,使用 hvals 获取hash中的所有value值

使用 hlen 获取hash中键值对的数量

# 向hash中添加一个键值对
127.0.0.1:6379> hset chen age 18
1
127.0.0.1:6379> hset chen sex female
1
127.0.0.1:6379> hget chen age
18
# 获取所有键值对
127.0.0.1:6379> hgetall chen
age
18
sex
female
# 删除键值对
127.0.0.1:6379> hdel chen sex
1
127.0.0.1:6379> hgetall chen
age
18
# 判断键值对是否存在
127.0.0.1:6379> hexists chen age
1
127.0.0.1:6379> hexists chen sex
0
# 查看所有的键
127.0.0.1:6379> hkeys chen
age
# 查看所有的值
127.0.0.1:6379> hvals chen
18
# 查看键值对个数
127.0.0.1:6379> hlen chen
1
127.0.0.1:6379> 

更多推荐

springcloud3 分布式事务实现逻辑思想2

一分布式事务逻辑1.1CAP理论CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、Availability(可用性)、Partitiontolerance(分区容错性)这3个基本需求,最多只能同时满足其中的2个。总结:1.2CAP的应用场景假如现在有这样的场景:用户访问了N1,修改了

【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题

前言💓作者简介:加油,旭杏,目前大二,正在学习C++,数据结构等👀💓作者主页:加油,旭杏的主页👀⏩本文收录在:再识C进阶的专栏👀🚚代码仓库:旭日东升1👀🌹欢迎大家点赞👍收藏⭐加关注哦!💖学习目标:在上一篇博客中,我们学习了回调函数,以及怎么使用qsort函数去排序;那么在这一篇博客中,我们来更加详细

HTTP各版本差异

HTTP1.0无法复用连接HTTP1.0为每个请求单独新开一个TCP连接#mermaid-svg-9N3exXRS4VvT4bWF{font-family:"trebuchetms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-9N3e

基于Matlab实现图像分割技术(附上源码+图像)

Matlab是一种功能强大的编程语言和开发环境,被广泛应用于图像处理和计算机视觉领域。图像分割是图像处理中的重要技术之一,它将图像分割成若干个具有相似特征的区域,以便更好地理解和处理图像。在Matlab中,实现图像分割可以使用多种方法和函数。下面将介绍几种常用的图像分割技术及其在Matlab中的实现。基于阈值的分割:基

LeetCode 2591. 将钱分给最多的儿童

【LetMeFly】2591.将钱分给最多的儿童力扣题目链接:https://leetcode.cn/problems/distribute-money-to-maximum-children/给你一个整数money,表示你总共有的钱数(单位为美元)和另一个整数children,表示你要将钱分配给多少个儿童。你需要按照

【AI+医疗】AI在医疗影像设备工作周期中的应用探索

导读随着人工智能技术的飞速发展,越来越多的领域开始与人工智能技术深度融合,产生了一种新型的技术模式——AI+。AI+是指将人工智能技术与其他领域的技术或应用进行结合,在提高效率、精度和创新能力的同时,也为人工智能技术的发展提供了更多的应用场景和数据支持。其中,AI+医疗是人工智能技术与医疗领域的深度融合,通过结合人工智

代码随想录算法训练营第56天 | ● 583. 两个字符串的删除操作 ● 72. 编辑距离 ● 动态规划之编辑距离总结篇

文章目录前言一、583.两个字符串的删除操作二、72.编辑距离三、动态规划之编辑距离总结篇总结前言一、583.两个字符串的删除操作两种思路:1.直接动态规划,求两个字符串需要删除的最小次数2.采用子序列的和-最长公共子序列。思路一分析如下:动规五部曲,分析如下:确定dp数组(dptable)以及下标的含义dp[i][j

频频刷屏朋友圈,白酒如何越来越年轻化?来聊聊白酒企业数字化

最近,某白酒品牌频频吸引大众眼球,白酒与咖啡、巧克力等联名衍生品一经推出便掀起热潮。某商品由于太过火爆,甚至一度售罄下架。不得不说,我国拥有超大规模内需市场,消费潜力巨大。当前,创新消费场景加上数字化融合转型,成为酒企品牌开疆扩土、逆势增长的重要途径。如今越来越多的酒企开始拥抱数字化,建立涵盖白酒品系开发、酒体设计、基

如何用CRM软件系统管理企业客户

客户对企业的重要程度不言而喻。可以说,客户是企业收益的来源和可持续发展的基础,客户的转化率和保留率也与企业的发展息息相关。企业想要成功转化客户,需要经历客户跟踪、挖掘、维护等一系列过程。下面我们来说说,CRM客户管理系统如何管理企业客户?1、CRM系统能从不同渠道获取客户CRM系统可以实现客户信息获取和访问、高效转化和

Js中一些数组常用API总结

前端面试题库(面试必备)推荐:★★★★★地址:前端面试题库【国庆头像】-国庆爱国程序员头像!总有一款适合你!前言Js中数组是一个重要的数据结构,它相比于字符串有更多的方法,在一些算法题中我们经常需要将字符串转化为数组,使用数组里面的API进行操作。本篇文章总结了一些数组中常用的API,我们把它们分成两类,一类是会改变原

数据信息会有哪些风险,云数据库如何保护?

数据信息安风险是多种多样的,那么,云数据库如何规避并保护数据信息安全?今天安策带大家具体来了解数据信息会有哪些风险,云数据库将如何保护:数据泄露:不管是内部人员疏忽,还是恶意攻击、系统漏洞等等原因,数据泄露会导致敏感信息的暴露,损害其品牌的声誉和利益。数据损坏:损坏原因主要由自然灾害、人为或恶意攻击构成,从而导致无法预

热文推荐