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
使用 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
列表中的元素是有序、可重复的
使用 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中的元素是无序且不重复的
使用 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
与普通集合不同,有序集合中的每个元素都关联着一个分数(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>
哈希,是一个字符类型的字段和值的映射表,简单来说就是一个键值对的集合
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>