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

目录

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> 
相关推荐
瓜牛_gn23 分钟前
mysql特性
数据库·mysql
奶糖趣多多1 小时前
Redis知识点
数据库·redis·缓存
CoderIsArt2 小时前
Redis的三种模式:主从模式,哨兵与集群模式
数据库·redis·缓存
师太,答应老衲吧4 小时前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
Channing Lewis5 小时前
salesforce case可以新建一个roll up 字段,统计出这个case下的email数量吗
数据库·salesforce
毕业设计制作和分享7 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
ketil277 小时前
Redis - String 字符串
数据库·redis·缓存
Hsu_kk8 小时前
MySQL 批量删除海量数据的几种方法
数据库·mysql
编程学无止境8 小时前
第02章 MySQL环境搭建
数据库·mysql
knight-n8 小时前
MYSQL库的操作
数据库·mysql