目录
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
一次性获取多个键的值
使用 incr
或 decr
命令来某个键的值进行递增或递减操作,前提是字符串值必须表示一个整数
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>